2012-12-14 43 views
6

我想使用MongoDB實現內容標記。在關係數據庫中,最好的方法是在內容(比如說「產品」)和標籤表之間建立多對多的關係。但是NoSQL數據庫的最佳方法是什麼?使用MongoDB進行內容標記

難道是更好地把每一個標籤在標籤陣列「內容」的文件,或者把引用標籤在一個字符串?

+0

的可能重複[如何實現蒙戈後的標籤?(http://stackoverflow.com/questions/8455685/how-to-implement-post-tags-in-mongo) –

回答

10

在大多數情況下,如果您在MongoDB中具有n:m關係,則應該使用嵌入而不是引用。所以我建議你在每個產品中都帶有標籤名稱的數組「標籤」。我假設看單個產品將是您系統中最常見的用例。通過此設計,您可以使用單個數據庫查詢向用戶顯示具有標籤名稱列表的產品。

當您需要關於您不想綁定到產品的標籤的其他元數據(如標籤的長文本描述)時,您可以創建一個額外的標籤集合,其中名稱字段獲得快速查找的獨特索引並避免重複。當用戶點擊或懸停在標籤名稱上時,您可以使用附加查詢來獲取標籤詳細信息。

本設計中存在的一個問題是您想要刪除或重命名標籤的情況。然後你必須編輯包含標籤的每個產品。但是因爲MongoDB不像SQL數據庫那樣知道CASCADE ON DELETE的外鍵,所以當你有文檔相互引用時,你總會遇到這個問題。

通過在產品的標籤數組中存儲對象標識而不是名稱,可以使重命名標籤變得更容易。但是ID有缺點,即用戶無用。您需要獲取標籤的名稱以顯示產品頁面。這意味着您必須從標籤集合中請求每一個標籤集合,這需要額外的數據庫查詢。

+1

我不認爲這是在建議嵌入與鏈接時,說「在大多數情況下」是個好主意。這實際上取決於用例,而對於標籤來說,很明顯嵌入是正確的,對於其他n:m關係嵌入可能是非常不正確的。 –

+0

@AsyaKamsky你建議什麼? – mayankcpdixit

+2

在這種情況下,我建議嵌入,我反對暗示嵌入「大多數情況下」的建議。 –