32

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

假设我有这个经典的例子:

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

设计数据库的可用技术有哪些?各有优劣?

ps 我已经搜索并发现了几个关于数据库继承的问题,但大多数都是关于更改为原生支持它的数据库引擎。但是假设我坚持使用 SQL Server 2005……我有什么选择?

4

3 回答 3

28

三种常用策略:

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

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

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

于 2008-12-22T16:30:31.193 回答
7

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

问题是我们使用的基表只是插入并且快速变化,所以我们最终得到的是到处都是死锁。我们目前正计划将这些拆分成自己的表,因为在 15 个不同的表中拥有相同的列而不是性能噩梦,这是非常值得的。实体框架不一定有效地处理继承这一事实也加剧了这种情况(这是 Microsoft 的一个已知问题)。

无论如何,我只是想我会分享一些知识,因为我们已经在这个问题上经历了痛苦。

于 2011-10-18T23:30:08.680 回答
5

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

它是 NHibernate 文档。

于 2008-12-22T17:26:44.527 回答