我应该使用STI还是多态模型?

时间:2013-05-19 21:54:41

标签: ruby-on-rails ruby ruby-on-rails-3

我有两个模型FUTUREMAPMILESTONE

FUTUREMAP

class Futuremap < ActiveRecord::Base
  attr_accessible :name
  has_many :milestones
end

MILESTONE

class Milestone < ActiveRecord::Base
  attr_accessible :description, :type
  belongs_to :futuremap
end

不同类型的里程碑,工作,高中,大学,现在我通过属性type告诉他们不同。但这不是一个很棒的设计。

这是因为我发现我需要在类型为工作时存储信息,而在学院时则需要存储信息。

我应该创建不同类型的子类还是使里程碑成为多态模型?我怎样才能做出更好的设计,欢迎任何建议或想法。

1 个答案:

答案 0 :(得分:2)

如果各个里程碑之间存在相当多的共性,那么单表继承(STI)对于这类事物来说非常有用。在TB级大小的硬盘驱动器时代,我真的不担心一直没有使用所有的字段。拥有更简单的架构胜过任何微小的空间,节省了您的成本而牺牲了复杂性。

没有“多态模型”这样的东西,但模型之间存在多态关系。这些对于您的数据库来说要理解起来要困难得多,它们需要复合键并且无法使用外键约束进行验证,但它们在特定情况下非常有用。

然而,您所描述的这种情况不是其中之一。

多态关系最好留给实体关系的“边缘”,因为检索它们的开销可能更高。理想情况下,他们不应该参与:through关系,或者可能涉及JOIN,因为查询的复杂性会很快升级。

就数据库而言,STI表是常规记录。 type列只是ORM关于如何实例化它的提示。总的来说,只要实体具有相当多的共性,它们就非常有效。