2017-08-02 97 views
0

我想設計產品之間的模式關係有多個類別什麼是你選擇的性能(讀,寫)更好。如何設計架構更好,產品與類別的關係

模式1 :: 2收集,用CATEGORY_ID陣列

 

    Collection Category { id , name } 
    Collection Product { id , name , category_ids: [category_id_1,category_id_2] } 

模式2 :: 3收集,參考與新採集的參考

 

    Collection Category { id , name } 
    Collection Product { id , name } 
    Collection product_category { id , product_id, category_id } 

模式3:2收藏,鑲嵌收藏參考

 

    Collection Category { id , name } 
    Collection Product { id , name , 
     category_ids: { 
      {id, category_id_1} 
      {id, category_id_2} 
      {id, category_id_3} 
     } 
    } 

非常感謝。

回答

1

拇指規則是在使用MongoDB和一般使用NoSQL時使規範化(?)。因此,如果您不能(或不能)使用單個集合,則最好使用兩個集合。

背後的原因是,MongoDB不提供事務(但)由於看起來較少縮放的好理由。但它確實提供了原子更新,因此單個集合對於操作是安全的。

出於這個原因,3集合中的選項2不是一個好主意(看起來很糟糕)。

看起來像類別數據並不會像產品數據那樣經常變化,所以我認爲第一個選項比第三個選項更有意義。

如果您在category_ids字段上使用多鍵索引,還有一件事情是在第一個選項,這對更快的訪問會有好處。如果您在第三個選項上的category_ids上使用索引,這不會有幫助,因爲對象上的索引與數組上的效率不同。

您在第三個選項中的一個好處是您可以爲每個category_id保存產品的一些關聯數據。

如果這是一件不想丟失的東西,那麼你可以使用一個對象數組。

方案4:

Collection Category { id , name } 
Collection Product { id , name , 
    category_ids: [ 
     {id : category_id_1, limit : 10} 
     {id : category_id_2, limit : 20 } 
     {id :category_id_3, limit : 15 } 
    ] 
} 

在這種情況下,我們可以與每個類別中的每個產品的關聯限制因素相關聯。

但通過避免RDBMS到NoSql的最佳實踐來幫助自己。

0

,如果我有一個10,000,000產品記錄

如果我選擇你的選擇4:

 

    Collection Category { id , name } 
    Collection Product { id , name , 
     category_ids: [ 
      {id : category_id_1, limit : 10} 
      {id : category_id_2, limit : 20 } 
      {id :category_id_3, limit : 15 } 
     ] 
    } 

通過CATEGORY_ID搜索產品

  • 我覺得這個選擇是讀取性能bad
  • 因爲mongodb通過c查找「Collection Product」上的所有文檔ategory_id。

如果我選擇選項2,我想通過CATEGORY_ID

 

    Collection Category { id , name } 
    Collection Product { id , name } 
    Collection product_category { id , product_id, category_id } 

  • 我從 「收集PRODUCT_CATEGORY」 由CATEGORY_ID搜索產品搜索PRODUCT_ID。
  • 我的產品ID列表
  • 我得到product_ids

的「收藏品」產品文檔或這種選擇是好。

謝謝。

+1

我不同意讀取性能不好的假設。你可以像db.Product.find一樣查詢({'category_id.id':category_id_2})。如果你有適當的索引,它會很快,並在一個查詢中執行任務, 爲什麼我會避免選項2是因爲簡單的原因是從product_category你既不能獲得產品也不能獲得類別數據,所以你將不得不做多個在沒有交易的情況下,一旦應用程序業務成熟,這可能會成爲一個痛點。 –

相關問題