什么是提示/技巧,当你需要与继承,不支持继承关系数据库持久化类?
说我有这个经典的例子:
Person -> Employee -> Manager -> Team lead -> Developer -> Customer -> PrivilegedCustomer -> EnterpriseCustomer
有哪些设计数据库的技术?各有利弊?
PS我已经搜查,发现有关数据库继承的几个问题,但大多数是有关更改到支持它本身数据库引擎.但是,让我说我坚持使用SQL Server 2005 ......我的选择是什么?
三种常见策略:
为层次结构中的每个类创建一个表,该表包含为每个类定义的属性以及返回顶级超类表的外键.所以你可能有一个vehicle
像其他表一样的表,car
并且airplane
有一个vehicle_id
列.这里的缺点是你可能需要执行大量的连接才能获得一个类类型.
为包含所有属性的层次结构中的每个类创建一个表.这个可能会变得棘手,因为除非你使用像序列这样的东西,否则在所有表中维护一个公共ID并不容易.对超类类型的查询将需要针对所讨论的所有表的联合.
为整个类层次结构创建一个表.这消除了连接和联合,但要求所有类属性的所有列都在一个表中.您可能需要将大多数列保留为可空,因为某些列不适用于其他类型的记录.例如,vehicle
表可能包含一个wingspan
与该Airplane
类型对应的列.如果你使这个列NOT NULL,那么Car
插入表中的任何实例都需要一个值,wingspan
即使值NULL
更有意义.如果你让列可以为空,你可以通过检查约束解决这个问题,但它可能会变得很难看.(单表继承)
在某些情况下要小心数据库继承 - 我们在我们的审计策略应用程序中实现了它,最终我们遇到了性能瓶颈/噩梦.
问题是,我们所使用的基表中插入只和迅速变化的所以我们结束了被死锁所有的地方.我们目前正计划将它们分成自己的表格,因为在15个不同的表格中使用相同的列而不是性能噩梦是非常值得的.实体框架不一定有效地处理继承(这是微软已知的问题),这也加剧了这一点.
无论如何,只是想到我已经分享了一些知识,因为我们已经在这个问题上经历了扭曲.
第8章继承在以下链接中的映射也讨论了这一点.http://nhibernate.info/doc/nh/en/index.html#inheritance
这是NHibernate文档.