当前位置:  开发笔记 > 前端 > 正文

数据库继承技术?

如何解决《数据库继承技术?》经验,为你挑选了3个好方法。

什么是提示/技巧,当你需要与继承,不支持继承关系数据库持久化类?

说我有这个经典的例子:

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

有哪些设计数据库的技术?各有利弊?

PS我已经搜查,发现有关数据库继承的几个问题,但大多数是有关更改到支持它本身数据库引擎.但是,让我说我坚持使用SQL Server 2005 ......我的选择是什么?



1> cliff.meyers..:

三种常见策略:

    为层次结构中的每个类创建一个表,该表包含为每个类定义的属性以及返回顶级超类表的外键.所以你可能有一个vehicle像其他表一样的表,car并且airplane有一个vehicle_id列.这里的缺点是你可能需要执行大量的连接才能获得一个类类型.

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

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


对于查询复杂性#3听起来最好.此外,在某些DBMS(如Postgres)中,您可以通过检查约束为每个特定子类型强制执行非null,即使这些列都可以为空.

2> jjm340..:

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

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

无论如何,只是想到我已经分享了一些知识,因为我们已经在这个问题上经历了扭曲.



3> Ken Yao..:

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

这是NHibernate文档.

推荐阅读
无名有名我无名_593
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有