扩展类数据库

问题描述:

我就需要存储有关各种建筑物的信息,并存储取决于建筑的类型,不同类型的信息PHP项目的工作:扩展类数据库

的建筑类将是通过类,比如,众议院和Office这样的类看起来像这样(只是一个例子)

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

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

的问题是,如何把这个数据库中表示(使用MySQL IM,如果它事项)扩展。我是否应该使用建筑物表格来存储位置和名称,然后为每个其他类别创建一个表格来存放“扩展”变量?或者我为每个班级创建一个表格?或者建筑物表格是否应该包含所有其他类别变量的列?

+0

这是作为(我的)重复[http://*.com/questions/836383/how-do-i-represent-object-classification-hierarchy-in-a-rdbms](http://* .com/questions/836383/how-do-i-represent-object-classification-hierarchy-in-a-rdbms) 检查那里的答案。 – 2009-05-17 18:29:10

我强烈建议您将Class Table Inheritance模式看作由Martin Fowler定义。

此设计模式创建一个表,其中包含所有建筑物通用的数据,然后需要一个单独的表来处理与特定类型建筑物相关的任何数据。有一件事我觉得很有帮助,就是在父表中存储一个'type'字段,这样你就可以知道你有什么类型的实体,而不必在子表中搜索对应的记录。

我会建议,除非你有一个非常明确,明确的理由来使用实体属性设计,你避免它。一方面,使用这种类型的设计利用数据库上的约束来控制需要什么输入以及允许哪些类型的值时,变得不可能。另一方面,由于存储在这些字段中的数据不能像您通常那样编入索引,因此会大大减慢需要从这些类型的字段中提取数据的查询。

如果想法不是使用一堆表和字段复杂化事情,我会简单地为Building创建一个表,然后为这些数据添加两个字段,其中一个可以定义建筑物的类型(即:房屋,办公室等等......)另一个是扩展类对象数据的序列化。

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