這裏是快速版本:使用一個集合只用MongoDB的
是否確定保留MongoDB數據庫的所有文檔在一個stuff
集合,而不是在不同的students
,schools
和messages
集合組織數據庫?
這裏是長版本:
我正在學習用MongoDB的攜手合作,像這樣有組織的數據庫中的新應用:
db.messages
{'recipients': ['student 1', 'student 2', 'school 1', 'school 2'], 'text': 'hello!'}
db.students
{'_id': 1, 'name': 'mary'}
{'_id': 2, 'name': 'joseph'}
db.schools
{'_id': 1, 'name': 'middle'}
{'_id': 2, 'name': 'high'}
尋找的所有收件人列表消息需要將recipients
列表轉換爲兩個列表,然後爲每個集合運行一個查詢。除此額外的工作之外,按日期難以使用skip
和limit
以及sort
(在聚合兩個查詢結果(而非數據庫)之後,必須由應用程序完成skip
)。
我想,如果數據庫舉辦這樣它會更容易:
db.stuff
{'_id': 1, '_type': 'message', 'recipients': [2, 3, 4, 5], 'text': 'hello!'}
{'_id': 2, '_type': 'student', 'name': 'mary'}
{'_id': 3, '_type': 'student', 'name': 'joseph'}
{'_id': 4, '_type': 'school', 'name': 'middle'}
{'_id': 5, '_type': 'school', 'name': 'high'}
db.stuff.create_index([('_type', 1)])
有了這個組織的一個查詢可以找到任何類型和查詢的靈活性的文件要高得多。刪除集合使數據庫更多無模式。
閱讀(大多數)的文件和一堆的博客後,我覺得唯一的限制是最大number of indexes per collection爲64
那是64,唯一的限制?還是我錯過了一些可能會在以後咬我的東西?
您的建議是有意義的,但我覺得你告訴我治療的MongoDB像歸一化數據的SQL數據庫,我越去想它,更多的收藏我要創建,這讓我感到害怕,因爲我擔心缺乏集合中的連接將是一個很大的限制。我的收件人的例子是我的想法之一。遵循您的「有組織」示例會增加設計的複雜性並限制查詢類型。我希望使用MongoDb來獲得更多的靈活性,而不是更少。 – stenci
從你的答案我不明白的缺點,除「在實踐中這是一個非常糟糕的主意」。 – stenci
沒有模式,很難驗證您的數據是否正確。這使得處理數據變得更加困難。現在您需要在數據庫之外進行更多的數據驗證檢查,以確保您的數據看起來正確(您期望的每個字段都存在幷包含一些非空值)。當您開始更改數據格式時,情況會變得更糟。將數據遷移到更新的格式非常困難,因此與數據庫交互的代碼在處理新舊數據時會變得越來越複雜。 – supersam654