關聯式資料庫(RDB)與NoSQL的差異:資料模型、綱要、合併、一致性與擴展比較

關聯式資料庫(RDB)以由列與欄構成的資料表表示資料,並以SQL查詢。它能進行合併多個資料表的複雜查詢,並以交易的ACID特性與主鍵、外鍵等限制,嚴格維持資料的完整性。NoSQL是關聯式資料庫以外之資料庫的總稱,有鍵值型、文件型、寬欄型、圖形型等。多數NoSQL讓資料格式更有彈性,也更容易分散到多台伺服器以擴大規模,代價是放棄合併這類複雜查詢,以及部分嚴格的一致性。與其說哪一方較優秀,不如說是依資料的形態與所需的性質選擇使用。

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

數值為具代表性的大致參考值,會因世代或產品而異。

適用於什麼情況

關聯式資料庫
處理像金錢或庫存這類更新途中不能出現矛盾的資料,或想以各種條件合併、彙總的資料時。是大多數業務系統的標準選擇。
NoSQL
資料量或存取量多到一台伺服器無法負荷時、資料形態不一且容易變動時,或以鍵讀寫的單純操作為主時。選擇符合目的的類型很重要。

常見問題

NoSQL是「不使用SQL」的意思嗎?

多半被解釋為「Not only SQL(不只是SQL)」,與其說是否定SQL,不如說是關聯式資料庫以外之選擇的總稱。實際上,也有能使用類似SQL之查詢語言的產品。

NoSQL有哪些種類?

代表性的有四種。鍵值型專門用於指定鍵來讀寫值的單純操作。文件型以具有類似JSON巢狀結構的文件為單位保存,也能以文件中的欄位搜尋。寬欄型的每一列可以有不同的欄,適合把大量資料分散寫入多台伺服器。圖形型以頂點與邊表示資料之間的連結,適合沿著連結追蹤的查詢。

CAP定理與這個比較有什麼關係?

CAP定理指出,在多台伺服器放置副本的分散式資料庫,在網路被分割時,無法同時完全滿足一致性(從任何伺服器讀取都會得到最新的值)與可用性(回應所有的請求)。許多NoSQL產品優先可用性,採用經過一段時間後副本會趨於一致的最終一致性。

一個系統中會同時使用兩者嗎?

很常見。例如把訂單、付款等重視完整性的資料放在關聯式資料庫,把登入中使用者的資訊(工作階段)與常讀資料的快取放在鍵值型資料庫,把商品說明這類形態不一的資料放在文件型資料庫。

理解度檢測

在稱為NoSQL的資料庫中,關於鍵值(Key-value)型的特徵,下列何者一般而言正確?

  1. A能比關聯式資料庫更快處理包含表格連結與子查詢的複雜SQL
  2. B寫入資料之前,必須把所有欄位的名稱與型別嚴格定義為綱要(Schema)
  3. C專門處理指定鍵來讀寫值的簡單操作,容易分散到多台伺服器以擴大規模,但不適合表格連結之類的複雜查詢
查看答案與解析

正確答案:C. 專門處理指定鍵來讀寫值的簡單操作,容易分散到多台伺服器以擴大規模,但不適合表格連結之類的複雜查詢

NoSQL是關聯式資料庫以外之資料庫的統稱,包括鍵值型、文件型、欄導向型(寬欄型)、圖形型等。鍵值型保存鍵(識別碼)與值的組合,專門處理指定鍵來取出值的簡單操作。由於容易依鍵分割資料並分散到多台伺服器,常用於存取量非常大的網路服務,例如保存登入中使用者的資訊(工作階段)。另一方面,它不擅長依值的內容搜尋,以及表格連結之類的複雜查詢,需要在應用程式端下工夫。許多產品也不需要事先嚴格決定值的格式(無綱要)。此外,也有產品允許分散的副本之間更新不會立即一致的最終一致性。

關於在多台伺服器上放置資料副本的分散式資料庫,下列何者是對CAP定理的適當說明?

  1. A伺服器之間的網路發生分區時,無法同時完全滿足「從任何伺服器讀取都傳回最新值」的一致性,與「回應所有請求」的可用性
  2. B只要設計得當,一致性、可用性與分區容錯性三者永遠可以同時滿足
  3. C分區容錯性是指把線路備援化,使伺服器之間的網路不會被分割
查看答案與解析

正確答案:A. 伺服器之間的網路發生分區時,無法同時完全滿足「從任何伺服器讀取都傳回最新值」的一致性,與「回應所有請求」的可用性

