2011-07-26 132 views
1

我正在寫一個模擬,需要一個後備數據庫來存儲結果。該模擬會寫入大量的數據。出於明顯的性能原因,我選擇嘗試一個NoSQL數據庫,特別是MongoDB。但是,我對我的數據模型有點困惑。MongoDB模式設計 - 參考VS嵌入

在關係世界中,模式將轉變到這一點:

Relational data model

  1. 模擬仿真持有配置,狀態等
  2. 情景描述特定的模擬情況。
  3. 實現組TestResults。

模擬工作如下。首先我們創建配置(映射到模擬表),並指定場景以及要計算的實際數量。然後我們開始模擬。模擬在場景中創建實現(並行,實現了許多實現並同時進行計算並插入到模擬當前正在處理的場景中)。

但是,在NoSQL中,特別是MongoDB,關係很糟糕,所以我應該儘可能地使用嵌入式文檔。所以,我想出了這個:

Embedded data model

這種模式應該給我最好的性能首先計算所有的實現時,然後將其保存到數據庫作爲單個插入(情景)。

但是,出於性能方面的原因,我希望在計算後立即在場景中插入實現。每次實現完成時都需要更新場景。這是一個壞主意嗎 ?它在MongoDB參考上說,當向父文檔​​添加嵌入文檔時,父文檔會更新,但無論如何都會有性能損失。

將實現嵌入到方案中會更快嗎,但引用它?稍後閱讀和彙總數據時會損失多少性能?任何其他陷阱我應該知道?

謝謝。

回答

1

這取決於你將如何使用數據 - 嵌入可能涉及更新多個文檔,所以寫入速度慢,但讀取總是隻有一個文檔,所以速度會很快。引用是相反的 - 寫入單個文件(快速),但讀取多個文件(慢)。

除了潛在的限制,例如達到嵌入式文檔的最大大小,它只是歸結爲哪種類型的性能對您的方案更重要。

0

你應該考慮的另一件事是,如果你要更新你的記錄, 例如,如果你有一個嵌入的用戶列表(比方說朋友),如果你改變用戶中的一個用戶的名字收集,你必須迭代整個朋友列表並手動更新他們的名字。