關聯式資料庫(RDB)與NoSQL的差異:資料模型、綱要、合併、一致性與擴展比較
關聯式資料庫(RDB)以由列與欄構成的資料表表示資料,並以SQL查詢。它能進行合併多個資料表的複雜查詢,並以交易的ACID特性與主鍵、外鍵等限制,嚴格維持資料的完整性。NoSQL是關聯式資料庫以外之資料庫的總稱,有鍵值型、文件型、寬欄型、圖形型等。多數NoSQL讓資料格式更有彈性,也更容易分散到多台伺服器以擴大規模,代價是放棄合併這類複雜查詢,以及部分嚴格的一致性。與其說哪一方較優秀,不如說是依資料的形態與所需的性質選擇使用。
| 項目 | 關聯式資料庫(RDB) | NoSQL |
|---|---|---|
| 資料的表示方式 | 由列與欄構成的資料表(關聯)。資料表之間以共同的值(外鍵)建立關聯 | 依類型而異。鍵與值的組合、類似JSON的文件、欄的集合、由頂點與邊構成的圖等 |
| 綱要(schema) | 事先定義欄的名稱與型別。要變更時,以ALTER TABLE等變更資料表的定義 | 許多產品不需事先嚴格決定(無綱要,schemaless),欄位不同的資料也能放在同一處 |
| 查詢 | 以標準語言SQL,宣告式地撰寫條件搜尋、彙總、排序等 | 多使用各產品的API或查詢語言。也有具備類似SQL之語言的產品 |
| 資料表的合併 | 能以JOIN進行組合多個資料表的查詢 | 許多產品不擅長。常把一起讀取的資料整合在一份文件或一個值中 |
| 交易與一致性 | 以滿足ACID特性的交易,能一次確定多列、多個資料表的更新 | 許多產品只支援單一鍵或文件為單位的更新,或允許副本之間的更新不會立即一致的最終一致性。也有具備ACID交易的產品 |
| 擴展規模的方式 | 基本上是提升單台伺服器效能的垂直擴展。讀取可分散到副本,但要把寫入分散到多台伺服器很困難 | 容易以鍵分割資料,進行分散到多台伺服器的水平擴展 |
| 正規化 | 以正規化消除資料的重複,防止更新時的異常 | 常為了優先讀取速度,重複保存相同的資料 |
| 適合的用途 | 會計、庫存、訂單等重視完整性、資料關係複雜的業務系統 | 存取量非常大之網路服務的工作階段與快取、形態不固定的資料、大量的日誌、人或物之間的連結(圖) |
數值為具代表性的大致參考值,會因世代或產品而異。