2014-02-06 42 views
0

我想設計一個模型輪廓交互,例如< - >互動< - > B,相互作用包含A和B
可以說我有收集所謂的相互作用共同領域,我有幾個想法,我正在尋找最佳實踐解決方案。
收集數據建模MongoDB中

  1. 相互作用分開到兩個不同的文件,每個配置文件

    { 
        pid:"A ID" 
        commonField1:"" 
        commonField2:"" 
        .. 
    
    } 
    { 
        pid:"B ID" 
        commonField1:"" 
        commonField2:"" 
        .. 
    } 
    

    優點:快速閱讀
    缺點:應該在這兩個文件的執行對共同項目的每個更新

  2. 維護一個文件進行交互

    { 
    pids:['A ID','B ID'] 
    commonField1:"" 
    commonField2:"" 
    .. 
    } 
    

    優點:更新的共同視野只有一次
    缺點:棘手的閱讀

的事情是有大量的閱讀,但也有很多更新的這彙集應該設計了很多數百萬的文件。在我的情況下

常用查詢:

  • 檢索輪廓相互作用
  • 更新特定的配置文件交互

我倚在那裏我將依靠多鍵索引上的第二選擇用於快速文檔查找的pid,我將在每次頻繁更改中享受單次更新。

我對分片集合沒有經驗,但我注意到多鍵索引不支持分片鍵,它應該是第二選擇的顯示限制嗎?
這樣的索引讀取速度是否足夠快?對我的用例他們還有其他選擇嗎?

您的回答非常感謝。

回答

0

我認爲後一種格式更有意義避免重複更新。

對於交互對,您應該使用compound index而不是數組。複合索引可以使用作爲_id並作爲分片鍵(數組對於其中任一個都是無效的)。

所以該文件可能看起來像:

{ 
    _id: { pid1: 'A', pid2: 'B' }, 
    commonField1: '', 
    commonField2: '', 
} 

如果你想避免重複的對,你可以在一些預知的順序您的ID進行排序。例如,pid1可能總是這兩個值中較小的一個。

默認_id索引將允許您有效地查找(pid1,pid2)或(pid1)交互,但您可能需要在{'_id.pid2': 1}上添加額外的索引。