2017-05-29 111 views
0

這裏是快速版本:使用一個集合只用MongoDB的

是否確定保留MongoDB數據庫的所有文檔在一個stuff集合,而不是在不同的studentsschoolsmessages集合組織數據庫?

這裏是版本:

我正在學習用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列表轉換爲兩個列表,然後爲每個集合運行一個查詢。除此額外的工作之外,按日期難以使用skiplimit以及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,唯一的限制?還是我錯過了一些可能會在以後咬我的東西?

回答

0

從技術上講,歡迎您將所有數據存儲在單個集合中,並實現自己的查找不同類型數據的方式(您使用的_type屬性工作正常)。我不瞭解MongoDB在將單個集合中的大量數據存儲到多個集合時存在的其他限制。

但是,這在實踐中是一個非常糟糕的主意。首先,你的數據是結構良好的,如果你有一個正式的模式(比如在一個普通的SQL數據庫中),那麼你的數據將更容易處理。當你有像JSON的數據blob,但每個元素都有略微不同的領域時,Mongo真的很閃耀。想象一下從一個API獲取數據,該API爲您提供了一個帶有100個不同鍵的JSON blob,但您現在只對兩個或三個字段感興趣。在Mongo中存儲整個blob會很有意義,因爲將來可以很容易地查詢所有這些額外的域。如上所述,任何主要的數據庫都可能能夠在幾毫秒內處理所有的查詢,並且有幾個索引。

在你的具體情況下,我認爲你應該修復你的模式而不是合併集合。特別是,每個消息的recipients列表是(我假設)兩個不同集合中文檔的ID列表。如果學校和學生有顯着差異,那麼他們可能不應該被歸類爲recipients。如果學生和學校幾乎完全相同,我會將它們放在一個集合中(稱爲recipients),並添加一個名爲isStudent的字段來區分這兩個集合。雖然這與您的_type字段類似,但郵件與其他兩個郵件沒有業務在同一個集合中。

如果學校和學生都顯著不同,但你堅持具有recipients一個列表,我建議增加一個recipients表,其中包括所有schoolsstudents之間的公共領域。您還需要附加到每個schoolstudentrecipientId。因此,像這樣:

db.messages 
{ recipients: [RecipientIds], text: String } 

db.recipients 
{ name: String } // Add additional shared attributes here. 

db.students 
{ recipientId: ObjectId, school: ObjectId, birthday: Date, ... } 

db.schools 
{ recipientId: ObjectId, phone: String, ... } 
+0

您的建議是有意義的,但我覺得你告訴我治療的MongoDB像歸一化數據的SQL數據庫,我越去想它,更多的收藏我要創建,這讓我感到害怕,因爲我擔心缺乏集合中的連接將是一個很大的限制。我的收件人的例子是我的想法之一。遵循您的「有組織」示例會增加設計的複雜性並限制查詢類型。我希望使用MongoDb來獲得更多的靈活性,而不是更少。 – stenci

+0

從你的答案我不明白的缺點,除「在實踐中這是一個非常糟糕的主意」。 – stenci

+0

沒有模式,很難驗證您的數據是否正確。這使得處理數據變得更加困難。現在您需要在數據庫之外進行更多的數據驗證檢查,以確保您的數據看起來正確(您期望的每個字段都存在幷包含一些非空值)。當您開始更改數據格式時,情況會變得更糟。將數據遷移到更新的格式非常困難,因此與數據庫交互的代碼在處理新舊數據時會變得越來越複雜。 – supersam654

相關問題