mongodb 最佳實踐

2021-08-04 07:20:37 字數 1691 閱讀 7941

不要按照關係型來設計表結構

mongodb可以讓你像關係型資料庫一樣設計表結構,但是它不支援外來鍵,也不支援複雜的join!如果你的程式發現有大量實用join的地方,那你的設計可能需要重新來過。參照以下相關模式設計建議。

資料庫集合(collection)的數量不宜太多

mongodb的模式設計基於靈活豐富的json文件模式。在很多情況下,乙個mongodb應用的資料庫內的集合(表)的數量應該遠遠小於使用關聯式資料庫的同型別應用。mongodb表設計不遵從第三正規化。mongodb的資料模型非常接近於物件模型,所以基本上就是按照主要的domain object的數量來建相應的集合。根據經驗,一般小型應用的集合數量通常在幾個之內,中大型的應用會在10多個或者最多幾十個。

不要害怕資料冗餘

mongodb模式設計不能按照第三正規化,很多時候允許資料在多個文件中重複,比如說,在每乙個員工的文件中重複他的部門名字,就是乙個可以接受的做法。如果部門名字改了,可以執行乙個update({},{}, ) 的多文件更新來一次性把部門名字更新掉。

適合和不適合冗餘的資料型別

對 1:n(一些)的關係使用全部內嵌

對於一對多的關係,如乙個人有幾個****,一本書有10幾個章節,等等,建議使用內嵌方式,把n的資料以陣列形式來描述,如:

> db.person.findone(),]

}

對 1: nn (很多) 的關係使用id內嵌

有些時候這個一對多的多端數量較大, 比如說,乙個部門內有多少員工。在華為乙個**部門可能有數千員工,這個時候如果把所有員工資訊直接內嵌到部門內肯定不是個好的選擇,有可能會超出16mb的文件限制。這個時候可以採用引用id的方式:

> db.departments.findone()

如果需要查詢部門下員工相關資訊,你可以使用$lookup聚合操作符來把員工資訊進行關聯並返回。

對 1: nnn (很多) 的關係使用

如果一對多情況下,這個多端數量無限大並會頻繁增長,比如說,乙個測量儀的每分鐘讀數,一年下來有幾十萬條,這個時候即使是把id放到陣列裡都會管理不便,這個時候就應該把多端的資料建立乙個集合,並在那個集合的文件裡加入對主文件的連線引用,如:

> db.sensors.findone()

>db.readings.findone()

把二進位製大檔案和元資料分集合存放

經常更新的資料不要放在巢狀陣列內

陣列是用來表達 1對多關係的利器,但是mongodb對巢狀的陣列內元素缺乏直接更新能力。比如說:

,,]

}

這樣設計沒有巢狀陣列,我們可以直接對 math的score 修改為99:

db.students.update(, })
注意陣列定位符 $ 的用法,$ 表示當前匹配的第乙個陣列元素的在陣列內的索引。

但是下面這種情況就涉及到了陣列巢狀:

,

] },

]}

這個時候如果你想對math course的term 1的score進行修改,你就需要把 scores 這個陣列整個調到記憶體然後在**裡對這個巢狀陣列的元素進行修改。這是因為mongodb的陣列定位符 $ 只對第一層陣列有效。

當然,如果你的模型不需要修改巢狀的陣列內元素,那麼這條就不適用。

MongoDB 最佳實踐

已經有很多關於 nosql 選擇的文章了。影響你選擇資料庫的因素有 讀 寫操作的吞吐量,永續性,一致性,延遲性等等。nathan hurst 的文章 visual guide to nosql system 很好的總結了這一點。nosql 通用的最佳實踐 1.徹底的測試 模擬你的生產環境,包括流量來...

MongoDB最佳實踐

將mongodb加入到我們的服務支援列表中,是整個團隊年初工作計畫中的首要任務。但我們感覺如果先新增一項對nosql儲存的支援,而不是先公升級已支援的關係型資料庫,可能對使用者不太好,畢竟目前的使用者都使用關係型資料庫。所以我們決定將引入mongodb這項工作放到公升級mysql和postgresq...

MongoDB最佳實踐

將mongodb加入到我們的服務支援列表中,是整個團隊年初工作計畫中的首要任務。但我們感覺如果先新增一項對nosql儲存的支援,而不是先公升級已支援的關係型資料庫,可能對使用者不太好,畢竟目前的使用者都使用關係型資料庫。所以我們決定將引入mongodb這項工作放到公升級mysql和postgresq...