資料庫初探:RDBMS & NoSQL


Posted by Nicolakacha on 2020-09-18

RDBMS

關聯式資料庫系統(Relational Database Management System)一般將資料儲存在有固定欄位的資料表架構裡(Schema),資料與資料之間可以建立關聯,並透過結構化查詢語言(Structured Query Language,簡稱 SQL)來與資料庫互動,也可以在不同的資料表中交互查詢。MySQL 和 PostgreSQL 都是屬於關聯式資料庫。
database

以下會提及一些資料庫重要的名詞概念,以幫助我們更深入理解關聯式資料庫:

Transaction

Transaction 可以視為一組對資料庫的讀寫操作,例如交易、轉帳等。舉例來說,小明在網路上賣一本《前端秘笈》,若小花下單了,小明賣場的書就減少一本而歸零,而小花就獲得了一本書,這就是一個 transaction。

Lock

但如果今天小花和小王同時下單了這本《前端秘笈》,就可能會發生超賣的情形,一本書賣給了兩個人,這種情況稱為 race condition。為了確保 transaction 不會發生 race condition,也就是確保買賣數量的正確性,我們可以建立一個標記,這個標記的用途是當這本書被第一個買家買的時候,告知其它準備買這本書的買家,這本書正在被賣哦,其它買家就要等待該買家買完之後,才可已執行動作,當然,因為只有一本,所以第一個買家買完了,之後的人就不能再買了。

回到資料庫的場景來說,為了確保多筆 transaction 在資料讀取和寫入的時候不會互相影響的隔離性(isolation),進而達到資料的一致性(concurrency),我們可以在資料讀取或寫入時做上一個記號,其它 transaction 就要根據這個記號來決定是否要等待該記錄狀態結束或是直接讀取資料,而這個記號就是資料庫中的 lock。

ACID

ACID 則是為了保證 transaction 是正確可靠的,所必須符合的四個特性:

  • 原子性(Atomicity):一個 transaction 中的所有操作,或者全部失敗,或者全不成功,不會有部份成功或失敗的情況發生。意即不可分割的零和關係。
  • 一致性(Consistency):在 transaction 的開始之前和結束以後,都要遵循資料庫事先定義好的規則,以維持資料的一致性。
  • 隔離性(Isolation):任何的 transaction 都不會影響另一筆 transaction,確保多筆 transaction 同時執行時不會因為互相影響而導致資料不一致。
  • transaction 成功之後,對於資料庫的修改是永久的,即使系統故障也不會遺失。

小結

關聯式資料庫的優點是簡單、穩定且社群支援度高,是目前被廣泛使用的資料庫類型,對資料容忍度低的服務,例如轉帳、交易等,因為關聯式資料庫透過 ACID 確保 transaction 是正確可靠的,通常是很好的選擇。
但使用關聯式資料庫的服務上線了以後,資料庫的 Schema 就很難調整;且一旦資料量大時,設計和變更 Schema 就更困難了,這時我可以考慮使用 NoSQL 資料庫來存取資料。

NoSQL Database

NoSQL 的 No,雖然最初的意思是 Non,但目前普遍理解為 Not Only,可以理解為是除了可以透過 SQL 來和資料庫互動外,還能以別的型態來儲存資料。目前 NoSQL 資料庫主流是使用 Key-Value 的模式來存取資料。如同 JSON 格式,每筆資料就只有一個索引(key)和其對應的值(value),因此可以不需要關聯式資料庫式的 Schema;每筆資料之間不需有關聯性,所以也會盡量避免使用 JOIN 語法。

NoSQL 資料庫的資料通常可以任意地調整或分割、也可以分散到不同的 Server 中。也因為這種特性,NoSQL 資料庫不需要高效能和容量較大的硬體設備來維持關聯式資料庫那種複雜的叢集系統,就可以用更低成本實現水平擴充。除了上述所提的 Key-Value 儲存模式之外,NoSQL 資料庫還有其他的類型,主要可分為四類:

  1. 鏈值資料庫(Key-Value Database):以文檔或類似於):這是 NoSQL 資料庫的大宗,主要就是用 Key-Value 的方式來儲存資料,適合需要儲存大量的資料但不需要執行複雜查詢的使用場景;但不適用於需要儲存資料之間的關係時,因為 Key-Value 資料庫不能關聯資料。常見的用途有儲存使用者偏好或是快取等,知名的 Key-Value 資料庫有 Redis 和 DynanoDB 等。
    Key-Value Database
    圖片來自維基百科

  2. 文檔資料庫(Document-Oriented Database):以文檔或類似於 JSON 物件的形式儲存資料,每個文檔可以包含許多組資料單元,每組資料都有 name 和其對應的值 value,而 value 的種類可以是各種型態:字串、數字、布林值、陣列、物件等。使用 Document 資料庫的好處是程式開發者可以使用他們在應用程式程式碼中使用的相同文件模型(例如 JSON),也因此應用範圍相當多元,但和 Key-value 資料庫一樣,因為不能關聯資料,所以不能在不同的文檔上添加 Transaction。目前較歡迎的 Document 資料庫為 MongoDB。
    Document-Oriented Database
    圖片來自 MongoDB 官網

  3. 列存儲資料庫(Wide-column Store):在資料表及其列和動態的欄位中儲存資料,比關聯式資料庫的資料表具有更高的彈性,因為每個列中不需要有相同的欄位,可以理解為二維的 key-value 型態。通常運用於物聯網(IoT)或儲存使用者資料上。Cassandra 和 DynamoDB 都是屬於這種列存儲資料庫。
    Wide-column Store
    圖片來自 Database.Guide

  4. 圖形資料庫(Graph databases):當我們關注每個資料之間的組織網關係時,可以使用圖形資料庫,它使用節點來存放資料實體,並利用邊緣來存放各個實體之間的關係,可以用來描述上下節點的關係、動作等。適用於社交網絡、詐騙偵測、推薦引擎的使用場合,Neo4j 和 JanusGraph 都屬於這類圖形資料庫。
    Graph databases
    圖片來自 Amazon Neptune 官網

參考資料:


#NoSQL #Database #SQL #RDBMS







Related Posts

Ruby語言中『符號』『字串』的不同

Ruby語言中『符號』『字串』的不同

《寫給所有人的運算思維入門》- 寫程式到底是在幹嘛?

《寫給所有人的運算思維入門》- 寫程式到底是在幹嘛?

JavaScript 的櫃子,陣列( Array )

JavaScript 的櫃子,陣列( Array )


Comments