關係及數據庫

引子

數據庫可以分爲關係型數據庫和非關係型數據庫,這裏的關係是什麼?從關係型數據庫最初被提出的概念中,可以總結出:關係是現實世界的實體以及實體間的各種聯繫,用二維表的形式表示。

從這個概念中可以得知,關係型數據庫的一個要求就是裏面存的東西是實體,這就要求關係型數據裏存的都是沒有重複的二維表。這裏的兩個概念值得深思:

  • 實體
    沒有重複是因爲存的是實體,不可能有兩個完全相同的實體。比如,數據庫裏存着“老師”實體的表,這張表裏不能放着兩個完全相同的老師,他們可能有的性別相同,有的名字相同,但是一定有一個地方不用,這樣的表中一般有一個能區別所有人的標識,在數據庫中稱爲“主鍵”。

  • 二維表
    表是可視化交流模式,又是一種組織整理數據的手段。用二維表是因爲二維表最爲接近人類對於現實世界的理解,同時也方便查找和比較。以“老師”實體的表爲例,一行表示一個具體的老師,一列表示一個具體的特徵,比如:姓名、性別、科目。

關係型數據庫 vs 非關係型數據庫

關係型數據庫,是指採用了關係模型來組織數據的數據庫。關係模型1970年提出的,關係模型的概念得到了充分的發展並逐漸成爲主流數據庫結構的主流模型。簡單來說,關係模型指的就是二維表格模型,而一個關係型數據庫就是由二維表及其之間的聯繫所組成的一個數據組織。

關係型數據庫的優點
  1. 容易理解:二維表結構是非常貼近邏輯世界的一個概念,關係模型相對網狀、層次等其他模型來說更容易理解。
  2. 使用方便:通用的SQL語言使得操作關係型數據庫非常方便。
  3. 易於維護:豐富的完整性(實體完整性、參照完整性和用戶定義的完整性)大大減低了數據冗餘和數據不一致的概率。

關係型數據庫的優點讓它在數據的存儲和查找當面統治了很長時間。

關係型數據庫的瓶頸
  1. 高併發讀寫需求:網站的用戶併發性非常高,往往達到每秒上萬次讀寫請求,對於傳統關係型數據庫來說,硬盤I/O是一個很大的瓶頸
  2. 海量數據的高效率讀寫:網站每天產生的數據量是巨大的,對於關係型數據庫來說,在一張包含海量數據的表中查詢,效率是非常低的
  3. 高擴展性和可用性:在基於web的結構當中,數據庫是最難進行橫向擴展的,當一個應用系統的用戶量和訪問量與日俱增的時候,數據庫卻沒有辦法像web server和app server那樣簡單的通過添加更多的硬件和服務節點來擴展性能和負載能力。對於很多需要提供24小時不間斷服務的網站來說,對數據庫系統進行升級和擴展是非常痛苦的事情,往往需要停機維護和數據遷移。

而且對網站來說,關係型數據庫的很多特性不再需要了:

  1. 事務一致性:關係型數據庫在對事物一致性的維護中有很大的開銷,而現在很多web2.0系統對事物的讀寫一致性都不高。
  2. 讀寫實時性:對關係數據庫來說,插入一條數據之後立刻查詢,是肯定可以讀出這條數據的,但是對於很多web應用來說,並不要求這麼高的實時性,比如發一條消息之後,過幾秒乃至十幾秒之後纔看到這條動態是完全可以接受的
  3. 複雜SQL,特別是多表關聯查詢:任何大數據量的web系統,都非常忌諱多個大表的關聯查詢,以及複雜的數據分析類型的複雜SQL報表查詢,特別是SNS類型的網站(SNS,專指社交網絡服務,包括了社交軟件和社交網站。),從需求以及產品階級角度,就避免了這種情況的產生。往往更多的只是單表的主鍵查詢,以及單表的簡單條件分頁查詢,SQL的功能極大的弱化了

關係型數據庫的霸主地位逐漸動搖,非關係型數據庫應用而生。

非關係型數據庫

非關係型數據庫提出另一種理念,例如,以鍵值對存儲,且結構不固定,每一個元組可以有不一樣的字段,每個元組可以根據需要增加一些自己的鍵值對,這樣就不會侷限於固定的結構,可以減少一些時間和空間的開銷。使用這種方式,用戶可以根據需要去添加自己需要的字段,這樣,爲了獲取用戶的不同信息,不需要像關係型數據庫中,要對多表進行關聯查詢。僅需要根據id取出相應的value就可以完成查詢。但非關係型數據庫由於很少的約束,他也不能夠提供像SQL所提供的where這種對於字段屬性值情況的查詢。並且難以體現設計的完整性。他只適合存儲一些較爲簡單的數據,由於不可能用一種數據結構化存儲應付所有的新的需求,因此,非關係型數據庫嚴格上不是一種數據庫,應該是一種數據結構化存儲方法的集合。對於需要進行較複雜查詢的數據,SQL數據庫顯的更爲合適。

這些數據庫中,其實實現大部分都比較簡單,除了一些共性外,很大一部分都是針對某些特定的應用需求出現的,因此,對於該類應用,具有極高的性能。依據結構化方法以及應用場合的不同,主要分爲以下幾類:

  1. 面向高性能併發讀寫的key-value數據庫:key-value數據庫的主要特點即使具有極高的併發讀寫性能,Redis,Tokyo Cabinet,Flare就是這類的代表。
  2. 面向海量數據訪問的面向文檔數據庫:這類數據庫的特點是,可以在海量的數據中快速的查詢數據,典型代表爲MongoDB以及CouchDB。
  3. 面向可擴展性的分佈式數據庫:這類數據庫想解決的問題就是傳統數據庫存在可擴展性上的缺陷,這類數據庫可以適應數據量的增加以及數據結構的變化。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章