關係型資料庫
所謂關係型資料庫,,就是指採用了關係模型來組織資料的資料庫。
什麼是關係模型,簡單說,關係模型就是二維表格模型,而一個關係型資料庫就是由二維表及其之間的聯絡所組成的一個資料組織。
關係模型中常用的概念:
1、關係
可以理解為一張二維表,每個關係都有一個關係名,在資料庫中被稱為表名
2、元組
可以理解為二維表中的一行,在資料庫中被稱為記錄
3、屬性
可以理解為二維表中的一列,在資料庫中被稱為欄位
4、域
屬性的取值範圍,在資料庫中為某一列的取值限制
5、關鍵字
一族可以唯一標識元組的屬性,在資料庫中被稱為主鍵
6、關係模型
指對關係的描述,其格式為:關係名(屬性1、屬性2、屬性3、...、屬性N),在資料庫中稱為表結構
關係型資料庫的優缺點
關係型資料庫有如下優點:
1、容易理解
二維表結構是非常貼近邏輯世界的一個概念,關係模型相對網狀、層次等其他模型來說更容易理解
2、使用方便
通用的SQL語言使得操作關係型資料非常方便
3、易於維護
豐富的完整性(實體完整性、參照完整性和使用者定義的完整性)大大見底了資料冗餘和資料不一致的概率
關係型資料庫有如下缺點:
1、高併發讀寫
網站的使用者併發性非常高,往往達到每秒上萬次的讀寫請求,對於傳統關係型資料庫來說,硬碟I/O是一個很大的瓶頸
2、海量資料的高效率讀寫
網站每天產生的資料量是巨大的,對於關係型資料庫來說,在一張包含海量資料的表中查詢,效率是很低的
3、擴充套件性和可用性低
基於Web的結構當中,資料庫是最難進行橫向擴充套件的,同時對於資料庫的升級也是非常痛苦的,往往需要停機維護和資料遷移
對於一個網站來說,關係型資料庫的很多特性是不需要的:
1、事務一致性
關係型資料庫在對事物一致性的維護中有很大的開銷,而現在很多Web系統對事物讀寫一致性的要求都不高
2、讀寫實時性
對關係型資料庫而言,插入一條資料之後立即查詢,那肯定是可以讀出這條資料的。但是對於很多Web系統來說並不需要這麼高的實時性,比如發了一條訊息後,過幾秒乃至十幾秒之後才看到這條動態資料是完全可以接受的
3、複雜SQL特別是多表關聯查詢
任何大資料的Web系統,都非常忌諱多個大表的關聯查詢以及複雜的資料複雜型別的複雜SQL報表查詢,對很多網站來說,都要常常避免這點,因此極大弱化了SQL的功能
NoSQL
NoSQL,Not only SQL,即不僅僅是SQL,泛指非關係型資料庫。因為傳統的關係型資料庫在應付Web2.0網站,尤其是超大規模和高併發的SNS型別的web2.0純動態網站已經顯得力不從心,暴露了很多難以克服的問題,NoSQL的產生就是為了解決大規模資料集合多重資料種類帶來的挑戰,尤其是大資料應用難題。
NoSQL提出另一種不同的儲存理念,例如以鍵值對儲存,且結構不固定,每一個元組可以有不一樣的欄位,每個元組可以根據需要增加一些自己的鍵值對,這樣就不會侷限於固定的結構,可以減少一些時間和空間的開銷。使用這種方式,使用者可以根據需要去新增自己的資源,這樣獲取資訊的時候就不需要像關係型資料庫那樣,對多表進行關聯查詢了。只需要根據鍵,拿到對應的value就可以完成一次查詢。
不過,NoSQL由於極少的約束,因此它不能夠像關係型資料庫所提供的where這種對於欄位屬性值情況的查詢,並且難以體現設計的完整性,它只適合儲存一些較為簡單的資料,對於需要進行較複雜查詢的資料,關係型資料庫顯得更為合適。
關係型資料庫VS非關係型資料庫
關係型資料庫最大的特點就是事物的一致性:傳統的關係型資料庫讀寫操作都是事物的,具有ACID的特點,這個特性使得關係型資料庫可以用在幾乎所有對一致性有要求的系統中,比如火車購票系統,搶票的時候同一時間只能有一個使用者搶到某一張固定的車票。
但是,在網頁應用中,尤其是SNS應用中,一致性卻不是顯得那麼重要,比方說淘寶吧,某件商品有10個庫存量,使用者A和使用者B同時點了下單,照理說應該點選之後使用者A和使用者B看到的剩餘庫存量應該是8,但是實際上他們看到的可能同時都是9,這又有什麼關係呢?在某些業務場景下,資料在幾秒、十幾秒的更新存在時間差是完全可以容忍的,因此,關係型資料庫的最大特點在這裡已經被淡化了。
相反地,關係型資料庫為了維護一致性所付出的巨大代價就是其讀寫效能較差,而像微博、facebook這類SNS應用,對併發讀寫能力要求極高,關係型資料庫已經無法應對了,因此,必須用一種新型的資料結構來替代關係型資料庫。
關係型資料庫的另一個特點就是其具有固定的表結構,因此,其擴充套件效能極差,而在SNS中,系統的升級、功能的增加,往往意味著資料結構巨大的變動,這一點關係型資料庫也難以應付,需要新的結構化資料儲存,
於是,非關係型資料庫就應運而生,由於不可能用一種資料結構化儲存應付所有的新需求,因此非關係型資料庫嚴格上不是一種資料庫,應該是一種資料結構化儲存方法的集合