数据库inheritance技术?
什么是提示/技巧,当你需要inheritance类inheritance关系数据库不支持inheritance?
说我有这个经典的例子:
Person -> Employee -> Manager -> Team lead -> Developer -> Customer -> PrivilegedCustomer -> EnterpriseCustomer
有什么可用的技术来devise数据库? 每个的利弊?
PS我已经search并发现了几个有关数据库inheritance的问题,但大多数是关于更改为本地支持它的数据库引擎。 但是,让我们说,我坚持与SQL Server 2005 …我有什么select?
三个常用策略:
-
为层次结构中的每个类创build一个表,其中包含为每个类定义的属性和一个返回到顶级超类表的外键。 所以你可能有一个
vehicle
和其他表,如car
和airplane
有一个vehicle_id
列的vehicle
表。 这里的缺点是你可能需要执行很多连接才能获得一个类的types。 -
为包含所有属性的层次结构中的每个类创build一个表。 这一点可能会变得棘手,因为在所有的表格中保持一个共同的ID并不容易,除非你使用的是一个序列。 对超types的查询将需要联合所有有问题的表。
-
为整个类层次结构创build一个表。 这消除了连接和联合,但要求所有类属性的所有列都在一个表中。 您可能需要将大多数列保留为空,因为某些列不适用于不同types的logging。 例如,
vehicle
表可能包含一个对应于Airplane
types的称为wingspan
的列。 如果你使这个列不为NULL,那么插入到表中的任何一个Car
实例都将需要一个wingspan
值,即使NULL
可能更有意义。 如果您将列置空,您可能可以通过检查约束来解决这个问题,但可能会变得很糟糕。 ( 单表inheritance )
在某些情况下要小心数据库的inheritance – 我们在我们的审计策略的应用程序中实现了它,最终导致性能瓶颈/噩梦。
问题是我们使用的基本表只是插入,而且快速变化,所以我们最终导致了全局的死锁。 我们目前正计划把这些分开放到自己的桌子上,因为在15张不同的表格里面有相同的列,而不是表演的噩梦是非常值得的。 entity framework不一定能够有效地处理inheritance(这是微软的一个已知问题)。
无论如何,只是因为我们在这个问题上已经经历过绞刑架,所以我想分享一些知识。
下面的链接中的inheritance映射也讨论了这一点。 http://nhibernate.info/doc/nh/en/index.html#inheritance
这是NHibernate文档。