一个多态性关联与多个贯穿/HABTM关联



我正在进行一个项目,该项目目前有大量的HABTM关联。从本质上讲,一切都与其他一切有关。我正在考虑建立一个具有两个多态字段的单个中间表/模型。这样,如果我添加另一个模型,我可以很容易地将其连接到其余模型。这是个好主意吗?如果没有,为什么不呢?如果是,为什么所有rails项目都没有这种中间表?

我看到另外两种选择。我可以继续添加中间表,也可以添加一个包含每种类型的表。前一个选项有点麻烦,后一个选项不允许自联接。

虽然多态联接表听起来会让事情变得更容易,但我认为你最终会给自己带来更多的头痛。以下是我脑海中浮现的一些潜在挑战/问题:

  1. 如果没有大量的黑客攻击/猴痘攻击,您将无法使用ActiveRecord的has_and_belongs_to_many关联或相关助手,这将立即超过设置单个成对链接表所需的时间。

  2. 联接表将有两个id列,我们称它们为a_idb_id。对于任何一对给定的模型,您都必须确保id始终位于同一列中。

    示例:如果您有两个名为UserRole的模型,则必须确保该对的user_id始终存储在列a_id中,而role_id始终存储在列b_id中,否则您将无法以任何有意义的方式对表进行索引(并且将面临两次定义同一关系的风险)。

  3. 如果您希望使用FOREIGN KEY约束的数据库强制,则不太可能支持这种多态链接表方案。

  4. 通用链接表将比n个单独的链接表大n倍。有了良好的索引,应该无关紧要,但随着应用程序和数据的增长,这可能会变得令人头疼,并限制您在扩展方面的一些选择。让DB休息一下。

  5. 最重要或最不重要的是(我无法决定)你将打破常规,这意味着当你遇到麻烦时,可以帮助你的资源会减少很多(如果有的话)。基本上是Adam Sandler;他们都会嘲笑你"根本原因


最后一个想法:您可以通过使用has_many :xxx, :through => :xxx关系来消除任何链接表吗

仔细想想,你实际上可以做到这一点,但我不会。联接表的增长速度足够快,我喜欢保持模型关系简单易改。不过,我习惯于处理非常大的系统/数据集,所以如果你要在每个联接中有很多联接,那么好吧。不过,我仍然会单独处理联接,我真的很喜欢我的多态性。

我认为,如果使用多个联接表,而不是一个巨大的多用途联接表,会更干净、更灵活。

最新更新