CAP定理指出,分散式資料庫無法同時完全滿足一致性(Consistency:從任何伺服器讀取都傳回最新寫入的結果)、可用性(Availability:未故障的伺服器會回應所有請求)、分區容錯性(Partition tolerance:即使伺服器之間的通訊被切斷,系統仍能持續運作)三者。由於網路分區在現實中無法避免,重點在於發生分區時,必須選擇要優先一致性而停止回應部分請求,還是優先可用性而容許傳回舊值並持續回應。沒有發生分區時,可以同時滿足一致性與可用性。許多NoSQL產品優先可用性,採用隨時間經過副本終將一致的最終一致性。分區容錯性不是把線路備援化,而是即使發生分區也能持續運作的性質。

將關聯式資料庫的表格正規化,主要目的是下列何者?

  1. A減少表格數量,讓任何搜尋都不必連結就能快速進行
  2. B將資料加密,讓未經授權的使用者無法讀取
  3. C消除資料重複,防止更新時內容不一致等異常
查看答案與解析

正確答案:C. 消除資料重複,防止更新時內容不一致等異常

正規化是依據欄位之間的函數相依(某欄位的值確定後,另一欄位的值就唯一確定的關係)分割表格,讓同一事實不會記錄在多處的設計步驟。例如在員工表格的每筆資料列中都寫入部門名稱,那麼變更部門名稱時,就必須改寫該部門所有員工的資料列,只要有遺漏,內容就會不一致(更新異常)。此外還會發生無法登錄尚無員工的部門(插入異常)、刪除部門最後一位員工時連部門資訊也一併消失(刪除異常)等問題。若把部門資訊分到部門表格,部門名稱只需修改一處即可。另一方面,表格分開後,搜尋時的連結會增加,因此正規化不一定會讓搜尋變快。

  1. 在以讀取與彙總為主的資料庫中,有時會刻意把正規化後的表格合併成一個,讓相同資料重複保存(反正規化)。此設計的優點與缺點組合,下列何者正確?
  2. 在交易應具備的ACID特性中,「從帳戶A扣款並存入帳戶B的轉帳處理,即使途中發生故障,也只會是兩者都完成或完全不進行」的性質是下列何者?

前往資料庫基礎的練習題

相關名詞的解說

關聯式資料庫
以由資料列與欄位構成的表格(關聯)表示資料,並以共同的值把表格彼此關聯起來的資料庫。也稱為RDB。以SQL進行查詢與修改,並以主鍵、外鍵等限制維持資料的一致性。
NoSQL
關聯式資料庫以外之資料庫的統稱,包括鍵值型、文件型、欄導向型、圖形型等。許多產品容易分散到多台伺服器以擴大規模,資料格式也較有彈性,但多半不擅長表格連結之類的複雜查詢與嚴格的一致性。
SQL
在關聯式資料庫中,用來定義表格、搜尋/新增/修改/刪除資料,以及控制權限等的標準語言。由ISO/IEC制定為標準。包括SELECT、INSERT、UPDATE、DELETE、CREATE TABLE、GRANT等敘述。
交易
把對資料庫的一連串處理合併為一個單位來處理者。以COMMIT確定處理結果,以ROLLBACK回到開始前的狀態。DBMS利用鎖與日誌加以管理,使其滿足原子性、一致性、隔離性與持久性(ACID特性)。
ACID特性
交易應滿足之4項性質的字首:原子性(Atomicity:全部執行或完全不執行)、一致性(Consistency:持續滿足完整性限制)、隔離性(Isolation:同時執行也不互相干擾)、持久性(Durability:已提交的結果即使故障也不會遺失)。
正規化
依據欄位之間的函數相依分割關聯式資料庫的表格,讓同一事實不會記錄在多處的設計步驟。可消除資料重複,防止修改異常、插入異常與刪除異常。有第一正規化到第三正規化、BCNF等階段。
主鍵
用來唯一識別表格中一筆資料列的欄位或欄位組合。具有值不得重複、不得含NULL的限制。從能唯一識別資料列的最小欄位組合(候選鍵)中選出一個作為主鍵。
外鍵
參照其他表格之主鍵(或唯一欄位)的欄位。透過只能存入參照對象中存在的值或NULL的參考完整性限制,防止指向不存在資料列的資料被存入。也可以指定參照對象的資料列被刪除或修改時的動作(拒絕、連帶刪除等)。

相關的比較