12

鉴于您必须实现一个新闻提要,就像在社交网络中看到的那样,例如 facebook。目前我正在使用一个新闻类,它有一个多态关联,可以是任何类型的图像、评论、友谊、GroupMembership 等。每当创建对象时,也会创建新闻。它在 AR(ActiveRecords) 上运行良好,但是当我切换到 DM(DataMapper) 或 Sequel 时我遇到了麻烦,因为两者都不支持多态关联并且不鼓励它的使用。

一种解决方法是使用带有大量 UNION 的大 SQL 子句来合并所有应该被视为新闻的不同表。但这有一些缺点,尤其是性能会很糟糕。

所以我想知道如何在没有多态关联的情况下解决问题,同时仍然获得良好的性能并且没有其他缺点,比如有可能将元数据添加到新闻中?

4

2 回答 2

22

免责声明:我是 Sequel 的首席开发人员。

最好的解决方法通常取决于您想对数据执行什么类型的操作。一种解决方法是为所有可能的关系设置外键列:

news:
  id
  ... (Other columns)
  image_id
  comment_id
  friendship_id
  group_membership_id

以这种方式做事与使用通用外键并存储类名实际上没有性能差异。对于延迟加载,您只需选择一个不是 nil/NULL 的外键字段,然后选择要加载的适当关联。对于每表查询的急切加载,您只需一次加载所有关联。这也更加灵活,因为您可以使用 JOIN 急切地加载,而这对于多态方法是不可能的。此外,您还可以从真正的参照完整性中受益。

一个缺点是,如果以后要添加更多的关联类型,则需要在表中添加外键。

于 2010-06-17T21:55:17.940 回答
2

这是在 Rails 的数据库级别维护多态关联的引用完整性的 gem:

https://github.com/mkraft/fides

在这篇文章中,有 SQLite3 和 Postgresql 的适配器。

免责声明:我写了宝石。

于 2013-04-01T12:13:47.323 回答