1. 關(guān)系型數(shù)據(jù)庫(kù)
關(guān)系型數(shù)據(jù)庫(kù),是指采用了關(guān)系模型來(lái)組織數(shù)據(jù)的數(shù)據(jù)庫(kù)。
關(guān)系模型是在1970年由IBM的研究員E.F.Codd博士首先提出的,在之后的幾十年中,關(guān)系模型的概念得到了充分的發(fā)展并逐漸成為主流數(shù)據(jù)庫(kù)結(jié)構(gòu)的主流模型。
簡(jiǎn)單來(lái)說(shuō),關(guān)系模型指的就是二維表格模型,而一個(gè)關(guān)系型數(shù)據(jù)庫(kù)就是由二維表及其之間的聯(lián)系所組成的一個(gè)數(shù)據(jù)組織。
關(guān)系模型中常用的概念:
關(guān)系:可以理解為一張二維表,每個(gè)關(guān)系都具有一個(gè)關(guān)系名,就是通常說(shuō)的表名元組:可以理解為二維表中的一行,在數(shù)據(jù)庫(kù)中經(jīng)常被稱為記錄屬性:可以理解為二維表中的一列,在數(shù)據(jù)庫(kù)中經(jīng)常被稱為字段域:屬性的取值范圍,也就是數(shù)據(jù)庫(kù)中某一列的取值限制關(guān)鍵字:一組可以唯一標(biāo)識(shí)元組的屬性,數(shù)據(jù)庫(kù)中常稱為主鍵,由一個(gè)或多個(gè)列組成關(guān)系模式:指對(duì)關(guān)系的描述。其格式為:關(guān)系名(屬性1,屬性2, … … ,屬性N),在數(shù)據(jù)庫(kù)中成為表結(jié)構(gòu)
關(guān)系型數(shù)據(jù)庫(kù)的優(yōu)點(diǎn):
容易理解:二維表結(jié)構(gòu)是非常貼近邏輯世界的一個(gè)概念,關(guān)系模型相對(duì)網(wǎng)狀、層次等其他模型來(lái)說(shuō)更容易理解使用方便:通用的SQL語(yǔ)言使得操作關(guān)系型數(shù)據(jù)庫(kù)非常方便易于維護(hù):豐富的完整性(實(shí)體完整性、參照完整性和用戶定義的完整性)大大減低了數(shù)據(jù)冗余和數(shù)據(jù)不一致的概率2. 關(guān)系型數(shù)據(jù)庫(kù)瓶頸
高并發(fā)讀寫需求
網(wǎng)站的用戶并發(fā)性非常高,往往達(dá)到每秒上萬(wàn)次讀寫請(qǐng)求,對(duì)于傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)來(lái)說(shuō),硬盤I/O是一個(gè)很大的瓶頸
海量數(shù)據(jù)的高效率讀寫
網(wǎng)站每天產(chǎn)生的數(shù)據(jù)量是巨大的,對(duì)于關(guān)系型數(shù)據(jù)庫(kù)來(lái)說(shuō),在一張包含海量數(shù)據(jù)的表中查詢,效率是非常低的
高擴(kuò)展性和可用性
在基于web的結(jié)構(gòu)當(dāng)中,數(shù)據(jù)庫(kù)是最難進(jìn)行橫向擴(kuò)展的,當(dāng)一個(gè)應(yīng)用系統(tǒng)的用戶量和訪問(wèn)量與日俱增的時(shí)候,數(shù)據(jù)庫(kù)卻沒(méi)有辦法像web server和app server那樣簡(jiǎn)單的通過(guò)添加更多的硬件和服務(wù)節(jié)點(diǎn)來(lái)擴(kuò)展性能和負(fù)載能力。對(duì)于很多需要提供24小時(shí)不間斷服務(wù)的網(wǎng)站來(lái)說(shuō),對(duì)數(shù)據(jù)庫(kù)系統(tǒng)進(jìn)行升級(jí)和擴(kuò)展是非常痛苦的事情,往往需要停機(jī)維護(hù)和數(shù)據(jù)遷移。
對(duì)網(wǎng)站來(lái)說(shuō),關(guān)系型數(shù)據(jù)庫(kù)的很多特性不再需要了:
事務(wù)一致性
關(guān)系型數(shù)據(jù)庫(kù)在對(duì)事物一致性的維護(hù)中有很大的開銷,而現(xiàn)在很多web2.0系統(tǒng)對(duì)事物的讀寫一致性都不高
讀寫實(shí)時(shí)性
對(duì)關(guān)系數(shù)據(jù)庫(kù)來(lái)說(shuō),插入一條數(shù)據(jù)之后立刻查詢,是肯定可以讀出這條數(shù)據(jù)的,但是對(duì)于很多web應(yīng)用來(lái)說(shuō),并不要求這么高的實(shí)時(shí)性,比如發(fā)一條消息之后,過(guò)幾秒乃至十幾秒之后才看到這條動(dòng)態(tài)是完全可以接受的
復(fù)雜SQL,特別是多表關(guān)聯(lián)查詢
任何大數(shù)據(jù)量的web系統(tǒng),都非常忌諱多個(gè)大表的關(guān)聯(lián)查詢,以及復(fù)雜的數(shù)據(jù)分析類型的復(fù)雜SQL報(bào)表查詢,特別是SNS類型的網(wǎng)站,從需求以及產(chǎn)品階級(jí)角度,就避免了這種情況的產(chǎn)生。往往更多的只是單表的主鍵查詢,以及單表的簡(jiǎn)單條件分頁(yè)查詢,SQL的功能極大的弱化了
在關(guān)系型數(shù)據(jù)庫(kù)中,導(dǎo)致性能欠佳的最主要原因是多表的關(guān)聯(lián)查詢,以及復(fù)雜的數(shù)據(jù)分析類型的復(fù)雜SQL報(bào)表查詢。為了保證數(shù)據(jù)庫(kù)的ACID特性,我們必須盡量按照其要求的范式進(jìn)行設(shè)計(jì),關(guān)系型數(shù)據(jù)庫(kù)中的表都是存儲(chǔ)一個(gè)格式化的數(shù)據(jù)結(jié)構(gòu)。每個(gè)元組字段的組成都是一樣,即使不是每個(gè)元組都需要所有的字段,但數(shù)據(jù)庫(kù)會(huì)為每個(gè)元組分配所有的字段,這樣的結(jié)構(gòu)可以便于標(biāo)語(yǔ)表之間進(jìn)行鏈接等操作,但從另一個(gè)角度來(lái)說(shuō)它也是關(guān)系型數(shù)據(jù)庫(kù)性能瓶頸的一個(gè)因素。
3. NoSQL
NoSQL一詞首先是Carlo Strozzi在1998年提出來(lái)的,指的是他開發(fā)的一個(gè)沒(méi)有SQL功能,輕量級(jí)的,開源的關(guān)系型數(shù)據(jù)庫(kù)。這個(gè)定義跟我們現(xiàn)在對(duì)NoSQL的定義有很大的區(qū)別,它確確實(shí)實(shí)字如其名,指的就是“沒(méi)有SQL”的數(shù)據(jù)庫(kù)。但是NoSQL的發(fā)展慢慢偏離了初衷,我們要的不是“no sql”,而是“no relational”,也就是我們現(xiàn)在常說(shuō)的非關(guān)系型數(shù)據(jù)庫(kù)了。
2009年初,Johan Oskarsson舉辦了一場(chǎng)關(guān)于開源分布式數(shù)據(jù)庫(kù)的討論,Eric Evans在這次討論中再次提出了NoSQL一詞,用于指代那些非關(guān)系型的,分布式的,且一般不保證遵循ACID原則的數(shù)據(jù)存儲(chǔ)系統(tǒng)。Eric Evans使用NoSQL這個(gè)詞,并不是因?yàn)樽置嫔系?ldquo;沒(méi)有SQL”的意思,他只是覺(jué)得很多經(jīng)典的關(guān)系型數(shù)據(jù)庫(kù)名字都叫“**SQL”,所以為了表示跟這些關(guān)系型數(shù)據(jù)庫(kù)在定位上的截然不同,就是用了“NoSQL“一詞。
注:數(shù)據(jù)庫(kù)事務(wù)必須具備ACID特性,ACID是Atomic原子性,Consistency一致性,Isolation隔離性,Durability持久性。
非關(guān)系型數(shù)據(jù)庫(kù)提出另一種理念,例如,以鍵值對(duì)存儲(chǔ),且結(jié)構(gòu)不固定,每一個(gè)元組可以有不一樣的字段,每個(gè)元組可以根據(jù)需要增加一些自己的鍵值對(duì),這樣就不會(huì)局限于固定的結(jié)構(gòu),可以減少一些時(shí)間和空間的開銷。使用這種方式,用戶可以根據(jù)需要去添加自己需要的字段,這樣,為了獲取用戶的不同信息,不需要像關(guān)系型數(shù)據(jù)庫(kù)中,要對(duì)多表進(jìn)行關(guān)聯(lián)查詢。僅需要根據(jù)id取出相應(yīng)的value就可以完成查詢。但非關(guān)系型數(shù)據(jù)庫(kù)由于很少的約束,他也不能夠提供像SQL所提供的where這種對(duì)于字段屬性值情況的查詢。并且難以體現(xiàn)設(shè)計(jì)的完整性。他只適合存儲(chǔ)一些較為簡(jiǎn)單的數(shù)據(jù),對(duì)于需要進(jìn)行較復(fù)雜查詢的數(shù)據(jù),SQL數(shù)據(jù)庫(kù)顯的更為合適。
4. 關(guān)系型數(shù)據(jù)庫(kù) V.S. 非關(guān)系型數(shù)據(jù)庫(kù)
關(guān)系型數(shù)據(jù)庫(kù)的最大特點(diǎn)就是事務(wù)的一致性:傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)讀寫操作都是事務(wù)的,具有ACID的特點(diǎn),這個(gè)特性使得關(guān)系型數(shù)據(jù)庫(kù)可以用于幾乎所有對(duì)一致性有要求的系統(tǒng)中,如典型的銀行系統(tǒng)。
但是,在網(wǎng)頁(yè)應(yīng)用中,尤其是SNS應(yīng)用中,一致性卻不是顯得那么重要,用戶A看到的內(nèi)容和用戶B看到同一用戶C內(nèi)容更新不一致是可以容忍的,或者說(shuō),兩個(gè)人看到同一好友的數(shù)據(jù)更新的時(shí)間差那么幾秒是可以容忍的,因此,關(guān)系型數(shù)據(jù)庫(kù)的最大特點(diǎn)在這里已經(jīng)無(wú)用武之地,起碼不是那么重要了。
相反地,關(guān)系型數(shù)據(jù)庫(kù)為了維護(hù)一致性所付出的巨大代價(jià)就是其讀寫性能比較差,而像微博、facebook這類SNS的應(yīng)用,對(duì)并發(fā)讀寫能力要求極高,關(guān)系型數(shù)據(jù)庫(kù)已經(jīng)無(wú)法應(yīng)付(在讀方面,傳統(tǒng)上為了克服關(guān)系型數(shù)據(jù)庫(kù)缺陷,提高性能,都是增加一級(jí)memcache來(lái)靜態(tài)化網(wǎng)頁(yè),而在SNS中,變化太快,memchache已經(jīng)無(wú)能為力了),因此,必須用新的一種數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)來(lái)代替關(guān)系數(shù)據(jù)庫(kù)。
關(guān)系數(shù)據(jù)庫(kù)的另一個(gè)特點(diǎn)就是其具有固定的表結(jié)構(gòu),因此,其擴(kuò)展性極差,而在SNS中,系統(tǒng)的升級(jí),功能的增加,往往意味著數(shù)據(jù)結(jié)構(gòu)巨大變動(dòng),這一點(diǎn)關(guān)系型數(shù)據(jù)庫(kù)也難以應(yīng)付,需要新的結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)。
于是,非關(guān)系型數(shù)據(jù)庫(kù)應(yīng)運(yùn)而生,由于不可能用一種數(shù)據(jù)結(jié)構(gòu)化存儲(chǔ)應(yīng)付所有的新的需求,因此,非關(guān)系型數(shù)據(jù)庫(kù)嚴(yán)格上不是一種數(shù)據(jù)庫(kù),應(yīng)該是一種數(shù)據(jù)結(jié)構(gòu)化存儲(chǔ)方法的集合。
必須強(qiáng)調(diào)的是,數(shù)據(jù)的持久存儲(chǔ),尤其是海量數(shù)據(jù)的持久存儲(chǔ),還是需要一種關(guān)系數(shù)據(jù)庫(kù)這員老將。
5. 非關(guān)系型數(shù)據(jù)庫(kù)分類
由于非關(guān)系型數(shù)據(jù)庫(kù)本身天然的多樣性,以及出現(xiàn)的時(shí)間較短,因此,不想關(guān)系型數(shù)據(jù)庫(kù),有幾種數(shù)據(jù)庫(kù)能夠一統(tǒng)江山,非關(guān)系型數(shù)據(jù)庫(kù)非常多,并且大部分都是開源的。
這些數(shù)據(jù)庫(kù)中,其實(shí)實(shí)現(xiàn)大部分都比較簡(jiǎn)單,除了一些共性外,很大一部分都是針對(duì)某些特定的應(yīng)用需求出現(xiàn)的,因此,對(duì)于該類應(yīng)用,具有極高的性能。依據(jù)結(jié)構(gòu)化方法以及應(yīng)用場(chǎng)合的不同,主要分為以下幾類:
面向高性能并發(fā)讀寫的key-value數(shù)據(jù)庫(kù):
key-value數(shù)據(jù)庫(kù)的主要特點(diǎn)即使具有極高的并發(fā)讀寫性能,Redis,Tokyo Cabinet,Flare就是這類的代表
面向海量數(shù)據(jù)訪問(wèn)的面向文檔數(shù)據(jù)庫(kù):
這類數(shù)據(jù)庫(kù)的特點(diǎn)是,可以在海量的數(shù)據(jù)中快速的查詢數(shù)據(jù),典型代表為MongoDB以及CouchDB
面向可擴(kuò)展性的分布式數(shù)據(jù)庫(kù):
這類數(shù)據(jù)庫(kù)想解決的問(wèn)題就是傳統(tǒng)數(shù)據(jù)庫(kù)存在可擴(kuò)展性上的缺陷,這類數(shù)據(jù)庫(kù)可以適應(yīng)數(shù)據(jù)量的增加以及數(shù)據(jù)結(jié)構(gòu)的變化。