簡體   English   中英

在MongoDB中設計數據庫架構的正確方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM