什麼是資料庫?
資料庫是組織及儲存資料的系統。儲存的內容包含任何類型的資料,例如:文字、圖片、影片和文件。配合資料庫管理系統(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…
以關聯模型為基礎的資料庫,由資料表構成,每張資料表則由許多筆記錄所組成,每筆記錄又以許多欄位組合而成,每個欄位則存放著一筆資料。
表與表之間的關聯是透過外來鍵(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(文件)。
鍵值資料庫
Redis
應用場景:記錄檔系統、快取常用網頁
在key與value間建立關係,讓key可以直接存取value。鍵值資料庫以Bucket(桶)的方式儲存資料,資料被稱為key-value(鍵值)。
寬闊欄位儲存資料庫
Cassandra
應用場景:分散式檔案系統
在一張大資料表中儲存很多行資料,每一行的結構同樣有一個row-key和任意數量的列欄位。以Column Family(欄位群)的方式儲存資料,資料被稱為row(列)。
圖形資料庫
Neo4j
應用場景:SNS、關係圖譜
運用圖結構的概念來儲存資料,並運用圖結構相關演算法提高性能,不是專門用來處理圖片的資料庫。例如用樹狀結構來組織從屬關係或網狀結構來儲存朋友關係。
其最大的特性是對複雜性的擴充力,關係越複雜的資料越適合使用圖形資料庫。以節點、邊和屬性來表示和儲存資料。
BASE
- 基本可用(Basically Available):某些節點失效或出現其他故障,系統仍能繼續提供基本的服務。後續會有錯誤補償的機制將資料一致。
- 軟狀態(Soft state):系統在某些時刻可能處於不一致的狀態,但最終會趨於一致。
- 最終一致性(Eventual consistency):系統中的所有節點都沒有新的更新時,會透過一些機制,最終所有節點的數據將會達到一致的狀態。例如:透過 Gossip Protocol 、Quorum NWR、TCC、ZAB 等協議,達到最終一致性。
關聯式資料庫與非關聯式資料庫比較
架構
SQL
- 結構化模型:SQL資料表使用預先定義的schema。表示在建立table前就要確定資料類型和關聯等。
- 固定的欄位:如果需要添加新的欄位或修改結構,需要對整個table的資料都進行修改。
- 複雜的擴展:在SQL資料表中,擴展通常涉及到改變表結構或添加索引,這可能需要停機和複雜的數據遷移過程。
NoSQL
- 靈活的數據模型:擁有不同的數據模型,能夠存儲不同結構的數據。
- 動態欄位:一些NoSQL資料庫支援動態欄位,這意味著可以在不事先定義結構的情況下添加新的欄位。
- 容易擴展:NoSQL資料庫在水平擴展方面更加容易,因為它們的分散式架構允許在系統中添加新節點,而無需修改現有數據模型。
應用場景
SQL:高度結構化、具有嚴格一致性要求
- 傳統企業:SQL資料庫在傳統的企業應用中很常見,特別是需要複雜查詢、事務處理和強一致性的應用。
- 金融業:金融系統通常需要高度的事務處理和強大的一致性,這使得SQL資料庫成為這些應用的理想選擇。
NoSQL:需要高度擴展性、彈性模式、即時數據處理和大數據分析
- 大數據和實時分析:NoSQL資料庫適合處理大量非結構化或半結構化的數據,例如日誌數據、社交媒體數據,支援大數據分析和實時數據處理。
- 社交媒體應用:NoSQL資料庫在社交媒體應用中廣泛使用,支援快速讀寫操作和靈活的數據模型。
- 物聯網(IoT)應用:NoSQL資料庫能夠處理來自物聯網設備的大量數據,支援高吞吐量的寫操作和分佈式環境。
transaction處理
- ACID(SQL)
- BASE (NoSQL)
資料庫選擇
CAP定理
對於一個資料庫系統來說,以下三項性質對於一個資料庫的構成十分重要。
- 一致性(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/