php - 扩展数据库中的类

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

最佳答案

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

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

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

关于php - 扩展数据库中的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/875116/

相关文章:

database - 您将如何在数据库模式中表示哈希表集合?

java - Hibernate - 学生评分系统。需要注释方面的帮助

Javascript 数组不带引号

java - 字符串到日期的准备语句绑定(bind)

mysql - SQL 子查询和 ORDER BY

mysql - Google CloudSQL 第二代创建功能不起作用

database - "historical"数据的数据设计与实践

php - 如何将 PHP 中的 IP 地址作为二进制字符串进行比较?

javascript - 如何将幻灯片范围插入mysql?

php - 查找类别的mysql查询