2010-06-16 50 views
12

鉴于你必须实现一个新闻源,如在社交网络中看到的那样,ex facebook。 目前,我正在使用具有多态关联的新闻类,它可以是任何类型的图像,注释,友谊,GroupMembership等。每当创建对象时,也会创建新闻。它在AR(ActiveRecords)上运行良好,但当我切换到DM(DataMapper)或Sequel时遇到了麻烦,因为它们都不支持多态关联并阻止它的使用。如何避免多态关联

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

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

回答

21

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

关于它的最佳方法通常取决于您想要对数据执行哪些类型的操作。去它的一种方法是有外键列所有可能的关系:

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

实在是做事情这种方式对具有通用外键和存储类名称的性能差异。对于延迟加载,您只需选择一个不为nil/NULL的外键字段,然后选择要加载的适当关联。对于按表查询加载,您只需一次加载所有关联。这也更灵活,因为您可以使用JOIN进行热切加载,这对于多态方法来说是不可能的。另外,您将获得真正的参照完整性。

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

+0

谢谢...这是一个真正简单但好主意:-)。它需要对模型进行一些更改(返回ref的真实关联),但应该没问题:) – gucki 2010-07-28 20:23:24

+0

我真的不认为这是解决方案。它没有真正描述例如一个可审查的可能是一个商业或一个人或一个项目。即使你在'Review'表中有'business_id','person_id','item_id',你必须找到它们中的第一个非零字段才能真正知道该评论指向什么。 那么一个特定的关联可以是多种不同的事情之一呢? – fatuhoku 2016-07-26 11:09:03

2

下面是一个宝石,以保持多态关联的引用完整性在Rails的数据库级别:

https://github.com/mkraft/fides

由于此张贴有对SQLite3的和PostgreSQL数据库驱动。

声明:我写了宝石。