2012-09-10 32 views
2

我是新的noSQL數據庫(MongoDB),我不確定如何組織集合。我有一個用戶系統,每一個用戶有:如何組織一個用戶系統的Mongo集合

  • _id
  • 用戶名
  • 密碼
  • ...(更多基礎數據)
  • 朋友
  • 聲望點
  • 聲望點的歷史
  • 通知
  • 用戶組已經加入

基本數據都存儲在集合中用戶正常,但我不知道如何存儲喜歡的朋友列表中的複雜數據。

我應該存儲就像每個用戶對象的數組的_id朋友(用戶集內),或者我應該創建一個新的收集存儲唯一的朋友?如果我創建了這個新集合,它應該像用戶的_id和其朋友的一個數組,或者像user => friend _id這樣的對。

通知和歷史記錄相同。這與我與朋友有同樣的問題,但在這些情況下數組的大小可能更大,因此使用新集合的想法更強。

+1

我覺得這個博客文章[設計嵌入式,非嵌入式和桶結構的MongoDB模式](https://openshift.redhat.com/community/blogs/designing-mongodb-schemas-with-embedded-non-嵌入式和桶式結構)對相關模式設計注意事項有幫助。 – Stennie

回答

2

我假設您正在創建某種社交網絡,其中每個用戶的朋友都是其他用戶。

通常應該避免在MongoDB中代表文檔間關係的集合。在關係數據庫中,您可以使用它們來連接表,但MongoDB不支持連接。

您應該爲每個用戶添加一個好友數組。這是在MongoDB中實現多對多關係的常用方式。但是因爲你有一個關係,而不是一個聚合(朋友不是擁有由用戶 - 他們獨立存在),你不應該把整個朋友對象放入這些數組。而不是你應該使用一個唯一的標識符,可以用來找到用戶集合中的朋友。這可以是朋友的_id,DBRef或朋友的名字(只有當這些是唯一的和編入索引的時候)。後一種解決方案將允許您在不請求所有參考文檔的情況下獲取用戶朋友的可讀列表。

將整個對象存儲在用戶文檔中有意義的反例可以是通知。通知被髮送給個人用戶。沒有用戶,通知是沒有意義的。如果沒有收到用戶的通知,您將永遠不需要通知。當用戶被刪除時,通知可以被刪除。所以你可以將它存儲在用戶文檔中。

+0

謝謝。所以你會把所有的通知和歷史記錄放入用戶對象中?之後只需使用.find獲取用戶字段(以提高性能)。 – Miguel

+0

是的,我就是這麼做的。請注意在您評論後添加到我的答案中的第二段。 – Philipp

相關問題