多态式SQL数据库表结构

JCZ*_*JCZ 2 mysql sql polymorphism

我有一些具有不同结构的表,但包含相同的数据(在示例中它是名称和姓氏).

在此输入图像描述

编辑:演示结构小提琴 - http://sqlfiddle.com/#!2/cce568

但是现在我需要创建一些集合表来存储这些信息+更多细节(例如日期时间,公司名称,职位等).根据剩余字段的上下文,此集合表可以包含多个实体.

有一些模式如何存储这个集体表,好吗?根据Bill Carwin的帖子(/sf/answers/39342131/),我可以将所有这些表加入到一个表中,但如果我需要将一些信息直接添加到此表中,我该怎么办?

提前感谢您的意见.

Nev*_*uyt 7

Craig Larman的书"将UML与模式一起应用"描述了这个问题的3种常见解决方案.

您的示例并不是特别有用 - 没有合理的理由在数据库中有3种不同的方法来管理人名(尽管由于数据导入/导出怪异而经常发生这种情况).

但是,通常会有一个"人"实体可能是员工(有employee_id),联系人(带有到潜在客户表的链接)或客户(带有customer_id和指向订单表的链接) .

在Larman的书中,他给出了3个解决方案.

一个表来统治它们 在这里,您创建一个包含所有已知列的表.这会创建一个混乱的表,并推动了解将每个子类持久化到应用程序层的规则的责任 - 数据库不会强制客户需要拥有customer_id.但是,它使连接更容易 - 任何需要链接到一个人的表都可以链接到人员表.

超类表 这通过将公共属性提取到单个表中来清理事物 - 例如"人" - 并将子类特定字段推送到子类表.因此,您可能将"person"作为超类表,并将"contact","employee"和"customer"表与特定的子类数据相关联.子类表有一个"person_id"列,用于链接回超类表.这更复杂 - 它通常在检索数据时需要额外的连接 - 而且更不容易出错 - 您不会因为为"employee"写入无效属性的错误而意外破坏数据模型.

每个子类的表 - 这是您所描述的.它在数据模型中引入了相当多的重复,并且您经常使用条件连接 - "如果人类型= y则加入表x",这会使数据访问代码变得棘手.