我有一些表具有不同的结构,但包含相同的数据(在示例中它是名称和姓氏)。
编辑:演示结构小提琴 - http://sqlfiddle.com/#!2/cce568
但是现在我需要创建一些集合表来存储这些信息+更多细节(例如日期时间,公司名称,职位等)。根据剩余字段的上下文,此集合表可以包含多个实体。
是否有一些模式如何存储这个集体表?根据Bill Carwin的帖子(https://stackoverflow.com/a/562030/1092627),我可以将所有这些表加入到一个表中,但如果我需要将一些信息直接添加到此表中,我该怎么办?
提前感谢您的意见。
答案 0 :(得分:7)
Craig Larman的书“将UML与模式一起应用”描述了这个问题的3种常见解决方案。
您的示例并不是特别有用 - 没有合理的理由在数据库中使用3种不同的方式管理人名(尽管由于数据导入/导出怪异而经常发生这种情况)。
但是,有一个“人”实体可能是一个雇员(有employee_id),一个联系人(有一个到潜在客户表的链接)或一个客户(有一个customer_id和链接到订单表)。
在Larman的书中,他给出了3个解决方案。
一张表来统治所有 在这里,您创建一个包含所有已知列的表。这会创建一个混乱的表,并且负责了解将每个子类持久化到应用程序层的规则 - 数据库不会强制客户拥有customer_id。但是,它使连接更容易 - 任何需要链接到一个人的表都可以链接到人员表。
超类表 这通过将公共属性提取到单个表中来清理事物 - 例如“person” - 并将子类特定的字段推送到子类表。因此,您可能将“person”作为超类表,并将“contact”,“employee”和“customer”表与特定的子类数据相关联。子类表有一个“person_id”列,用于链接回超类表。这更复杂 - 它通常在检索数据时需要额外的连接 - 但也更不容易出错 - 您不会因为为“employee”写入无效属性的错误而意外破坏数据模型。
每个子类的表 - 这就是您所描述的内容。它在数据模型中引入了相当多的重复,并且您经常使用条件连接 - “如果人类型= y则加入表x”,这会使数据访问代码变得棘手。