2010-06-16 74 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數據庫驅動。

聲明:我寫了寶石。