【问题标题】:DB design for two similarly structured objects两个结构相似的对象的数据库设计
【发布时间】:2012-02-17 12:27:26
【问题描述】:

我在 PHP 中编码两个数据对象,它们非常相似,但应保存在两个单独的表中。因此,我将它们编码为超类的子类。

超类将包含两个类的大部分重复函数,用于访问数据库表中的数据。而每个类的具体功能/错误检查/数据库访问功能将在子类中实现。

如何在数据库中实现这一点?我正在考虑超类的需要表。

设计一: TableA 和 TableB 将引用 TableSuperClass,所有常见的结构化数据都将链接到 TableSuperClass 而不是子类(TableA 和 TableB)本身。给出 TableA、TableB、TableSuperClass 和 CommonData。使用 TableA 和 TableB 存储特定于 A/B 类的内容。

设计二: TableA 和 TableB 将具有几乎相同的结构,每个都有一些额外的列以满足其特定需求。超级班将没有桌子。 A 和 B 共有的数据将存储在两个单独的表中。所以本质上是TableA、TableB、TableAData、TableBData

这两种设计的优缺点是什么?

谢谢

【问题讨论】:

  • 在设计一中,为什么有一个 CommonData 表?那不是 TableSuperClass 的一部分吗?在设计二中,如果 TableAData 和 TableBData 相同,为什么会有 CommonData 和“此记录与表 A 相关,id = 10”的组合键。最后,我认为这实际上取决于您查询的数据和性质 - 如果您能提供更多的洞察力,我们可能会给您更好的指导。两种方式都有各自的优点
  • 考虑通读关于数据库对象继承的 Doctrine 2 手册:docs.doctrine-project.org/projects/doctrine-orm/en/2.1/…。不是说要使用 Doctrine 2,尽管它很酷。但我认为它可能会给您一些好主意,并且实际上讨论了您的两种方法以及更多方法。

标签: php database


【解决方案1】:

您引用了一种称为数据库多态性的技术,有时是类表继承,否则就沿着这些思路。通常,它是使用您的第一个设计实现的,但有 3 个表:一个具有公共列的公共表,以及一个具有自己独特列的每个“子类”的表。这些通常与公用表上的类型列连接在一起,其中每个子类将在代码中定义其自己的类型值,并坚持仅使用该值与公用表及其表进行连接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 2011-11-23
    相关资源
    最近更新 更多