如何避免多态关联

guc*_*cki 12 ruby-on-rails polymorphic-associations

鉴于你必须实现像社交网络中看到的那样的新闻提要,ex facebook.目前我正在使用一个具有多态关联的News类,它可以是Image,Comment,Friendship,GroupMembership等任何类型.每当创建一个Object时,也会创建新闻.它与AR(ActiveRecords)一起工作正常,但是当我切换到DM(DataMapper)或Sequel时,我会遇到麻烦,因为它们都不会直接支持多态关联并阻止它的使用.

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

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

Jer*_*ans 22

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

最好的方法通常取决于您想要对数据做什么类型的事情.一种方法是为所有可能的关系提供外键列:

news:
  id
  ... (Other columns)
  image_id
  comment_id
  friendship_id
  group_membership_id
Run Code Online (Sandbox Code Playgroud)

以这种方式做事与使用通用外键和存储类名实际上没有性能差异.对于延迟加载,您只需选择一个非nil/NULL的外键字段,然后选择要加载的相应关联.对于每表查询的预先加载,您只需一次加载所有关联.这也更灵活,因为您可以使用JOIN急切加载,这是多态方法无法实现的.此外,您还可以获得真正的参照完整性.

一个缺点是,如果您希望将来添加更多关联类型,则需要向表中添加外键.