標籤:mongodb體繫結構
聲明:該文章主要來自《MongoDB實戰》一書內容,主要想通過該書學習MongoDB的相應知識,加深理解,故寫在自己的博文當中,作為記錄,在最後的章節中,會有一個自己集合MongoDB資料庫應用的JavaEE的web應用。
MongoDB是一個可移植的資料庫,它在流行的每一個平台上都可以使用,即所謂的跨平台性,在不同的作業系統上雖然略有差別,但是從整體架構上來看,MongoDB在不同的平台上是一樣的,如資料邏輯結構和資料存放區等等。
一個運行著的MongoDB資料庫就可以看成是一個MongoDB Server,該Server由執行個體和資料庫組成,在一般情況下,一個MongoDB Server機器上包含一個執行個體或者多個與之對應的資料庫,但是在特殊情況下,如硬體投入成本或者特殊的應用需求,也允許一個Server機器上可以有多個執行個體或者多個資料庫。
MongoDB中一系列物理檔案(資料檔案、記錄檔等)的集合與之對應的邏輯結構(集合、文檔等)被稱之為資料庫,簡單的說,就是資料庫是由一系列與磁碟有關係的物理檔案的組成。
3.1、資料邏輯結構
很多人在學習MongoDB體繫結構的時候會遇到各種各樣的問題,我在這裡給大家簡單的介紹下MongoDB體繫結構之一的邏輯結構,MongoDB的邏輯結構是一種階層,主要由:文檔(Document)、集合(Collection)、資料庫(database)這三部分組成,邏輯結構是面向使用者的,使用者使用MongoDB開發應用程式使用的就是邏輯結構。
- MongoDB的文檔(Document),相當於關聯式資料庫中的一行記錄。
- 多個文檔組成一個集合(Collection),相當於關聯式資料庫的表。
- 多個集合(Collection),擴及上組織在一起,就是資料庫(database)。
- 一個MongoDB執行個體支援多個資料庫(database)。
文檔(Document)、集合(Collection)、資料庫(Database)的階層如:
對於習慣了關係型資料庫的朋友們,我將MongoDB與關係型資料庫的邏輯結構進行了對比,以便讓大家更深刻的理解MongoDB的邏輯結構:
3.2、資料存放區結構MongoDB對國內使用者來說比較新,它就像是一個黑盒子,但是如果對於它內部的資料存放區瞭解多一些的話,那麼就會很快的理解和駕馭MongoDB,讓它發揮更大的作用。MongoDB的預設資料目錄是/daba/db,它負責儲存所有的MongoDB的資料檔案,在MongoDB內部,每個資料庫都包含一個.ns檔案和一些資料檔案,而且這些檔案會隨著資料量的增加變的越來越多,所以如果系統中有一個叫做foo的資料庫,那麼構成foo這個資料庫的檔案就會由foo.ns、foo.0、foo.1、foo.2等組成,具體如下:
MongoDB內部有預分配空間的機制,每個預分配的檔案都用0進行填充,由於有了這個機制,MongoDB始終保持額外的空間和空餘的資料檔案,從而有效避免了由於資料暴增而帶來的磁碟壓力過大的問題。由於表中資料量的增加,資料檔案每新分配一次,它的大小都會是上一個資料檔案大小的2倍,每個資料檔案最大2G,這樣的機制有利於防止較小的資料庫浪費過多的磁碟空間,同時又能保證較大的資料庫有相應的預留空間使用。資料庫的每張表都對應一個命名空間,每個索引也有對應的命名空間,這些命名空間的中繼資料集中在*.ns檔案中。在中。foo這個資料庫包含3個檔案用於儲存表和索引資料,foo.2檔案屬於預分配的空檔案,foo.0和foo.1這兩個資料檔案被分為了相應的盤區對應不同的名字空間。
顯示了命名空間和盤區的關係,每個命名空間可以包含多個不同的盤區,這些盤區並不是連續的,與資料檔案的增長相同,每個命名空間對應的盤區大小的而是隨著分配的次數不斷增長的,這樣做的目的是為了平衡命名空間浪費的空間與保持某一個命名空間中資料的連續性,中還有一個需要注意的命名空間:$freelist,這個命名空間使用者記錄不再使用的盤區(被刪除的Collection或者索引),每當命令空間需要分配新的盤區的時候,都會先查看$freelist是否有大小合適的盤區可以使用,這樣就回收閒置磁碟空間。
第一部分 基礎篇 第三章 MongoDB體繫結構