MongoDB是一種流行的數據庫,能夠在不受任何表格schema模式的約束下工做。數據以相似JSON的格式存儲,而且能夠包含不一樣類型的數據結構。例如,在同一集合collection 中,咱們能夠擁有如下兩個文檔document:vue
{ id: '4', name: 'Mark', age: '21', addresses : [ { street: '123 Church St', city: 'Miami', cc: 'USA' }, { street: '123 Mary Av', city: 'Los Angeles', cc: 'USA' } ] } { id: '15', name: 'Robin', department: 'New Business', example: 'robin@example.com' }
爲了可以充分利用MongoDB的優點,您必須瞭解並遵循一些基本的數據庫設計原則。在講解設計方法以前,咱們必須首先了解MongoDB存儲數據的結構。spring
與傳統的RDBMS關係型數據庫不一樣,MongoDB並無表Table,行row和列column的概念。它將數據存儲在集合collections,文檔documents和字段fields中。下圖說明了與RDBMS類比的結構之間的關係:數據庫
由於MongoDB使用文檔來存儲數據,因此理解「規範化存儲「」和「非規範化存儲」的概念很是重要。後端
規範化存儲:-規範化意味着將數據存儲到多個集合collections中,並在它們之間設計關聯關係。數據保存以後,更新數據比較容易。可是在讀取數據的時候,規範化存儲的缺點就顯現出來。若是要從多個集合collections查找數據,則必須執行多個查詢,從而使讀取數據的速度變慢。 (好比:將網頁標題、做者、內容分別存儲到不一樣的collections中)設計模式
非規範化存儲:-這種方式將若干對象數據,以嵌套的方式存儲到單個文檔中。它在讀取數據的時候表現更好,但在寫入時會變慢。這種存儲數據的方式還將佔用更多空間。 (好比:將網頁標題、做者、內容分別存儲到同一個collection中)數組
因此在兩種存儲數據方式之間進行選擇以前,先評估一下你的應用數據庫的使用方式。springboot
與RDBMS相比,在MongoDB中對「一對多」關係建模須要進行更細粒度的設計。許多初學者陷入將文檔數組嵌入父文檔中的陷阱。正如咱們在上文中介紹的,知道什麼時候進行規範化存儲或非規範化存儲是很是重要的。所以設計者須要考慮關係的基數是「一個對少數幾個」仍是「一個對多個」?每種關係將具備不一樣的建模方法。 數據結構
例如:下面「一個對少數幾個」的建模示例。最好的建模方法是在父文檔(persopn)中嵌入幾個(address):架構
> db.person.findOne() { name: 'Mark Kornfield', ssn: '1223-234-75554', addresses : [ { street: '123 Church St', city: 'Miami', cc: 'USA' }, { street: '123 Mary Av', city: 'Los Angeles', cc: 'USA' } ] }
在「一個對多個」示例中,咱們將考慮設計兩個集合,即產品products集合和零件parts集合。每一個零件都有一個「 ObjectID」,該「 ObjectID」將出如今產品集合的引用中。這樣的設計可讓讀寫性能更高效。less
> db.parts.findOne() { _id : ObjectID('AAAA'), partno : '1224-dsdf-2215', name : 'bearing', price: 2.63 > db.products.findOne() { name : 'car', manufacturer : 'Ford', catalog_number: 2234, parts : [ // array of references to Part documents ObjectID('AAAA'), // reference to the bearing above ObjectID('F17C'), // reference to a different Part ObjectID('D2AA'), // etc ]
儘管MongoDB是schemaless「無模式的」,但仍然存在將集合collections可視化爲圖表的方法。可以查看設計圖,將對您理解和設計MongoDB的方式上產生重大影響。
DbSchema是能夠很好地完成可視化設計工做的一個工具。以下圖所示,它將經過讀取集合和文檔來推導架構。此外,您只需單擊就能夠修改圖中的對象。在DbSchema中,您還能夠爲MongoDB建立外鍵,固然僅在本地建立,只用於設計目的。
爲了保持數據庫的良好性能,有必要創建智能索引,這將簡化寫入和讀取操做。知道MongoDB的索引優點和侷限性很是重要,MongoDB保留用於排序操做的內存限制爲32MB。若是你不使用索引,則排序時數據庫將被迫將全部排序文檔hold在內存裏面,若是達到32M的限制,則數據庫將返回錯誤或空集。
對MongoDB的透徹理解與對數據庫想要實現的目標的清晰瞭解是良好數據庫設計的祕訣。
以爲對您有幫助的話,幫我點贊、分享!您的支持是我不竭的創做動力! 。另外,筆者最近一段時間輸出了以下的精品內容,期待您的關注。