首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据库继承的技术?

数据库继承的技术?
EN

Stack Overflow用户
提问于 2008-12-22 16:22:37
回答 3查看 21.4K关注 0票数 32

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

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

代码语言:javascript
复制
Person -> Employee -> Manager
                   -> Team lead
                   -> Developer
       -> Customer -> PrivilegedCustomer
                   -> EnterpriseCustomer

设计数据库的可用技术有哪些?每种方法的优缺点?

附注:我搜索并发现了几个关于数据库继承的问题,但大多数都是关于更改为本地支持它的数据库引擎。但是假设我坚持使用SQL Server2005...我有什么选择?

EN

回答 3

Stack Overflow用户

发布于 2008-12-22 16:30:31

三种常见策略:

  1. 为层次结构中的每个类创建一个表,其中包含为每个类定义的属性和一个指向顶级超类表的外键。因此,您可能有一个vehicle表,其中包含carairplane等具有vehicle_id列的其他表。这里的缺点是,您可能需要执行大量连接,才能得到一个类类型。
  2. 为包含所有属性的层次结构中的每个类创建一个表。这可能会变得很棘手,因为除非使用序列之类的东西,否则在所有表中维护一个公共ID并不容易。超类类型的查询需要对整个类层次结构的question.
  3. Create中的所有表进行联合。这消除了联接和联合,但要求所有类属性的所有列都在一个表中。您可能需要将大多数列保留为空,因为某些列不适用于不同类型的记录。例如,vehicle表可能包含一个名为wingspan的列,该列对应于Airplane类型。如果将该列设置为NOT NULL,那么插入到表中的任何Car实例都将需要wingspan的值,即使值NULL可能更有意义。如果您将该列保留为空,则可以使用check约束来解决此问题,但它可能会变得很糟糕。(Single Table Inheritance)
票数 28
EN

Stack Overflow用户

发布于 2011-10-19 07:30:09

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

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

无论如何,我想我应该分享一些知识,因为我们已经经历了这个问题。

票数 7
EN

Stack Overflow用户

发布于 2008-12-22 17:26:45

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

它就是NHibernate文档。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/386652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档