在数据库中扩展类

3

我正在进行一个PHP项目,需要存储有关各种建筑物的信息,并根据建筑物的类型存储不同类型的信息:

Class Building {
    var $location
    var $name
}

Building类将被House和Office等类扩展,因此类将如下所示(只是一个示例)

Class House Extends Building {
    var $numRooms;
    var $numBathrooms;
}

Class Office extends Building {
    var $offices;
    var $sqfoot;
}

问题在于,这应该如何在数据库中表示(我使用的是MySQL,如果有关系)。我应该使用建筑表来存储位置和名称,然后创建一个表来保存每个其他类的“扩展”变量吗?还是为每个类创建一个表?或者建筑表是否应该具有所有其他类中可能存在的变量列?

这是我的一个副本:http://stackoverflow.com/questions/836383/how-do-i-represent-object-classification-hierarchy-in-a-rdbms。请查看那里的答案。 - Itay Moav -Malimovka
2个回答

3
我强烈建议您查看Martin Fowler定义的类表继承模式。
该设计模式创建了一个单一的表,其中包含所有建筑物共有的数据,并需要一个单独的表来存储与特定类型建筑物相关的任何数据。我发现有用的一件事是在父表中存储一个“类型”字段,这样您就可以知道您拥有的实体类型,而不必搜索相应的子表记录。
我建议,除非您有非常具体、明确定义的原因使用实体属性设计,否则应避免使用它。首先,当使用此类型的设计时,无法利用数据库上的约束来控制所需的输入和允许的值类型。另外,这将极大地减慢需要从这些类型的字段中提取数据的任何查询,因为存储在这些字段中的数据无法像通常那样进行索引。

1

如果想要避免使用大量的表格和字段来复杂化事情,我会简单地创建一个建筑物的单一表格,然后添加两个数据字段,一个定义建筑物的类型(例如:房子、办公室等),另一个是扩展类对象数据的序列化。

但我认为最好的方法实际上取决于您需要对数据库进行哪种查询。例如,如果您需要查询数据库以选择所有“房屋”,并且“$numRooms > 5”,则序列化可能不是最佳选项...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接