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