扩展数据库中的类

时间:2009-05-17 18:08:12

标签: php mysql database-design

我正在开发一个需要存储各种建筑物信息的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,如果重要)。我应该使用构建表来存储位置和名称,然后为每个其他类创建一个表来保存“扩展”变量吗?或者我为每个班级创建一个表格?或者构建表是否包含可以在其他类中的所有变量的列?

2 个答案:

答案 0 :(得分:2)

我强烈建议您查看Martin Fowler定义的Class Table Inheritance模式。

此设计模式创建一个表,用于保存所有建筑物共有的数据,然后需要一个单独的表来表示与特定类型的建筑物相关的任何数据。我觉得有用的一件事是在父表中存储一个'type'字段,这样你就可以知道你拥有什么类型的实体而无需在子表中搜索相应的记录。

我建议除非你有一个非常具体,定义明确的理由来使用实体 - 属性设计,否则你就避免使用它。首先,当使用这种类型的设计来利用数据库上的约束来控制需要什么输入以及允许哪些类型的值时,这是不可能的。另一方面,它会大大减慢需要从这些类型的字段中提取数据的任何查询,因为存储在这些字段中的数据无法像通常那样被编入索引。

答案 1 :(得分:1)

如果我的想法是不使用一堆表和字段使事情变得复杂,我只需为Building创建一个表,然后为数据添加两个字段,一个将定义构建的类型(即:house,office, etc ...)另一个是扩展类对象数据的序列化。

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