gpt4 book ai didi

ruby-on-rails - 如何避免多态关联

转载 作者:行者123 更新时间:2023-12-04 00:29:26 25 4
gpt4 key购买 nike

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

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

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

最佳答案

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

最好的方法通常取决于您想对数据做哪些类型的事情。一种方法是为所有可能的关系设置外键列:

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

与使用通用外键和存储类名相比,以这种方式做事确实没有性能差异。对于延迟加载,您只需选择一个非 nil/NULL 的外键字段,然后选择适当的关联进行加载。对于按表查询预先加载,您只需一次加载所有关联。这也更加灵活,因为您可以使用 JOIN 急切地加载,而这在多态方法中是不可能的。此外,您还可以获得真正的参照完整性的好处。

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

关于ruby-on-rails - 如何避免多态关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3050959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com