我們總在說各種資料庫的使用,以及各個資料庫的優缺點,每個資料庫都有自己的所擅長的領域,但選擇什麼樣的資料庫才是重點,那麼問題來了,資料庫到底是怎麼劃分的,有什麼講究呢?
資料庫大致分為兩大類:關係型資料庫和非關係型資料庫
顧名思義,就是表與表之間有關係,平時我們所用到的mssql server、oracle、mysql等都是關係型資料庫,它們是建立在關係模型基礎上的資料庫,依靠表、欄位等關係模型,結合集合代數等數學方法來處理資料。
關係型資料庫中的表都是儲存一些格式化的資料結構,每個元組欄位的組成都一樣,即使不是每個元組都需要所有的字段,但資料庫會為每個元組分配所有的字段,這樣的結構可以便於表與表之間進行連線等操作,但從另乙個角度來說它也是關係型資料庫效能瓶頸的乙個因素。
並且資料庫的資料主要儲存在磁碟。
資料庫的 sql 語句強大,支援更為複雜的計算。
就是表與表之間沒有直接關係,建立的話也不用遵循三大正規化,並且是以鍵值對儲存,它的結構不固定,每乙個元組可以有不一樣的字段,每個元組可以根據需要增加一些自己的鍵值對,這樣就不會侷限於固定的結構,可以減少一些時間和空間的開銷。可以處理超大量的資料,執行在便宜的pc伺服器集群上,能很大程度上的節省開銷。
nosql 的資料主要儲存在記憶體中(部分可以持久化到磁碟),而且資料結構比較簡單,雖然能處理很多的問題,但是其功能畢竟是有限的,不如資料庫的 sql 語句強大,支援更為複雜的計算。
再次,nosql 並不完全安全穩定,由於它基於記憶體,一旦停電或者機器故障資料就很容易丟失資料,其持久化能力也是有限的,而基於磁碟的資料庫則不會出現這樣的問題。最後,其資料完整性、事務能力、安全性、可靠性及可擴充套件性都遠不及資料庫。
nosql沒有行、列的概念,用key-value的形式來儲存資料,集合就相當於「表」,文件就相當於「行」。一般而言,nosql型資料庫資料模型比較簡單,需要靈活性更強的it 系統且對資料庫效能要求較高,不需要高度的資料一致性,對於給定key,比較容易對映複雜值的環境,因此被廣泛應用於大資料分析等方面。
建表方式如下圖:
關係型資料庫的最大特點就是事務的一致性
傳統的關係型資料庫讀寫操作都是事務的,具有acid的特點,這個特性使得關係型資料庫可以用於幾乎所有對一致性有要求的系統中,如典型的銀行系統。
但是,在網頁應用中,尤其是sns應用中,一致性卻不是顯得那麼重要,使用者a看到的內容和使用者b看到同一使用者c內容更新不一致是可以容忍的,或者說,兩個人看到同一好友的資料更新的時間差那麼幾秒是可以容忍的,因此,關係型資料庫的最大特點在這裡已經無用武之地,起碼不是那麼重要了。
相反地,關係型資料庫為了維護一致性所付出的巨大代價就是其讀寫效能比較差,而像微博、facebook這類sns的應用,對併發讀寫能力要求極高,關係型資料庫已經無法應付(在讀方面,傳統上為了克服關係型資料庫缺陷,提高效能,都是增加一級memcache來靜態化網頁,而在sns中,變化太快,memchache已經無能為力了)。
因此,這個時候就必須用新的一種資料結構儲存來代替關聯式資料庫。nosql應運而生,正是因為nosql不需要高度的資料一致性,對於給定key,比較容易對映複雜值的環境, 讀寫效能高,就可以解決上述的種種問題。
關聯式資料庫的另乙個特點就是其具有固定的表結構
正因為這樣,因此,其擴充套件性極差,而在sns中,系統的公升級,功能的增加,往往意味著資料結構巨大變動,這一點關係型資料庫也難以應付,需要新的結構化資料儲存。
於是,非關係型資料庫就又有用武之地了,由於不可能用一種資料結構化儲存應付所有的新的需求,因此,非關係型資料庫嚴格上不是一種資料庫,應該是一種資料結構化儲存方法的集合。 必須強調的是,資料的持久儲存,尤其是海量資料的持久儲存,還是需要一種關聯式資料庫。
高併發讀寫需求
**的使用者併發性非常高,往往達到每秒上萬次讀寫請求,對於傳統關係型資料庫來說,硬碟i / o是乙個很大的瓶頸 。
海量資料的高效率讀寫 **每天產生的資料量是巨大的,對於關係型資料庫來說,在一張包含海量資料的表中查詢,效率是非常低的 。
擴充套件性和可用性
事務一致性
關係型資料庫在對事物一致性的維護中有很大的開銷,而現在很多web2.0系統對事物的讀寫一致性都不高.
讀寫實時性
對關聯式資料庫來說,插入一條資料之後立刻查詢,是肯定可以讀出這條資料的,但是對於很多web應用來說,並不要求這麼高的實時性,比如發一條訊息之後,過幾秒乃至十幾秒之後才看到這條動態是完全可以接受的 .
複雜sql,特別是多表關聯查詢
任何大資料量的web系統,都非常忌諱多個大表的關聯查詢,以及複雜的資料分析型別的複雜sql報表查詢,特別是sns型別的**,從需求以及產品階級角度,就避免了這種情況的產生。往往更多的只是單錶的主鍵查詢,以及單錶的簡單條件分頁查詢,sql的功能極大的弱化了 .
在關係型資料庫中,導致效能欠佳的最主要原因是多表的關聯查詢,以及複雜的資料分析型別的複雜sql報表查詢。
為了保證資料庫的acid特性,我們必須盡量按照其要求的正規化進行設計,關係型資料庫中的表都是儲存乙個格式化的資料結構。每個元組欄位的組成都是一樣,即使不是每個元組都需要所有的字段,但資料庫會為每個元組分配所有的字段,這樣的結構可以便於標語表之間進行鏈結等操作,但從另乙個角度來說它也是關係型資料庫效能瓶頸的乙個因素。
nosql一詞,用於指代那些非關係型的,分布式的,且一般不保證遵循acid原則的資料儲存系統。
非關係型資料庫提出另一種理念,例如,以鍵值對儲存,且結構不固定,每乙個元組可以有不一樣的字段,每個元組可以根據需要增加一些自己的鍵值對,這樣就不會侷限於固定的結構,可以減少一些時間和空間的開銷。
使用這種方式,使用者可以根據需要去新增自己需要的字段,這樣,為了獲取使用者的不同資訊,不需要像關係型資料庫中,要對多表進行關聯查詢。僅需要根據id取出相應的value就可以完成查詢。但非關係型資料庫由於很少的約束,他也不能夠提供像sql所提供的where這種對於字段屬性值情況的查詢。
並且難以體現設計的完整性,它只適合儲存一些較為簡單的資料,對於需要進行較複雜查詢的資料,sql資料庫顯的更為合適。
1. 實質
非關係型資料庫的實質:非關係型資料庫產品是傳統關係型資料庫的功能閹割版本,通過減少用不到或很少用的功能,來大幅度提高產品效能。
2. **
目前基本上大部分主流的非關係型資料庫都是免費的。而比較有名氣的關係型資料庫,比如oracle、db2、mssql是收費的。雖然mysql免費,但它需要做很多任務作才能正式用於生產。
3. 功能
實際開發中,有很多業務需求,其實並不需要完整的關係型資料庫功能,非關係型資料庫的功能就足夠使用了。這種情況下,使用效能更高、成本更低的非關係型資料庫當然是更明智的選擇。
非關係型資料庫在某些特定的領域很好用,比如redis作為資料的快取,資料是儲存在記憶體中,所以效能非常好。
非關聯式資料庫只實現了關聯式資料庫一部分的、功能,但因此很大程度上擴充了某些功能的效能。一般用關聯式資料庫就夠了。
嚴格說mysql在關聯式資料庫兄是實現得也不是很完整的一類,從而在某些查詢上,mysql有超出嚴格關聯式資料庫很多的效能。具體應用需要權衡,特別是關聯條件很多的資料,非關聯式資料庫一般不合適,有時候甚至mysql也不合適。
綜上所述,所以什麼時候用nosql與關係型資料庫,取決於業務需求,以及你對資料庫的理解程度,和對他們的優劣是否有足夠的認知和理解。好了nosql與關係型資料庫全面對比就說到這裡,希望通過這篇文章能讓你們更清晰的理解nosql與關係型資料庫。
關係型資料庫與非關係型資料庫(NoSQL)
1.關係型資料庫 mysql oracle sqlserver,acess.特點 sql 結構化的查詢語言 如下圖為關係型資料庫圖示 關係型資料庫存在的問題 1.儲存在硬碟上,讀寫慢 2.保持acid 事務原則,事務四項基本原則 難擴充套件 如何解決?非關係型資料庫 2.非關係型資料庫 優點 一致性...
關係型資料庫與NoSQL資料庫
一 關係型資料庫 目前我們常用的資料庫一般是關係型資料庫,比如oracle mysql sql server。1 定義 基於關係模型 二維表 所提出的一種資料庫。實際場景 學生與系的關係如下 乙個學生必定屬於某乙個系,因此我們可以把圖中學生與系的關係抽象成三個表 這三個表所構成的就是一種簡單的關係型...
關係型資料庫和nosql非關係型資料庫
關係型資料庫目前主流 oracle,mysql,sql server,db2等 非關聯式資料庫包括 mongodb,nosql,cloudant 關係型資料庫的優勢 1.複雜查詢可以用sql語句方便的在乙個表以及多個表之間做非常複雜的資料查詢。2.事務支援使得對於安全效能很高的資料訪問要求得以實現。...