1. 程式人生 > >NoSQL資料庫資料模型(筆記)

NoSQL資料庫資料模型(筆記)

NoSQL(Nosql=Not only Sql),意即不僅僅是SQL。泛指非關係型資料庫
這些型別的資料儲存不需要固定的模式,無需多餘的操作就可以橫向擴充套件。

NoSQL資料庫種類繁多,但是一個共同的特點都是去掉關係資料庫的關係型特性。
資料之間無關係,這樣就非常容易擴充套件,也無形之間在架構的層面上帶來了可擴充套件的能力。

NoSQL無需事先為要儲存的資料建立欄位,隨時可以儲存自定義的資料格式,而在關係型資料庫中,增刪欄位是一件非常麻煩的事,如果是非常大資料量的表,增加欄位簡直是一個噩夢。

大資料時代的3V:海量Volume,多樣Variety,實時Velocity
網際網路需求的3高:高可用,高效能,高可擴

當下應用是sql和nosql一起使用。
關係型資料庫用來儲存不怎麼變的資訊。

傳統的關係型資料庫設計:ER圖(1:1/1:N/N:N,主外來鍵等常見)
NoSQL資料庫設計:用BSon構建資料模型

高併發的操作不太簡易有關聯查詢的(join),網際網路公司用冗餘資料來避免關聯查詢,分散式事務是支援不了太多的併發的。

NoSQL資料模型簡介:聚合模型(KV鍵值、BSon、列簇、圖形)
列簇:是按列儲存資料的,最大的特點是方便儲存結構化和半結構化資料,方便做資料壓縮,對針對某一列或某幾列的查詢有非常大的IO優勢。

NoSQL資料庫分類:
1.鍵值(key-value) redis
應用場景:內容快取,主要用於處理大量資料的高訪問負載,也用於一些日誌系統等。
資料模型:Key指向Value的鍵值對,通常用hashtable來實現
優點:查詢速度塊
缺點:資料無結構化,通常只被當作字串或二進位制資料
2.列儲存資料庫 HBase


應用場景:分散式檔案系統
資料模型:以列簇式儲存,將同一列資料儲存在一起
優點:查詢速度塊,可擴充套件性強,更容易進行分散式擴充套件
缺點:功能相對侷限
3.文件型資料庫 MongoDb
應用場景:web應用,與Key-value型別相似,value是結構化的,不同的是資料庫能夠了解value的內容。
資料型別:Key-value對應的鍵值對,value為結構化資料。
優點:資料結構要求不嚴格,表結構可變,不需要像關係型資料庫一樣需要預先定義表結構
缺點:查詢效能不高,而且缺乏統一的查詢語法
4.圖形資料庫 Neo4J
應用場景:社交網路,推薦系統等。專注於構建關係圖譜。
資料模型:圖結構
優點:利用圖結構相關演算法,如最短路徑定址、N度關係查詢

傳統的ACID:原子性(Atomicity)、一致性(Consistency)、獨立性(Isolation)、永續性(Durability)

1. 原子性
一個原子事務要麼完整執行,要麼乾脆不執行。這意味著,工作單元中的每項任務都必須正確執行。如果有任一任務執行失敗,則整個工作單元或事務就會被終止。即此前對資料所作的任何修改都將被撤銷。如果所有任務都被成功執行,事務就會被提交,即對資料所作的修改將會是永久性的。
2. 一致性
一致性代表了底層資料儲存的完整性。它必須由事務系統和應用開發人員共同來保證。事務系統通過保證事務的原子性,隔離性和永續性來滿足這一要求; 應用開發人員則需要保證資料庫有適當的約束(主鍵,引用完整性等),並且工作單元中所實現的業務邏輯不會導致資料的不一致(即,資料預期所表達的現實業務情況不相一致)。例如,在一次轉賬過程中,從某一賬戶中扣除的金額必須與另一賬戶中存入的金額相等。
3. 獨立性
獨立性意味著事務必須在不干擾其他程序或事務的前提下獨立執行。換言之,在事務或工作單元執行完畢之前,其所訪問的資料不能受系統其他部分的影響。
4. 永續性
永續性表示在某個事務的執行過程中,對資料所作的所有改動都必須在事務成功結束前儲存至某種物理儲存裝置。這樣可以保證,所作的修改在任何系統癱瘓時不至於丟失。

NoSQL資料庫中CAP原理:Consistency(強一致性)、Availability(可用性)、Partition tolerace(分割槽容忍性)

CAP理論的核心是:一個分散式系統不可能同時很好的滿足一致性,可用性和分割槽容錯性,最多隻能同時較好的滿足兩個。

因此CAP理論將NoSQL分成了滿足CA、CP、AP原則的三大類。
CA:單點叢集,滿足一致性、可用性的系統,通常在可擴充套件性不太強
CP:滿足一致性、分割槽容忍性的系統,通常效能不是特別高
AP:滿足可用性、分割槽容忍性的系統,通常對一致性要求低一些

而由於當前網路硬體肯定會出現延遲丟包等問題,所以分割槽容錯性必須需要實現。
CA 傳統Oracle資料庫
AP 大多網站架構的選擇
CP Redis MongoDb

資料庫一致性需求:
很多web實時系統並不要求嚴格的資料庫事務,對讀一致性的要求低,有些場合對寫一致性要求並不高,允許實現最終一致性。

資料庫的寫實時性和讀實時性:
對關係資料庫來說,插入一條資料後立刻查詢,肯定是可以讀出這條資料的,但是對於很多web應用來說,並不要求這麼高的實時性,比如說傳送一條訊息之後,過幾秒乃至十幾秒後,我的訂閱者才能看到這條動態是完全可以接受的。

BASE就是為了解決關係資料庫強一致性引起的問題而引起的可用性降低而提出的解決方案。
BASE是下面三個術語的縮寫:
1.基本可用(Basically Available)
2.軟狀態(Soft state)
3.最終一致性(Eventually consistent)

它的思想是通過讓系統放鬆對某一時刻資料一致性的要求來換取系統整體伸縮性和效能上改變。

分散式系統(distributed system)
由多臺計算機和通訊的軟體元件通過計算機網路連結(本地網路或廣域網)組成,分散式系統是建立在網路之上的軟體系統。正是因為軟體的特性,所以分散式系統是具有高度的內聚性和透明性。因此,網路和分散式系統之間的區別更多的在於高層軟體(特別是作業系統),而不是硬體。分散式系統可以應用在不同的平臺上,如:PC、工作站、區域網或廣域網等。

簡單來講:
1.分散式:不同的多臺伺服器上部署不同的服務模組(工程),他們之間通過Rpc/Rmi之間通訊和呼叫,對外提供服務和組內協作。
2.叢集:不同的多臺伺服器部署相同的模組,通過分散式排程軟體進行統一的排程,對外提供服務和訪問。