【问题标题】:Extending classes in the database在数据库中扩展类
【发布时间】:2009-05-17 18:08:11
【问题描述】:

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

【问题讨论】:

标签: php mysql database-design


【解决方案1】:

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

此设计模式创建了一个表,其中包含所有建筑物共有的数据,然后需要一个单独的表来存储与特定类型的建筑物相关的任何数据。我觉得有帮助的一件事是在父表中存储一个“类型”字段,这样您就知道自己拥有什么类型的实体,而无需在子表中搜索相应的记录。

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

【讨论】:

    【解决方案2】:

    如果我们的想法是不让一堆表格和字段使事情复杂化,我只需为 Building 创建一个表格,然后为数据添加两个字段,其中一个将定义建筑物的类型(即:房屋、办公室、等等...)另一个是扩展类对象数据的序列化。

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

    【讨论】:

      猜你喜欢
      • 2011-04-18
      • 2014-12-14
      • 2011-12-10
      • 2011-10-16
      • 1970-01-01
      • 2011-12-11
      • 1970-01-01
      • 2012-10-13
      • 2017-11-21
      相关资源
      最近更新 更多