2012-01-05 74 views
3

我第一次使用MongoDB,並且我不完全確定最佳做法是什麼在我處於這種情況下。以下是我正在嘗試執行的操作:使用MongoDB進行數據庫設計

我正在製作一個iPhone應用程序,人們可以在其中創建一個事件,然後聊天(爲了消除一些細節,可以說)。我有一個事件收集。我不確定我應該如何存儲用戶的聊天記錄。我想聊天鏈接到其相應的事件,但我不知道如何做到這一點,因爲MongoDB不是關係型。

我應該爲聊天記錄和鏈接創建另一個集合/文檔(我的意思是MongoDB鏈接)嗎?

回答

7

我會在事件文檔中嵌入聊天內容。

似乎聊天總是在事件的上下文中引用,因此將它嵌入到內部以便可以輕鬆訪問它是有意義的。

對性能的影響更爲微妙。有些事情需要考慮:

如果您要採用嵌入式方法,當檢索到文檔時,聊天內容已經包含在其中。因此,後續查詢不需要檢索聊天。這使得快速訪問聊天記錄,但也可能使得檢索事件文檔變得更慢(因爲它們更大)。但是,您可以排除不需要的字段(使性能與具有兩個不同收藏的場景的性能相當)

如果您需要在不同於事件的上下文中處理聊天內容,可能需要有一天使用單獨的收藏。然而,現在嵌入它們的決定聽起來很合理,您可以隨時編寫一個簡單的腳本將它們移到自己的集合中。

希望有幫助,歡呼!

1

我會從最簡單的方法開始,設計一個事件集合,其中每個聊天帖子都是嵌入式文檔。最近你可以移動聊天到一個不同的收藏,如果需要的話,以表演。

8

設計MongoDB模式時的一個關鍵問題是何時嵌入以及何時鏈接。嵌入是在BSON文檔中嵌套對象和數組。鏈接是文檔之間的引用。

這就是the official MongoDB schema design documentation如何啓動。

當設計文檔數據庫有幾件事情要記住:

  1. 哪個實體是父,哪個是孩子?他們真的有聯繫嗎?
  2. 對父實體最常見的訪問模式是什麼?它是否總是需要取回所有的孩子?
  3. 什麼是兒童實體最常見的訪問模式?您是單獨訪問它,還是大多數時候您將它與其父項一起獲取?
  4. 你多長時間向孩子父母追加孩子?
  5. 這些追加操作發生在高度併發的環境中嗎?
  6. 您需要多久更新一次嵌入式文檔?

讀到我指出的MongoDB文檔並回答上面的問題會給你最終的答案。

1

在設計數據庫模式時,請始終記住文檔的大小限制。對於可數量無限增長的子文檔,最好將其存儲在不同的集合中。這對於父帖子內的評論,聊天等是適用的。希望這可以幫助。