資訊科普系列(13)-關聯式資料庫 VS 非關聯式資料庫

曹仲辰
MODA IT
Published in
9 min readNov 24, 2023

什麼是資料庫?

資料庫是組織及儲存資料的系統。儲存的內容包含任何類型的資料,例如:文字、圖片、影片和文件。配合資料庫管理系統(Database Management System,DBMS)我們可以有效率的查詢及修改資料。

Database System = DBMS + DB

使用DBMS為資料庫系統所帶來的優點

1、避免資料重覆存放 (Data Redundancy):透過資料集中化,避免資料重複存放。

2、限制未授權的存取 (Restricting Unauthorized Access):提供適當的安全性與認証機制,針對資料庫的帳密存取權限。

3、提供備份與回復功能 (Providing Backup and Recovery):確保資料能回到之前的狀態。

關聯式資料庫(Relational Database Management System)

MySQL、PostgreSQL、SQL Server…

以關聯模型為基礎的資料庫,由資料表構成,每張資料表則由許多筆記錄所組成,每筆記錄又以許多欄位組合而成,每個欄位則存放著一筆資料。

來源/關聯式資料庫簡介
來源/https://database.klab.tw/lesson-1/

表與表之間的關聯是透過外來鍵(Foreign Key)來完成,它對應系別資料表的主鍵(Primary Key),透過此聯繫可以找到另外一個表。

ACID

為了確保Transaction是正確可靠的,必須具備四個特性,Atomicity (原子性)、Consistency (一致性)、Isolation (隔離性)、Durability (持續性)。

  • 原子性:一個transaction中的所有操作,會是全部完成,或者全部不完成,不會結束在中間某個環節。執行過程中發生錯誤,會被Rollback到開始前的狀態。
  • 一致性:transaction 完成前後,資料都必須永遠符合 schema 的規範,保持資料與資料庫的一致性。
  • 隔離性:確保各個transaction是互相隔離不會同時互相影響,如果兩個transaction修改同一筆資料,先執行的transaction會將資料lock住不讓他被其他人修改。
  • 持續性:transaction 完成後,對資料的操作就是永久的,即便系統故障也不會丟失。

非關聯式資料庫(Not only SQL)

MongoDB, Redis…

與關聯式資料庫不同,不會有關聯。NoSQL使用不同的數據模型,對應不同的需求。與傳統的關聯式資料庫相比,NoSQL更加靈活,並且在處理大量非結構化資料時表現出色。

主流的NoSQL模型有以下幾種:

  • 文件資料庫
  • 鍵值資料庫
  • 寬闊欄位儲存資料庫
  • 圖形資料庫

文件資料庫

MongoDB

應用場景:Web HTML, 網頁資料

文件為基本單位,並使用某種標準格式(如JSON、BSON等)來組織和儲存資料。以Collection(集合)的方式儲存資料,資料被稱為Document(文件)。

來源/https://aws.amazon.com/tw/compare/the-difference-between-redis-and-mongodb/

鍵值資料庫

Redis

應用場景:記錄檔系統、快取常用網頁

在key與value間建立關係,讓key可以直接存取value。鍵值資料庫以Bucket(桶)的方式儲存資料,資料被稱為key-value(鍵值)。

來源/https://www.researchgate.net/figure/a-Key-value-store-KVS-data-model-b-Data-in-KVS_fig2_332763207

寬闊欄位儲存資料庫

Cassandra

應用場景:分散式檔案系統

在一張大資料表中儲存很多行資料,每一行的結構同樣有一個row-key和任意數量的列欄位。以Column Family(欄位群)的方式儲存資料,資料被稱為row(列)。

來源/RavenDB Mythology Documentation

圖形資料庫

Neo4j

應用場景:SNS、關係圖譜

運用圖結構的概念來儲存資料,並運用圖結構相關演算法提高性能,不是專門用來處理圖片的資料庫。例如用樹狀結構來組織從屬關係或網狀結構來儲存朋友關係。

其最大的特性是對複雜性的擴充力,關係越複雜的資料越適合使用圖形資料庫。以節點、邊和屬性來表示和儲存資料。

來源/https://hackmd.io/@flyxiang/SkGT3E-VP

