[英]Correct approach to design database schema in MongoDB
在我的應用程序中 ,將有程序列表,每個程序將包含會話列表,每個會話將包含工作表列表。 以更簡單的方式,關系為:
Programs --> Sessions --> Worksheets
在應用程序中的某個點上,我想以表格形式顯示所選prgram的工作表列表,如下所示:
--------------------------------
|Worksheet Name | Session Name |
--------------------------------
|Worksheet 1 | Session 2 |
|---------------|--------------|
|Worksheet 3 | Session 1 |
|---------------|--------------|
| | |
我的問題是我應該使用嵌入式文檔,即將會話嵌入prgram中還是將worsheets嵌入會話中,還是應該使用程序,會話和工作表的單獨集合,並使用類似於RDBMS中外鍵的概念來關聯它們?
我擔心的是,如果我要進行單獨的收集,那么對於上述情況,我將不得不執行過多的查詢才能獲得高於結果的結果。
如果我去嵌套文檔查詢子文檔是非常有限的。
mongo中的文檔限制為16MB,如果我要使用嵌套文檔,這已經足夠了。 因此,文檔大小與我無關。
由於mongo基本上不用於關系化和規范化,因此我的問題是考慮到上述情況,我是否應該使用具有關系的規范化模式,還是應該使用帶有嵌入式文檔的反規范化數據?
在MongoDB中,數據建模的指導原則是設計文檔,以便輕松,快速地完成應用程序最常見的查詢。 這與RDBMS的模式設計有很大不同,RDBMS的模式設計着重於對數據進行規范化以規范其不同部分之間的關系,然后依靠聯接通過對關系進行非規范化來獲取正確的信息。 MongoDB並非“意味着關系”並不是真的。 的確,它不像RDBMS一樣處理標准化數據,因為它不執行聯接。 連接必須在應用程序端完成。
Pontification完成后,一種簡化數據建模的簡單方法是使工作表存儲為文檔,將會話和程序數據規范化到每個工作表中,從而使查詢變得容易
{
"_id" : "p3s1ws0",
"session_id" : "s1",
"program_id" : "p3",
....
}
然后使用查詢檢索給定program_id prog_id
所有工作表
> db.worksheets.find({ "program_id" : prog_id })
最有可能添加排序以產生所需的表格形式。 另一個可行的選擇是,在會話文檔中包含一系列工作表文檔,假設每個會話的工作表數量可以限制為合理的數量,例如200:
{
"_id" : "s0",
"program_id" : "p2",
"worksheets" : [
{
"_id" : "ws0",
...
},
...
],
...
}
查詢保持不變
db.sessions.find({ "program_id" : prog_id" })
因為您可以從每個會話中獲取會話的所有工作表。 根據確切要如何創建表格形式,可能需要對查詢使用聚合,但是在問題中沒有跡象表明需要使用聚合。
兩者之間的選擇取決於它將如何影響您的其他查詢和更新。 例如,對於第一個模型,更新程序信息的成本更高,因為需要針對程序中的每個工作表進行更新,而不是更新程序中的每個會話,或者如果對數據進行建模,則僅更新一個文檔作為一個程序文檔,其中包含包含工作表數組的會話數組(可能不想這樣做)。
要閱讀有關這種數據建模的更多信息,建議從MongoDB博客中推薦William Zola的經典系列 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.