關係型資料庫
1.1什麼是關係型資料庫
關聯式資料庫(relational database),是建立在關係模型基礎上的資料庫,借助於集合代數等數學概念和方法來處理資料庫中的資料。現實世界中的各種實體以及實體之間的各種聯絡均用關係模型來表示。
資料庫:包括乙個或多個表
表(關係 relation):是以列和行的形式組織起來的資料的集合
列(屬性 attribute):在資料庫中經常被稱為字段
行(值組 tuple):在資料庫中經常被稱為記錄
我們可以理解為:系型資料庫,是指採用了關係模型來組織資料的資料庫。
例如,可能有乙個有關作者資訊的名為 authors 的表(關係 relation)。每列(值組 tuple)都包含特定型別的資訊,如作者的姓氏。每行(屬性 attribute)都包含有關特定作者的所有資訊:姓、名、住址等等。
在關係型資料庫當中乙個表就是乙個關係,乙個關聯式資料庫可以包含多個表。
關係型資料庫的主要代表:sql server,oracle,mysql,postgresql。
1.2 關係型資料庫優點
事務一致性:通過事務處理保持資料的一致性
複雜查詢:支援sql,可以進行 join 等複雜查詢
容易理解:二維表結構是非常貼近邏輯世界的乙個概念,關係模型相對網狀、層次等其他模型來說更容易理解
使用方便:通用的 sql 語言使得操作關係型資料庫非常方便
易於維護:豐富的完整性(實體完整性、參照完整性和使用者定義的完整性)大大減低了資料冗餘和資料不一致的概率
1.3 關係型資料庫缺點
讀寫效能:在資料量達到一定規模時,由於關係型資料庫的系統邏輯非常複雜,為了維護一致性,使得其非常容易發生死鎖等的併發問題,所以導致其讀寫速度下滑非常嚴重
表結構更新:表結構可以在被定義之後更新,但是如果有比較大的結構變更的話就會變得比較複雜
高併發:**的使用者併發性非常高,往往達到每秒上萬次讀寫請求,對於傳統關係型資料庫來說,硬碟i/o是乙個很大的瓶頸
海量資料:對於關係型資料庫來說,在一張包含海量資料的表中查詢,效率是非常低的
2. 非關係型資料庫
2.1 什麼是非關係型資料庫
非關係型資料庫(nosql)是對不同於傳統的關聯式資料庫的資料庫管理系統的統稱。
當代典型的關聯式資料庫在一些資料敏感的應用中表現了糟糕的效能,例如為巨量文件建立索引、高流量**的網頁服務,以及傳送流式**。關係型資料庫的典型實現主要被調整用於執行規模小而讀寫頻繁,或者大批量極少寫訪問的事務。
nosql 的結構通常提供弱一致性的保證,如最終一致性,或交易僅限於單個的資料項。
nosql 提出另一種理念,例如,以鍵值對儲存,且結構不固定,每乙個元組可以有不一樣的字段,每個元組可以根據需要增加一些自己的鍵值對,這樣就不會侷限於固定的結構,可以減少一些時間和空間的開銷。
nosql 與 sql 存在許多顯著的不同點,其中最重要的是 nosql 不使用 sql 作為查詢語言。其資料儲存可以不需要固定的**模式,也經常會避免使用 sql 的 join 操作,一般有水平可擴充套件性的特徵。
非關係型資料庫包括:
臨時性鍵值儲存:memcached、redis=
永久性鍵值儲存:roma、redis
面向文件的資料庫:mongodb、couchdb
面向列的資料庫:cassandra、hbase
主要代表:mongodb,redis,couchdb
2.2 非關係型資料庫分類
由於非關係型資料庫本身天然的多樣性,以及出現的時間較短,相比關係型資料庫,非關係型資料庫非常多,並且大部分都是開源的。
非關係型資料庫嚴格上不是一種資料庫,應該是一種資料結構化儲存方法的集合。依據結構化方法以及應用場合的不同,主要分為以下幾類:
面向高效能併發讀寫的 key-value 資料庫:key-value資料庫的主要特點即使具有極高的併發讀寫效能,redis,tokyo cabinet,flare 就是這類的代表
面向海量資料訪問的面向文件資料庫:這類資料庫的特點是,可以在海量的資料中快速的查詢資料,典型代表為 mongodb 以及 couchdb
面向可擴充套件性的分布式資料庫:這類資料庫想解決的問題就是傳統資料庫存在可擴充套件性上的缺陷,這類資料庫可以適應資料量的增加以及資料結構的變化
2.3 非關係型資料庫優點
非關係型資料庫的出現,多是源於關係型資料庫的效能不足,故非關係型資料庫的優點也很明顯:
讀寫效能:無需經過 sql 層的解析,讀寫效能很高。主要例子有redis,由於其邏輯簡單,而且純記憶體操作,使得其效能非常出色,單節點每秒可以處理超過10萬次讀寫操作;
簡單的擴充套件:基於鍵值對,資料沒有耦合性,容易擴充套件。典型例子是 cassandra,由於其架構是類似於經典的 p2p,所以能通過輕鬆地新增新的節點來擴充套件這個集群;
儲存格式多:支援key-value形式、文件形式、形式,而關係型資料庫則只支援基礎型別;
低廉的成本:這是大多數分布式資料庫共有的特點,因為主要都是開源軟體,沒有昂貴的license成本;
2.4 非關係型資料庫缺點
不提供對 sql 的支援:如果不支援 sql 這樣的工業標準,將會對使用者產生一定的學習和應用遷移成本
支援的特性不夠豐富:現有產品所提供的功能都比較有限,大多數 nosql 資料庫都不支援事務,也不像 ms sql server 和 oracle 那樣能提供各種附加功能,比如 bi 和報表等
現有產品的不夠成熟:大多數產品都還處於初創期,和關係型資料庫幾十年的完善不可同日而語
3. 關係型資料庫與 nosql
3.1 nosql 使用場景
並不是任何場景,nosql 都要優於關係型資料庫。nosql 使用場景常見如下:
資料庫表字段是複雜資料型別
對於複雜資料型別,比如 sql sever 提供了可擴充套件性的支援,像 xml 型別的字段。db 層對 xml 欄位很難建高效索引,應用層又要做從字元流到 dom 的解析轉換。nosql 以 json 方式儲存,提供了原生態的支援,在效率方便遠遠高於傳統關係型資料庫。
高併發資料庫請求
此類應用常見於 web2.0 的**,很多應用對於資料一致性要求很低,而關係型資料庫的事務以及大表 join 反而成了」效能殺手」。
海量資料的分布式儲存
海量資料的儲存如果選用大型商用資料,如 oracle,那麼整個解決方案的成本是非常高的,要花很多錢在軟硬體上。nosql 分布式儲存,可以部署在廉價的硬體上,是乙個價效比非常高的解決方案。
3.2 nosql 和關聯式資料庫結合
一般把 nosql 和關聯式資料庫進行結合使用,各取所長,需要使用關係特性的時候我們使用關聯式資料庫,需要使用 nosql 特性的時候我們使用 nosql 資料庫,各得其所。nosql 資料庫是關聯式資料庫在某些方面(效能,擴充套件)的乙個彌補。
另外,可使用 nosql 作為快取伺服器。mysql + memcached 的架構中,memcached 這類記憶體快取伺服器快取的資料大小受限於記憶體大小,如果用 nosql 來代替 memcached 來快取資料庫的話,就可以不再受限於記憶體大小。雖然可能有少量的磁碟io讀寫,可能比 memcached 慢一點,但是完全可以用來快取資料庫的查詢操作。參考
維基百科-sql
維基百科-nosql
為什麼使用 nosql:nosql 與 sql 的區別
關係型資料庫和非關係型資料庫的特性以及各自的優缺點
關係型資料庫和非關係型資料庫區別、oracle與mysql的區別
SQL 和 NoSQL 的區別
sql structured query language 資料庫,指關係型資料庫。主要代表 sql server,oracle,mysql 開源 postgresql 開源 nosql not only sql 泛指非關係型資料庫。主要代表 mongodb,redis,couchdb。sql資料存...
SQL 和 NoSQL 的區別
sql structured query language 資料庫,指關係型資料庫。主要代表 sql server,oracle,mysql 開源 postgresql 開源 nosql not only sql 泛指非關係型資料庫。主要代表 mongodb,redis,couchdb。sql資料存...
SQL與NoSQL MySQL與NoSQL的融合
寫這一篇內容的原因是mysql5.6.2突然推出了memcached的功能。nosql to innodb with memcached的出現,可以看出nosql對關聯式資料庫的確產生了巨大的影響,個人覺得這是乙個非常大的進步,可以讓開發人員更加方便的使用nosql和關聯式資料庫。nosql一般被認...