BASE

  • 基本可用(Basically Available):某些節點失效或出現其他故障,系統仍能繼續提供基本的服務。後續會有錯誤補償的機制將資料一致。
  • 軟狀態(Soft state):系統在某些時刻可能處於不一致的狀態,但最終會趨於一致。
  • 最終一致性(Eventual consistency):系統中的所有節點都沒有新的更新時,會透過一些機制,最終所有節點的數據將會達到一致的狀態。例如:透過 Gossip ProtocolQuorum NWR、TCC、ZAB 等協議,達到最終一致性。

關聯式資料庫與非關聯式資料庫比較

架構

SQL

  1. 結構化模型:SQL資料表使用預先定義的schema。表示在建立table前就要確定資料類型和關聯等。
  2. 固定的欄位:如果需要添加新的欄位或修改結構,需要對整個table的資料都進行修改。
  3. 複雜的擴展:在SQL資料表中,擴展通常涉及到改變表結構或添加索引,這可能需要停機和複雜的數據遷移過程。

NoSQL

  1. 靈活的數據模型:擁有不同的數據模型,能夠存儲不同結構的數據。
  2. 動態欄位:一些NoSQL資料庫支援動態欄位,這意味著可以在不事先定義結構的情況下添加新的欄位。
  3. 容易擴展:NoSQL資料庫在水平擴展方面更加容易,因為它們的分散式架構允許在系統中添加新節點,而無需修改現有數據模型。

應用場景

SQL:高度結構化、具有嚴格一致性要求

  1. 傳統企業:SQL資料庫在傳統的企業應用中很常見,特別是需要複雜查詢、事務處理和強一致性的應用。
  2. 金融業:金融系統通常需要高度的事務處理和強大的一致性,這使得SQL資料庫成為這些應用的理想選擇。

NoSQL:需要高度擴展性、彈性模式、即時數據處理和大數據分析

  1. 大數據和實時分析:NoSQL資料庫適合處理大量非結構化或半結構化的數據,例如日誌數據、社交媒體數據,支援大數據分析和實時數據處理。
  2. 社交媒體應用:NoSQL資料庫在社交媒體應用中廣泛使用,支援快速讀寫操作和靈活的數據模型。
  3. 物聯網(IoT)應用:NoSQL資料庫能夠處理來自物聯網設備的大量數據,支援高吞吐量的寫操作和分佈式環境。

transaction處理

  • ACID(SQL)
  • BASE (NoSQL)

資料庫選擇

CAP定理

來源/Shertil, Mahmud. (2016). TRADITIONAL RDBMS TO NOSQL DATABASE: NEW ERA OF DATABASES F

對於一個資料庫系統來說,以下三項性質對於一個資料庫的構成十分重要。

  • 一致性(Consistency):確保在同一時間數據都是相同的。
  • 可用性(Availability):確保每次請求都有回應,不論成功或失敗。
  • 分區容錯(Partition tolerance):確保訊息丟失不會對系統造成影響,即使其中一台機器斷線也不影響整個系統。

透過分析應用程式所需的 CAP特性,我們可以確定在選擇資料庫時應著重於哪一方面。根據具體的應用情境,我們可能需要強調一致性、可用性或分割容忍性的重要性。

CAP 的排列組合

  • CA (consistency + availability)

不考慮分區容錯問題,也就是單機模式,等於不考慮分散式架構

  • CP (consistency + partition tolerance)

優先考慮資料的 強一致性 。著名的實作:etcd、Consul、CockroachDB

  • AP (availability + partition tolerance)

關注可用性,也就是水平擴展的能力。用柔性事務達到 最終一致性

最著名的實作:DynamoDB、Cassandra

如果一致性對你比較重要,你可能會選擇MySQL或PostgreSQL。這樣可以確保在任何時候,所有節點都具有相同的資料,從而防止資料不一致的問題。

要是高可用性對你來說更重要,你可能會選擇非關聯式資料庫,如MongoDB或Cassandra。這樣可以確保系統在面臨節點故障或網絡分割時仍能夠提供服務,即使這可能會導致一段時間內的資料不一致。

參考資料

http://debussy.im.nuu.edu.tw/sjchen/Database/Final/Ch01.pdf

https://rickhw.github.io/2018/08/11/DistributedSystems/CAP-Theorem/

--

--