2016-12-25 99 views
4

我有一個Mongo數據庫。MongoDB - 存儲和讀取數據的最佳方式

我有兩個集合:

  1. 用戶
  2. 帖子

用戶發送一個職位,但問題就在這裏。哪種方法更好?

  1. 只存儲用戶_id在帖子(POST CREATOR)後面。
  2. 將用戶信息(如_id,名稱,用戶名等)存儲在帖子的後面。

在第一種方法中,我們需要從集合USERS中獲取用戶信息。

在第二種方法中,我們需要更新用戶發送的所有帖子數據僅當用戶更新配置文件信息時。

哪個更好?

+0

存儲關係數據的最佳方式是將其存儲在關係數據庫中。 – Federkun

+0

@Federkun你是說第一種方法更好? – Ghorbanzadeh

+0

因此,你已經同意第一選擇去了。而且,根據我也是第一好 –

回答

3

你應該儘量避免MongoDB中的關係。

我建議你使用第二種方法。

4

在MongoDB中嵌入一個文檔是正常的。我認爲,第二種方式是更好的,因爲:

1 - 你不必考慮手動關係,使得其更清潔

2 - 通過選擇你的第一種方式來添加一個或多個額外的查詢(性能問題)

4

要找出您的應用程序的最佳途徑,問問自己這些問題:

一)被寫(更新)查詢用戶收集高或低的NR? (可能很低)

b)讀後查詢的nr是否爲高或低? (可能很高)

c)(用戶)數據一致性有多重要?

非規範化是MongoDB中的一種常見方法。 如果寫入次數與讀取次數相比較少,則通過嵌入數據對數據進行非規格化會產生更好的讀取性能,但寫入性能會降低,因此您需要在更多位置寫入數據。值得注意的是,可能會出現數據不一致的情況,因爲在mongodb中,只有在單個文檔上寫入時,寫入纔是原子。

通過選擇解決方案#1,您將在帖子上讀取速度較慢,因爲需要對用戶集合進行其他讀取查詢。數據一致性得到保證,並且您也獲得更多靈活性。

通過選擇解決方案#2,您可以更快地閱讀帖子,因爲所有內容都是嵌入式的,您可以在一個查詢中找到它。但是您的用戶查詢更新速度會更慢。在此解決方案中,不保證數據一致性,但在稍後可以處理更新不一致時,這在某些應用程序中可能不是一個大問題。 在這裏,您可以只嵌入您需要的用戶數據的部分,而不是全部,例如只需要用戶名(和_id),如果您只需要用戶名就可以在帖子中顯示它。

如果您有一個非常大的數據集,其中包含大量的帖子,並且用戶收集的更新較少,則對帖子收集和用戶數據的大量讀取可能包含可能發生的不一致,並且這些不一致很重要,可以稍後修復在性能方面更好的解決方案是#2。

關於模式設計的一篇有趣的文章,你可以在here找到它。

2

當然,讀取請求不僅僅是編輯請求。

因此,如果您使用第一種方法,您必須添加一些查詢來從集合中讀取數據,並降低讀取性能。

確保第二種方法更好。