摘要:下面就來總結一些設計的原則和方法。在城市信息嵌入在人中就更不合適了,因為還會產生大量數據冗余,更新信息也特別麻煩。另一個做法就是嵌在一起,這樣會有性能的提升,不過這種做法會導致數據冗余,看具體的情況來取舍。
mongodb 的schema設計方法 前言
mongodb是NoSQL的代表,從使用關系型數據庫(MySQL)到使用非關系型數據庫(mongodb),其中的一些以前的設計的思維慣性總是在不知不覺的影響著自己的決策。設計的思想有共同之處,也有很大的不同。mongodb的優勢在于他表示數據的方式非常豐富。下面就來總結一些設計的原則和方法。
原則schema的設計最重要的不是當前設計的可擴展性,對設計的可讀性,還是說原來的設計三范式。最重要的在于,你的app一般展現出來的數據是什么結構,就設計成什么樣。取出即用。舉個例子來說,如果設計一個博客的schema,按照原來的方法, 你可能會設計成:
posts { _id: , title: , body: , author: , date: } comments { _id: , post_id: , author: , order: } tags { _id: , tag: , post_id: }
但是更好的設計是:
{ _id: , author: , body: , comments : [ { body: , email: , author: , }, ... { ... } ], date: , tags: [ ... ], title: }
?
原來的設計范式的目標盡可能的減少數據庫數據修改的難度(減少數據冗余)
最小化數據庫設計擴展的改動
避免數據庫訪問時的歧義
在mongodb中:
默認的來說設計的時候是要避免數據冗余的
不存在這樣的問題,因為mongo中的schema非常靈活,你可以隨時的改動
由于設計的時候就盡可能的按照應用需要的數據的形式設計,取出即用,所以第三個問題出現的概率也比較少
沒有約束怎么辦?在mongo中,最經常思考的問題就是,沒有外鍵怎么保持數據一致性?正如上述博客的第一種設計中,你在新插入一個評論的時候,數據庫是不會保證你這個post_id是不是真在在posts這個collection里面有對應值。
解決的辦法就是像第二種設計中的做法,把他嵌入在posts這個collection.由于這個時候評論已經是post的一部分,就再也不用擔心插入的評論沒有對應到一篇博客的問題。
沒有事務怎么辦?在目前,mongodb是不支持事務的。也就是說,如果你一個業務需要修改好幾條記錄,你是沒辦法保證當其中一個操作失敗的以后將其它操作回滾的,這種時候又應該怎么辦?
雖然mongo沒有提供事務,但是他提供了非常豐富的原子操作,我們應該充分利用這一點。在關系型數據庫中,你可能有幾張表,然后要通過join的方式去鏈接。所以你需要事務去同時修改幾張表。但是在mongo中,在設計的時候你已經prejoin了(就是你已經把它們都嵌入在了同一個collection),你只需要直接一次修改整個post就可以實現事務的效果。
總的來說,解決的辦法有三個:
重建你的設計,使得你能通過原子操作一次把它們都修改完
在你的軟件中實現鎖的機制,用尋找和修改寫一系列的測試來實現。
在大量的數據或者不嚴格的場景中,容忍這種錯誤
典型的設計場景 一對一的關系比如說應聘者和簡歷的關系。除非嵌在一起會導致你的數據大于16MB(mongo的限制),你都應該嵌在一起。做好的做法就是將一個比較少使用的嵌入一個經常食用的當中。
一對多的關系比如說城市和人的關系,博客和評論
對于像城市和人的關系這樣的,一個城市實在是對應了太多太多的人。如果將人嵌入在城市中,不太合適。在城市信息嵌入在人中就更不合適了,因為還會產生大量數據冗余,更新信息也特別麻煩。這種情況下最好的做法就是分開兩個collection,然后人的collection中每一條都有一個city字段,來對應城市collection中的一條。
如果是像博客和評論這樣一個對應的不是特別多的時候,最好的最法還是嵌進去
多對多的關系例如書和作者的關系,老師和學生的對應關系
對于像書和作者這樣,比較少對應比較少的,一個可行的做法就是分開兩個collection。書collection中存一個authors數組,作者 collection中存一個books數組,互相對應。這種做法不好的地方就在與要手動維護數據一致性。另一個做法就是嵌在一起,這樣會有性能的提升,不過這種做法會導致數據冗余,看具體的情況來取舍。特別的像老師和學生這種關系,最好最好就是不要將老師嵌在學生中,因為很可能一個新來的老師就還沒有學生,這樣你就沒辦法把這位老師加入到系統中。
樹形結構一個典型的場景就是像amazon這樣的電商,一個商品分類下可能有很多個子分類。
其中的一個做法就是建立一個分類的collection,然后每個分類有一個parent_id字段,但是這樣不便于找到他所有的祖先。所以比較好的做法是再加一個ancesters的數組字段,記錄他所有的祖先的id,這樣就能方便的查詢到他的祖先和后代。
嵌入的優勢提高讀的效率。這意味著你要獲取數據只需要查詢一次數據庫就行了。
處理大文件如果一個數據量特別大(大于16M),比如讀入一個100多M的mp4文件。這種情況下就需要用到GRIDFS.原理就是把他分割成一個一個小的塊
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/18868.html
摘要:為安裝文件,無需再配置環境變量。連接操作有以下包作者并未查到除此之外的包,但不代表沒有。等于是每個默認配置的主鍵屬性,屬性名為可自己定義一個來覆蓋此屬性。需要注意的是,在新版本的文檔中,為。通過創建限于篇幅,本小節暫時寫到這里。 我的琴聲嗚咽,我的淚水全無。我把遠方的遠歸還草原。 - 海子《九月》 mongodb安裝 什么是Mongodb?就是一個基...
摘要:如圖連接成功后,顯示你的數據庫,在這個節目可以對數據庫進行操作。如圖安裝與加載首先假定你已經安裝了,命令行工具輸入在使用的文件中即可。創建讀取更新刪除單值讀取上文是在中基于對進行增刪查改操作的簡單介紹,以后會有進階的文章。 關鍵詞:mongodb安裝 mongoose使用 robomongo mongoose的CRUD操作 mongoose的查詢,增加,修改,刪除 工具介紹 Mon...
摘要:如圖連接成功后,顯示你的數據庫,在這個節目可以對數據庫進行操作。如圖安裝與加載首先假定你已經安裝了,命令行工具輸入在使用的文件中即可。創建讀取更新刪除單值讀取上文是在中基于對進行增刪查改操作的簡單介紹,以后會有進階的文章。 關鍵詞:mongodb安裝 mongoose使用 robomongo mongoose的CRUD操作 mongoose的查詢,增加,修改,刪除 工具介紹 Mon...
摘要:三更新內容在原來項目的基礎上,做了如下更新數據庫重新設計,改成以用戶分組的數據庫結構應數據庫改動,所有接口重新設計,并統一采用和網易立馬理財一致的接口風格刪除原來游客模式,增加登錄注冊功能,支持彈窗登錄。 這個項目最初其實是fork別人的項目。當初想接觸下mongodb數據庫,找個例子學習下,后來改著改著就面目全非了。后臺和數據庫重構,前端增加了登錄注冊功能,僅保留了博客設置頁面,但是...
閱讀 1191·2021-09-22 15:24
閱讀 2293·2019-08-30 15:44
閱讀 2621·2019-08-30 10:55
閱讀 3361·2019-08-29 13:25
閱讀 1644·2019-08-29 13:09
閱讀 1400·2019-08-26 14:05
閱讀 1392·2019-08-26 13:58
閱讀 1987·2019-08-26 11:57