我正在开展一个目前拥有大量HABTM协会的项目。从本质上讲,一切都与其他一切有关。我正在考虑建立一个具有两个多态字段的中间表/模型。这样,如果我添加另一个模型,我可以轻松地将其连接到其余模型。这是一个好主意吗?如果没有,为什么不呢?如果是,为什么不是所有的铁路项目都有这种中间表?
我看到另外两个选择。我可以继续添加中间表,或者我可以添加一个包含每种类型之一的表。前一个选项有点麻烦,后一个选项不允许自联接。
答案 0 :(得分:1)
虽然多态连接表听起来会让事情变得更容易,但我认为你最终会为自己制造更多的头痛而不是它的价值。以下是我头脑中的一些潜在挑战/问题:
您将无法使用ActiveRecord的 has_and_belongs_to_many 关联或相关助手,而无需大量的黑客攻击/ monkeypatching,这将立即缩短设置单个成对链接表所需的时间。< / p>
您的联接表会有两个 ID 列,我们称之为a_id
和b_id
。对于任何给定的模型对,您必须确保ID总是在同一列中。
示例:如果您有两个名为User
和Role
的模型,则必须确保该对user_id
始终存储在col a_id
中并且role_id
始终存储在col b_id
中,否则您将无法以任何有意义的方式对表进行索引(并且会冒两次定义相同关系的风险)。
如果您想使用FOREIGN KEY约束的数据库实施,则不太可能支持此多态链接表方案。
通用链接表将比n个单独的链接表 n倍大。使用良好的索引编制很多并不重要,但随着您的应用程序和数据的增长,这可能会成为一个令人头痛的问题并限制您在扩展方面的一些选择。让你的数据库休息一下。
大多数或最不重要的(我无法决定)你会违反规范,这意味着当你遇到麻烦时会有更少的资源(如果有的话)来帮助你。基本上亚当桑德勒“他们都会嘲笑你”的理由。
has_many :xxx, :through => :xxx
关系消除任何链接表吗?答案 1 :(得分:0)
通过思考,你实际上可以做到这一点,但我不会。连接表的增长速度非常快,我希望保持模型关系简单易用。 我习惯于处理非常大的系统/数据集,所以如果你要在每个连接中都有很多,那么就可以了。我仍然会分别为连接而做,我真的很喜欢我的多态。
答案 2 :(得分:0)
如果您使用多个连接表而不是一个巨大的多用途连接表,我认为它会更清晰,更灵活。