關系型數據庫
所謂關系型數據庫,,就是指采用了關系模型來組織數據的數據庫。
什么是關系模型,簡單說,關系模型就是二維表格模型,而一個關系型數據庫就是由二維表及其之間的聯系所組成的一個數據組織。
關系模型中常用的概念:
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中,系統的升級、功能的增加,往往意味着數據結構巨大的變動,這一點關系型數據庫也難以應付,需要新的結構化數據存儲,
於是,非關系型數據庫就應運而生,由於不可能用一種數據結構化存儲應付所有的新需求,因此非關系型數據庫嚴格上不是一種數據庫,應該是一種數據結構化存儲方法的集合