我想實現一個簡單的對話功能,每個對話在兩個用戶之間都有一組消息。我的問題是,如果我從對話的消息中引用,我是否應該以其他方式參考。數據庫關係:實現對話
現在,每封郵件都有conversationId
。要檢索屬於某個對話的所有消息,我應該執行Message.find({conversationId: ..})
。如果我在對話對象中存儲了一個消息數組,我可以做conversation.messages
。
約定是哪種方式?
我想實現一個簡單的對話功能,每個對話在兩個用戶之間都有一組消息。我的問題是,如果我從對話的消息中引用,我是否應該以其他方式參考。數據庫關係:實現對話
現在,每封郵件都有conversationId
。要檢索屬於某個對話的所有消息,我應該執行Message.find({conversationId: ..})
。如果我在對話對象中存儲了一個消息數組,我可以做conversation.messages
。
約定是哪種方式?
這一切都取決於使用模式。首先,你規範化:1個會話有很多消息,1個消息屬於1個會話。這意味着你在對話和消息之間有一對多(1:M)的關係。
在1:M關係中,SQL標準是將「1」作爲外鍵分配給每個「M」。所以,每條消息都會有conversationId。
在Mongo中,您可以選擇通過數組做相反的事情。就像你說的,你可以在對話中存儲一組messageIds。這非常麻煩,因爲對於每條新消息,您都必須編輯對話文檔。您基本上將寫入數據翻倍至&,使2次寫入完全同步(例如,如果用戶刪除了消息&,它不會從對話中刪除?)。
在Mongo中,您還必須考慮1:M和1:F(1對幾)之間的差異。很多時候,嵌套1:F關係是有利的,即使「F」成爲「1」的子分區。有一個限制:每個文檔不能超過16MB(這可能會在未來版本中提升)。嵌套subdoc的優點是你有原子事務,因爲它們都是相同的文檔,更不用說pub/sub中的訂閱更容易。這可能會起作用,但是如果你與過去4年來20個朋友進行了羣聊,你可能必須變得聰明(蓋帽,開始新的對話等)。
嵌套這將是我的建議,儘管你對每個消息分配對話Id的原始想法也是可行的(確保索引!)。
謝謝。一個快速跟進 - 所以如果我決定在對話下嵌套消息,我不需要將conversationId存儲在消息文檔中,對嗎? –
nope,該對象可能只不過是內容,datestamp和hasRead布爾值。 –