目錄
目錄
一、NoSQL
1、關系型資料庫遵循ACID規則
2、分布式系統
3、分布式計算的優點
4、分布式計算的缺點
5、什麼是NoSQL?
6、NoSQL 簡史
7、NoSQL的優點/缺點
8、NoSQL 資料庫分類
二、MongoDB概念解析
1、資料庫
2、文檔
3、集合
4、中繼資料
5、MongoDB資料類型
三、MongoDB簡介
1、什麼是mongoDB?
2、主要特點
3、MongoDB的下載下傳
4、MongoDB工具
一、NoSQL
NoSQL(NoSQL = Not Only SQL ),意即"不僅僅是SQL"。
如今是大資料時代,資料存儲加管理就很重要,實踐證明,關系模型是非常适合于客戶伺服器程式設計,現在它是主導技術,NoSQL 是一項全新的資料庫革命性運動,早期就有人提出,發展至2009年趨勢越發高漲。NoSQL的擁護者們提倡運用非關系型的資料存儲,相對于鋪天蓋地的關系型資料庫運用,這一概念無疑是一種全新的思維的注入。
1、關系型資料庫遵循ACID規則
A (Atomicity) 原子性
原子性很容易了解,也就是說事務裡的所有操作要麼全部做完,要麼都不做,事務成功的條件是事務裡的所有操作都成功,隻要有一個操作失敗,整個事務就失敗,需要復原。
比如銀行轉賬,從A賬戶轉100元至B賬戶,分為兩個步驟:1)從A賬戶取100元;2)存入100元至B賬戶。這兩步要麼一起完成,要麼一起不完成,如果隻完成第一步,第二步失敗,錢會莫名其妙少了100元。
C (Consistency) 一緻性
一緻性也比較容易了解,也就是說資料庫要一直處于一緻的狀态,事務的運作不會改變資料庫原本的一緻性限制。
例如現有完整性限制a+b=10,如果一個事務改變了a,那麼必須得改變b,使得事務結束後依然滿足a+b=10,否則事務失敗。
I (Isolation) 獨立性
所謂的獨立性是指并發的事務之間不會互相影響,如果一個事務要通路的資料正在被另外一個事務修改,隻要另外一個事務未送出,它所通路的資料就不受未送出事務的影響。
比如現有有個交易是從A賬戶轉100元至B賬戶,在這個交易還未完成的情況下,如果此時B查詢自己的賬戶,是看不到新增加的100元的。
D (Durability) 持久性
持久性是指一旦事務送出後,它所做的修改将會永久的儲存在資料庫上,即使出現當機也不會丢失。
2、分布式系統
由多台計算機和通信的軟體元件通過計算機網絡連接配接(本地網絡或廣域網)組成。
3、分布式計算的優點
可靠性(容錯) :
分布式計算系統中的一個重要的優點是可靠性。一台伺服器的系統崩潰并不影響到其餘的伺服器。
可擴充性:
在分布式計算系統可以根據需要增加更多的機器。
資源共享:
共享資料是必不可少的應用,如銀行,預訂系統。
靈活性:
由于該系統是非常靈活的,它很容易安裝,實施和調試新的服務。
更快的速度:
分布式計算系統可以有多台計算機的計算能力,使得它比其他系統有更快的處理速度。
開放系統:
由于它是開放的系統,本地或者遠端都可以通路到該服務。
更高的性能:
相較于集中式計算機網絡叢集可以提供更高的性能(及更好的成本效益)。
4、分布式計算的缺點
故障排除:
故障排除和診斷問題。
軟體:
更少的軟體支援是分布式計算系統的主要缺點。
網絡:
網絡基礎設施的問題,包括:傳輸問題,高負載,資訊丢失等。
安全性:
開發系統的特性讓分布式計算系統存在着資料的安全性和共享的風險等問題。
5、什麼是NoSQL?
NoSQL,指的是非關系型的資料庫。NoSQL有時也稱作Not Only SQL的縮寫,是對不同于傳統的關系型資料庫的資料庫管理系統的統稱。
NoSQL用于超大規模資料的存儲。(例如谷歌或Facebook每天為他們的使用者收集萬億比特的資料)。這些類型的資料存儲不需要固定的模式,無需多餘操作就可以橫向擴充。
6、NoSQL 簡史
NoSQL一詞最早出現于1998年,是Carlo Strozzi開發的一個輕量、開源、不提供SQL功能的關系資料庫。
2009年,Last.fm的Johan Oskarsson發起了一次關于分布式開源資料庫的讨論[2],來自Rackspace的Eric Evans再次提出了NoSQL的概念,這時的NoSQL主要指非關系型、分布式、不提供ACID的資料庫設計模式。
2009年在亞特蘭大舉行的"no:sql(east)"讨論會是一個裡程碑,其口号是"select fun, profit from real_world where relational=false;"。是以,對NoSQL最普遍的解釋是"非關聯型的",強調Key-Value Stores和文檔資料庫的優點,而不是單純的反對RDBMS。
7、NoSQL的優點/缺點
優點:
- - 高可擴充性
- - 分布式計算
- - 低成本
- - 架構的靈活性,半結構化資料
- - 沒有複雜的關系
缺點:
- - 沒有标準化
- - 有限的查詢功能(到目前為止)
- - 最終一緻是不直覺的程式
8、NoSQL 資料庫分類
類型 | 部分代表 | 特點 |
列存儲 | Hbase Cassandra Hypertable | 顧名思義,是按列存儲資料的。最大的特點是友善存儲結構化和半結構化資料,友善做資料壓縮,對針對某一列或者某幾列的查詢有非常大的IO優勢。 |
文檔存儲 | MongoDB CouchDB | 文檔存儲一般用類似json的格式存儲,存儲的内容是文檔型的。這樣也就有有機會對某些字段建立索引,實作關系資料庫的某些功能。 |
key-value存儲 | Tokyo Cabinet / Tyrant Berkeley DB MemcacheDB Redis | 可以通過key快速查詢到其value。一般來說,存儲不管value的格式,照單全收。(Redis包含了其他功能) |
圖存儲 | Neo4J FlockDB | 圖形關系的最佳存儲。使用傳統關系資料庫來解決的話性能低下,而且設計使用不友善。 |
對象存儲 | db4o Versant | 通過類似面向對象語言的文法操作資料庫,通過對象的方式存取資料。 |
xml資料庫 | Berkeley DB XML BaseX | 高效的存儲XML資料,并支援XML的内部查詢文法,比如XQuery,Xpath。 |
二、MongoDB概念解析
在mongodb中基本的概念是文檔、集合、資料庫
SQL術語/概念 | MongoDB術語/概念 | 解釋/說明 |
---|---|---|
database | database | 資料庫 |
table | collection | 資料庫表/集合 |
row | document | 資料記錄行/文檔 |
column | field | 資料字段/域 |
index | index | 索引 |
table joins | 表連接配接,MongoDB不支援 | |
primary key | primary key | 主鍵,MongoDB自動将_id字段設定為主鍵 |
1、資料庫
一個MongoDB中可以建立多個資料庫。
MongoDB的預設資料庫為db,該資料存儲在data目錄中。
MongoDB的單個執行個體可以容納多個獨立的資料庫,每一個都有自己的集合和權限,不同的資料庫也放置在不同的檔案中。
"show dbs"指令可以顯示所有資料的清單,"db"可以顯示目前資料庫對象或集合,"use"指令可以連接配接到一個指定的資料庫。
資料庫也通過名字來辨別。資料庫名可以是滿足以下條件的任意UTF-8字元串。
- 不能是空字元串("")。
- 不得含有' '(空格)、.、$、/、\和\0 (空宇符)。
- 應全部小寫。
- 最多64位元組。
有一些資料庫名是保留的,可以直接通路這些有特殊作用的資料庫。
- admin: 從權限的角度來看,這是"root"資料庫。要是将一個使用者添加到這個資料庫,這個使用者自動繼承所有資料庫的權限。一些特定的伺服器端指令也隻能從這個資料庫運作,比如列出所有的資料庫或者關閉伺服器。
- local: 這個資料永遠不會被複制,可以用來存儲限于本地單台伺服器的任意集合
- config: 當Mongo用于分片設定時,config資料庫在内部使用,用于儲存分片的相關資訊。
2、文檔
文檔是一個鍵值(key-value)對(即BSON)。MongoDB 的文檔不需要設定相同的字段,并且相同的字段不需要相同的資料類型,這與關系型資料庫有很大的差別,也是 MongoDB 非常突出的特點。
一個簡單的文檔例子如下:
{"site":"www.csdn.net", "name":"CSDN"}
下表列出了 RDBMS 與 MongoDB 對應的術語:
RDBMS | MongoDB |
---|---|
資料庫 | 資料庫 |
表格 | 集合 |
行 | 文檔 |
列 | 字段 |
表聯合 | 嵌入文檔 |
主鍵 | 主鍵 (MongoDB 提供了 key 為 _id ) |
資料庫服務和用戶端 | |
Mysqld/Oracle | mongod |
mysql/sqlplus | mongo |
需要注意的是:
- 文檔中的鍵/值對是有序的。
- 文檔中的值不僅可以是在雙引号裡面的字元串,還可以是其他幾種資料類型(甚至可以是整個嵌入的文檔)。
- MongoDB區分類型和大小寫。
- MongoDB的文檔不能有重複的鍵。
- 文檔的鍵是字元串。除了少數例外情況,鍵可以使用任意UTF-8字元。
文檔鍵命名規範:
- 鍵不能含有\0 (空字元)。這個字元用來表示鍵的結尾。
- .和$有特别的意義,隻有在特定環境下才能使用。
- 以下劃線"_"開頭的鍵是保留的(不是嚴格要求的)。
3、集合
集合就是MongoDB文檔組,類似關系資料庫的table,集合存在資料庫中,沒有固定的結構,這意味着你在對集合可以插入不同格式和類型的資料,但是通常情況下我們插入集合的資料都會有一定的關聯性。
合法的集合名
- 集合名不能是空字元串""。
- 集合名不能含有\0字元(空字元),這個字元表示集合名的結尾。
- 集合名不能以"system."開頭,這是為系統集合保留的字首。
- 使用者建立的集合名字不能含有保留字元。有些驅動程式的确支援在集合名裡面包含,這是因為某些系統生成的集合中包含該字元。除非你要通路這種系統建立的集合,否則千萬不要在名字裡出現$。
capped collections
意思就是固定大小的表。建立一個capped collections 指定一個collection的大小,機關是位元組,例如:
- db.createCollection("mycoll", {capped:true, size:100000})
- 在capped collection中,你能添加新的對象。
- 能進行更新,然而,對象不會增加存儲空間。如果增加,更新就會失敗 。
- 資料庫不允許進行删除。使用drop()方法删除collection所有的行。
- 注意: 删除之後,你必須顯式的重新建立這個collection。
- 在32bit機器中,capped collection最大存儲為1e9( 1X109)個位元組。
4、中繼資料
資料庫的資訊是存儲在集合中。它們使用了系統的命名空間:
dbname.system.*
在MongoDB資料庫中名字空間 <dbname>.system.* 是包含多種系統資訊的特殊集合(Collection),如下:
集合命名空間 | 描述 |
---|---|
dbname.system.namespaces | 列出所有名字空間。 |
dbname.system.indexes | 列出所有索引。 |
dbname.system.profile | 包含資料庫概要(profile)資訊。 |
dbname.system.users | 列出所有可通路資料庫的使用者。 |
dbname.local.sources | 包含複制對端(slave)的伺服器資訊和狀态。 |
對于修改系統集合中的對象有如下限制。
在{{system.indexes}}插入資料,可以建立索引。但除此之外該表資訊是不可變的(特殊的drop index指令将自動更新相關資訊)。
{{system.users}}是可修改的。 {{system.profile}}是可删除的。
5、MongoDB資料類型
資料類型 | 描述 |
---|---|
String | 字元串。存儲資料常用的資料類型。在 MongoDB 中,UTF-8 編碼的字元串才是合法的。 |
Integer | 整型數值。用于存儲數值。根據你所采用的伺服器,可分為 32 位或 64 位。 |
Boolean | 布爾值。用于存儲布爾值(真/假)。 |
Double | 雙精度浮點值。用于存儲浮點值。 |
Min/Max keys | 将一個值與 BSON(二進制的 JSON)元素的最低值和最高值相對比。 |
Arrays | 用于将數組或清單或多個值存儲為一個鍵。 |
Timestamp | 時間戳。記錄文檔修改或添加的具體時間。 |
Object | 用于内嵌文檔。 |
Null | 用于建立空值。 |
Symbol | 符号。該資料類型基本上等同于字元串類型,但不同的是,它一般用于采用特殊符号類型的語言。 |
Date | 日期時間。用 UNIX 時間格式來存儲目前日期或時間。你可以指定自己的日期時間:建立 Date 對象,傳入年月日資訊。 |
Object ID | 對象 ID。用于建立文檔的 ID。 |
Binary Data | 二進制資料。用于存儲二進制資料。 |
Code | 代碼類型。用于在文檔中存儲 JavaScript 代碼。 |
Regular expression | 正規表達式類型。用于存儲正規表達式 |
三、MongoDB簡介
1、什麼是mongoDB?
MongoDB 是由C++語言編寫的,是一個基于分布式檔案存儲的開源資料庫系統。
在高負載的情況下,添加更多的節點,可以保證伺服器性能。
MongoDB 旨在為WEB應用提供可擴充的高性能資料存儲解決方案。
MongoDB 将資料存儲為一個文檔,資料結構由鍵值(key=>value)對組成。MongoDB 文檔類似于 JSON 對象。字段值可以包含其他文檔,數組及文檔數組。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SN3ETNlFmZ1ITYmNjY0ETMidTYyU2MiJGMxETOzgTNi9CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
2、主要特點
- MongoDB的提供了一個面向文檔存儲,操作起來比較簡單和容易。
- 你可以在MongoDB記錄中設定任何屬性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")來實作更快的排序。
- 你可以通過本地或者網絡建立資料鏡像,這使得MongoDB有更強的擴充性。
- 如果負載的增加(需要更多的存儲空間和更強的處理能力) ,它可以分布在計算機網絡中的其他節點上這就是所謂的分片。
- Mongo支援豐富的查詢表達式。查詢指令使用JSON形式的标記,可輕易查詢文檔中内嵌的對象及數組。
- MongoDb 使用update()指令可以實作替換完成的文檔(資料)或者一些指定的資料字段 。
- Mongodb中的Map/reduce主要是用來對資料進行批量處理和聚合操作。
- Map和Reduce。Map函數調用emit(key,value)周遊集合中所有的記錄,将key與value傳給Reduce函數進行處理。
- Map函數和Reduce函數是使用Javascript編寫的,并可以通過db.runCommand或mapreduce指令來執行MapReduce操作。
- GridFS是MongoDB中的一個内置功能,可以用于存放大量小檔案。
- MongoDB允許在服務端執行腳本,可以用Javascript編寫某個函數,直接在服務端執行,也可以把函數的定義存儲在服務端,下次直接調用即可。
- MongoDB支援各種程式設計語言:RUBY,PYTHON,JAVA,C++,PHP,C#等多種語言。
- MongoDB安裝簡單。
3、MongoDB的下載下傳
你可以在mongodb官網下載下傳該安裝包,位址為: http://www.mongodb.org/downloads。MonggoDB支援以下平台:
- OS X 32-bit
- OS X 64-bit
- Linux 32-bit
- Linux 64-bit
- Windows 32-bit
- Windows 64-bit
- Solaris i86pc
- Solaris 64
4、MongoDB工具
監控
MongoDB提供了網絡和系統監控工具Munin,它作為一個插件應用于MongoDB中,
Gangila是MongoDB高性能的系統監視的工具,它作為一個插件應用于MongoDB中,
基于圖形界面的開源工具Cacti,用于檢視CPU負載,網絡帶寬使用率,它也提供了一個應用于監控MongoDB的插。
GUI
- Fang of Mongo – 網頁式,由Django和jQuery所構成。
- Futon4Mongo – 一個CouchDB Futon web的mongodb山寨版。
- Mongo3 – Ruby寫成。
- MongoHub – 适用于OSX的應用程式。
- Opricot – 一個基于浏覽器的MongoDB控制台, 由PHP撰寫而成。
- Database Master — Windows的mongodb管理工具
- RockMongo — 最好的PHP語言的MongoDB管理工具,輕量級, 支援多國語言.