单表继承

时间:2008-10-14 11:20:04

标签: ruby-on-rails database-design single-table-inheritance

question of mine on DB design的回答提出了一种称为单表继承的东西。我已经对此进行了一些搜索,但我似乎无法找到相关信息。

基本上我似乎从中理解的是,你有一个包含所有字段的大表,还有一个类型字段 - 然后你的ORM层使用type字段为你提供不同的对象视图。这是对的吗?

更重要的是,单表继承是一种“认可”的数据库设计技术吗?我的意思是说使用它是“明智的”吗?使用它也是安全的,还是会导致问题?

另一个问题是它在rails中的效果如何?我从rails找到了一些引用 - 但它是否以非传统的方式做事来引起问题?

任何帮助都非常感激。

7 个答案:

答案 0 :(得分:5)

这是个好主意吗?这取决于。它违反了规范化,因为表没有单一用途。当您第n次扩展基类时会发生什么?您必须向表中添加列。大多数现代数据库都没有问题,因为你可以修改表,但是重构和删除类呢。现在你有了没有目的的列。

经验法则 - 如果大部分设计已经完成,那么它可能是安全的。如果设计经常变化 - 您还有其他问题,需要锁定用例/用户要求。 (是的,不是真正的XP友好)

我不知道Rails效果。

答案 1 :(得分:1)

STI是一种处理面向对象思维和面向数据库思维不匹配的方法。它允许合理地表示数据库中的信息以及对象模型中的不同表示。

例如,我有一个应用程序,其中我的每个产品都包含一个或多个费用,每个费用的计算方式略有不同。在我的对象模型中,我希望有一个Fee类的子类,每个类都知道如何计算自己。我不是真的希望每个费用类型都有一个表:所以我创建费用作为基类和费用作为表,其中包含所有子类型所需的所有字段的并集,加上“类型”列,其值对应于相关子类的名称。 ActiveRecord此后处理管道。

答案 2 :(得分:1)

简而言之,单表继承(STI)是一种允许将OOP继承关系映射到数据库的设计模式。如果从ActiveRecord模型对象定义任何子类,则应考虑STI。

STI(最初?)记录在Martin Fowler的“企业应用程序架构模式”一书中,并在DHH的规范Rails书籍“使用Rails进行敏捷Web开发”(我认为第18.4节)中有所描述。我推荐你这些书因为它们提供了比我希望在这个领域做得更好的解释。

我强烈反对在www.matthewpaulmoore.com(由robintw在这个帖子中链接)表达的观点,STI本质上是一件坏事。这似乎是一种有点天真的观点,它对OOP继承的使用进行了折扣。我已经使用STI在Rails中创建了一些优雅的解决方案,但我想你可以滥用任何设计模式。

答案 3 :(得分:0)

明确的reference。它允许单个表存储具有公共基类的多个对象。

Ruby on Rails使用名为Active Record的库。这是一个支持STI的常见Ruby框架。

答案 4 :(得分:0)

我只能从(新)ADO实体框架角度讲,其中包括每个类型的表(TPT)功能。

Here是介绍核心概念(使用实体框架)的一系列博客文章,其中还有一篇MSDN论文here

使用nHibernate进行TPT时似乎也有一些指导,它位于here

这个链接解释了table-per-type inheritance in SQL Server。这似乎有一个很好的总结和概念介绍。

我不确定它会对Rails产生什么影响。

答案 5 :(得分:0)

答案 6 :(得分:0)

一般来说,我发现它很有用,但是I've encountered some bugs

该链接中的示例可以提供有关如何使用它的有用图片。