我有两个模型FUTUREMAP
和MILESTONE
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
告诉他们不同。但这不是一个很棒的设计。
这是因为我发现我需要在类型为工作时存储信息,而在学院时则需要存储信息。
我应该创建不同类型的子类还是使里程碑成为多态模型?我怎样才能做出更好的设计,欢迎任何建议或想法。
答案 0 :(得分:2)
如果各个里程碑之间存在相当多的共性,那么单表继承(STI)对于这类事物来说非常有用。在TB级大小的硬盘驱动器时代,我真的不担心一直没有使用所有的字段。拥有更简单的架构胜过任何微小的空间,节省了您的成本而牺牲了复杂性。
没有“多态模型”这样的东西,但模型之间存在多态关系。这些对于您的数据库来说要理解起来要困难得多,它们需要复合键并且无法使用外键约束进行验证,但它们在特定情况下非常有用。
然而,您所描述的这种情况不是其中之一。
多态关系最好留给实体关系的“边缘”,因为检索它们的开销可能更高。理想情况下,他们不应该参与:through
关系,或者可能涉及JOIN
,因为查询的复杂性会很快升级。
就数据库而言,STI表是常规记录。 type
列只是ORM关于如何实例化它的提示。总的来说,只要实体具有相当多的共性,它们就非常有效。