2010-10-13 104 views
2

嗯,我正處於一些設計問題的中間。 我正在嘗試爲我的網站建立一個通用的評論系統。 於是我開始用兩個表:參考各種表格

COMMENT_NODE有許多評論

現在我希望能夠給我冷靜的評論系統連接到不同的地方在我的網站。例如blog_posts和user_pages。

blog_posts有一個COMMENT_NODE

user_pages有一個(不同的)COMMENT_NODE

所以我結束了在想法存儲在blog_posts額外comment_node_id場和user_pages表。但這裏的問題在於,這種連接是單向的 - 我可以從博客文章和用戶頁面獲得Comment節點,但是有comment_node,我無法找到哪個其他表使用它。

當然,我可能會在comment_nodes或其他地方存儲'linked_table'字符串,但我想這會殺死我的數據庫設計。

有沒有一個很好的方法來實現這一目標?謝謝

回答

1

其實你的想法是正確的。改變你的COMMENT_NODE表並添加以下各列

| commentable_type | commentable_id | 

的commentable_type列包含與被引用的表的名稱的字符串(從你的榜樣,無論是blog_posts或user_pages)和commentable_id中包含的任何blog_post或A的ID user_page(取決於commentable_type列)。

然後爲blog_post和user_page表添加一個外鍵來引用您的Comment_node。

我之前已經設計了這些類型的評論系統,通常我的做法是

commentable_type [0..n] <--> [1] commentings [1] <--> [0..n] comment 

我commentings表對應於您的COMMENT_NODE(如果我正確的假設這)。在我看來,這是實現這一目標的最佳途徑。

編輯:然後,您可以執行左連接如下:

SELECT * FROM Comment_node c 
LEFT JOIN Blog_post b 
ON c.commentable_id = b.id 
WHERE c.commentable_type = 'blog_post' 
+0

但是,這將讓我從左邊COMMENT_NODE JOIN blog_post? – undsoft 2010-10-13 10:11:56

+0

當然,我已經編輯了我的答案,包括這個。 – thomaux 2010-10-13 10:22:30

+0

但我無法在一個查詢中選擇相應的表格。我將不得不有數量的查詢相當於commentable_types的數量,對吧? – undsoft 2010-10-13 10:24:22