2012-04-01 45 views
0

我是相對較新的MongoDB,我仍然習慣於模式設計。MongoDB模式設計的文檔,可以嵌入或獨立

在我目前正在開發的一個項目中,用戶可以標記他們上傳的文件。有三種類型的標籤:描述性,品牌和store_department。他們以三個領域的用戶,但實際上它們合併到一起,並保存爲標籤,即:

"tags" : [ 
    { 
    "type" : "descriptive", 
    "tag" : "this is my tag" 
    }, 
    { 
    "type" : "brand", 
    "tag" : "this is another tag" 
    } 
] 

這是爲了使搜索很容易。通過使用一種類型,我可以向用戶展示三個不同的字段,以鼓勵他們提供信息,然後允許進行更高級的查詢,例如品牌或商店部門搜索。默認搜索將只搜索匹配的標籤。

問題是我在所有字段中提供了自動完成功能。當用戶在「品牌」字段中鍵入時,所有創建的「品牌」類型的標籤都會顯示出來,以匹配他們的輸入。這很容易通過獨立標籤集合來完成。在保存文件文檔時創建並更新新的標籤文檔。針對獨立標籤集合的自動完成查詢,而不是嵌入式標籤的性能。

這種設計感覺不對。這在某些方面是重複努力,但就用戶體驗而言似乎很有效。我使用Mongoid,爲了適應這種設計,我必須爲我的標籤集合創建兩個模型。一個定義了兩個屬性,另一個從第一個繼承,但添加了embedded_in宏。

我可以看到這種模式在其他情況下也很有用:產品和購物車,產品和採購訂單等。有更好的方法嗎?

回答

0

這種設計有些不舒服。這在某些方面是重複努力,但就用戶體驗而言似乎很有效。

在NoSQL數據庫中,您有時需要非規範化。這會導致一些數據重複。但是,因爲它可以大大提高性能(並且對用戶體驗而言非常有用),所以這應該值得。

因此,具有不同標記名稱的集合用於自動完成可能是有意義的。它將比嵌入式文檔中的非獨特標籤小得多。這種方法沒有錯。

這個「主」集合將是爲標籤添加額外元數據的好地方,例如描述和wiki Stackoverflow在這裏爲標籤添加標籤。

另外,如果只有幾種類型,最好爲每種類型的標籤分別設置一個字段。這樣,你可以分別索引它們。

"tags" : { "descriptive: [ "this is my tag" ], 
      "brand": ["this is another tag" ] }