数据库继承技术?

时间:2008-12-22 16:22:37

标签: database database-design class-table-inheritance

当您需要将具有继承的类持久保存到不支持继承的关系数据库时,有哪些提示/技巧?

说我有这个经典的例子:

Person -> Employee -> Manager
                   -> Team lead
                   -> Developer
       -> Customer -> PrivilegedCustomer
                   -> EnterpriseCustomer

设计数据库的可用技术有哪些?每个人的利弊?

P.S。我搜索并发现了几个关于数据库继承的问题,但大多数问题都是关于更改为本机支持它的数据库引擎。但是,让我说我坚持使用SQL Server 2005 ......我的选择是什么?

3 个答案:

答案 0 :(得分:27)

三种常见策略:

  1. 为层次结构中的每个类创建一个表,其中包含为每个类定义的属性以及返回顶级超类表的外键。因此,您可能拥有vehicle表,其中包含carairplane等其他表格,其中包含vehicle_id列。这里的缺点是你可能需要执行大量的连接才能获得一个类类型。

  2. 为层次结构中包含所有属性的每个类创建一个表。这个可能会变得棘手,因为除非你使用像序列这样的东西,否则在所有表中维护一个公共ID并不容易。对超类类型的查询将需要针对所有相关表的联合。

  3. 为整个类层次结构创建一个表。这消除了连接和联合,但要求所有类属性的所有列都在一个表中。您可能需要将大多数列保留为可空,因为某些列不适用于其他类型的记录。例如,vehicle表可能包含一个名为wingspan的列,该列对应于Airplane类型。如果您将此列设为NOT NULL,那么插入表中的Car的任何实例都需要wingspan的值,即使值NULL可能更有意义。如果你让列可以为空,你可以通过检查约束解决这个问题,但它可能会变得很丑陋。 (Single Table Inheritance

答案 1 :(得分:6)

在某些情况下要小心数据库继承 - 我们在审计策略的应用程序中实现了它,我们最终遇到了性能瓶颈/噩梦。

问题是我们使用的基表只是插入并且快速变化,所以我们最终得到的是整个地方的死锁 all 。我们目前正计划将它们分成自己的表格,因为在15个不同的表格中使用相同列而不是性能噩梦的头痛是值得的。实体框架不一定有效地处理继承(这是微软已知的问题),这也加剧了这一点。

无论如何,只是因为我们已经在这个问题上经历了一段时间,所以我会分享一些知识。

答案 2 :(得分:5)

第8章继承在以下链接中的映射也讨论了这一点。 http://nhibernate.info/doc/nh/en/index.html#inheritance

这是NHibernate文档。