您好,登錄后才能下訂單哦!
MongoDB數(shù)據(jù)是特別靈活的,與SQL數(shù)據(jù)庫相比,它不需要在插入數(shù)據(jù)前先定義表的結(jié)構(gòu)。MongoDB的集合不強調(diào)固定的文檔結(jié)構(gòu)。這種靈活性使它能夠輕松映射文檔結(jié)構(gòu)。每一個文檔都可以映射它要表達的對象,即使這些數(shù)據(jù)有實質(zhì)性的不同。其實在實際中,同一集合下的文檔通常采用相似的結(jié)構(gòu)。
MongoDB數(shù)據(jù)建模的主要問題時在應(yīng)用程序的需求,數(shù)據(jù)庫引擎的性能特性和數(shù)據(jù)檢索模型之間做一個平衡。設(shè)計數(shù)據(jù)模型是,總是要考慮應(yīng)用程序使用到的數(shù)據(jù)(查詢、更新以及需要處理的數(shù)據(jù)等等)以及數(shù)據(jù)結(jié)構(gòu)本身。
文檔結(jié)構(gòu)
設(shè)計MongoDB數(shù)據(jù)模型的關(guān)鍵是考慮好文檔結(jié)構(gòu)和應(yīng)用程序表示的數(shù)據(jù)之間的關(guān)系。有兩種方式可以表達這種關(guān)系:引用(references)和嵌入文檔(embedded documents)。
引用(References)
引用(References)存儲數(shù)據(jù)之間的關(guān)系,包括從一個文檔鏈接或引用到另外一個文檔。這樣應(yīng)用程序就解決了訪問關(guān)聯(lián)數(shù)據(jù)的問題,一般來說,這些都是規(guī)范數(shù)據(jù)的數(shù)據(jù)模型。
嵌入式文檔通過存儲相關(guān)的數(shù)據(jù)在一個文檔結(jié)構(gòu)中來捕獲數(shù)據(jù)之間的關(guān)系。MongoDB文檔可以在當前文檔的字段或數(shù)組中嵌入文檔作為子文檔。這些非規(guī)范化數(shù)據(jù)模型允許應(yīng)用程序檢索和操作相關(guān)的數(shù)據(jù)在一個單一的數(shù)據(jù)庫操作。
寫操作的原子性
在MongoDB中,寫操作的原子性限制在文檔級別,沒有一個寫操作可以自動影響到多個文檔或多個集合。規(guī)范化的嵌入式數(shù)據(jù)模型整合了所有的關(guān)聯(lián)數(shù)據(jù)在一個文檔中來展現(xiàn)實體。這有助于原子寫操作在一個寫操作中插入和更新實體的數(shù)據(jù)。規(guī)范化數(shù)據(jù)能夠分隔多個集合的數(shù)據(jù)并且需要在非原子性操作中需要多個寫操作。
然后,促進原子寫的模式可能限制應(yīng)用程序使用數(shù)據(jù),也可能限制修改應(yīng)用程序的方法。原子性考慮設(shè)計模式的挑戰(zhàn),平衡靈活性和原子性。
文檔增加
像添加元素到數(shù)組或者增加新字段這樣的更新,會增加文檔的大小。如果文檔的大小超過了為該文檔分配空間,MongoDB會重新分配磁盤空間??紤]到空間的增加,應(yīng)該規(guī)范化或使用規(guī)范的數(shù)據(jù)。
數(shù)據(jù)使用和性能
當設(shè)計數(shù)據(jù)模型的時候,應(yīng)考慮應(yīng)用程序如何使用數(shù)據(jù)庫。比如,如果應(yīng)用程序僅使用最近插入的文檔,考慮使用頂端集合(Capped Collections)。如果應(yīng)用程序需要頻繁的讀取集合,添加索引能夠提高數(shù)據(jù)查詢效率。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。