# 關聯式資料庫(RDBMS)與非關聯式資料庫(NoSQL)的比較 - 筆記
###### tags: `database` `Interview Preparation`
:::warning
:bulb: 本站筆記已同步更新到我的[個人網站](https://simplydevs.netlify.app/)囉! 歡迎參觀與閱讀,體驗不同的視覺感受!
:::
[TOC]
## :memo: 關聯式資料庫(RDBMS, Relational Database Management System)
### RDBMS是什麼
資料以資料表(table)的形式存在資料庫中,資料表之間有事先定義的關係,資料表中的一欄(column)代表某項屬性、一列(row)代表一個實體相關屬性的數值,每個資料表都具有主鍵(primary key)方便查詢,並且資料表間的關係可以透過外鍵(foreign key)建立。
### RDBMS的優點
* 資料完整性(Data Integrity):RDBMS具有ACID的特性,ACID代表(參考[AWS關於RDBMS的介紹](https://aws.amazon.com/tw/relational-database/)):
- 不可分割性 (Atomic):交易必須整體成功執行,若是交易有一部分操作失敗,整個交易都會失效
- 一致性 (Consistent):做為交易的一部分寫入資料庫的資料,必須遵守所有明定規則以及約束
- 獨立性 (Isolated):達成並行控制的重要關鍵,可以確保每一個交易都是獨立的
- 耐用性 (Durable):在一個交易成功完成後,對資料庫所做的變更都是永久性的
* 查詢複雜性:可以透過SQL語法,進行較複雜的查詢
* 語言標準化:不像NoSQL各種資料庫有各自的操作語法,RDBMS都可使用SQL(Structured Querying Language)語言進行資料查詢與管理。
* 資料庫正規化
* 安全性高
### RDBMS的缺點
* 橫向擴展能力低,透過垂直擴展比較能發揮優勢,但是成本較高。
* 橫向擴展(Horizontal Scaling)可以想像成增加機器的數量,用不同的機器進行同一個服務,除了減緩單一機器的負擔,也可以避免當單一機器故障時,整個服務就無法使用的狀況。
* 垂直擴展(Vertical Scaling)在現有的硬體上進行升級,例如升級CPU、增加RAM等。
* 儲存與維護成本高
* 速度較慢,尤其當資料量龐大或多人同時使用服務的時候
## :memo: 非關聯式資料庫(NoSQL, Not only SQL)
### NoSQL是什麼
不同於SQL系統,NoSQL中的資料儲存不需要定義schema、也沒有固定架構,不保證ACID的特性,常用於分散式雲端系統。
### NoSQL的優點
* 橫向擴展能力佳 (Scalability):不必增加伺服器來擴大規模,可以透過分散式架構提供服務,以橫向擴展(Horizontal Scaling)的方式增加效能。
* 彈性較高 (Flexibility):NoSQL不像關聯式資料庫需要schema,可以隨意定義資料模型,因此NoSQL可以處理無特定結構或半結構式(semi-structured)的資料
* 速度優勢:因為NoSQL不包含資料關聯性,查詢速度相對較快。
### NoSQL的缺點
* 資料完整度:不同於關聯式資料庫通常遵循ACID原則 (atomicity, consistency, isolation, durability)以確保資料的完整度,NoSQL較難提供ACID的保證,而是遵循BASE(basic availability, soft state, and eventual consistency) 的原則,並且可能犧牲資料的完整度。
* 語言標準化:不像關聯式資料庫大多可以使用SQL語言操作,NoSQL不同的資料庫有各自獨特的語言來管理資料。
* 查詢複雜性:NoSQL針對單一表格的查詢效果佳,但當資料複雜度增加,使用RDBMS的效果會更好。
### 常見的NoSQL類型
1. **Key-Value**
* 以key-value pair的形式儲存資料,key和value可以是任何形式(數字、字串、物件...)
* key必須是獨一無二的,也就是說這種類型的資料庫最適合存放有獨一無二的key的資料,例如ID。
* 每筆資料各自獨立
* [Amazon DynamoDB](https://aws.amazon.com/tw/dynamodb/)和[Redis](https://redis.com/)都是這類型的資料庫
2. **文件資料庫 (Document)**
* 文件資料庫的資料,將資料儲存在分層結構(hierarchical structures)的文件中
* 適合儲存非結構化資料,如HTML
* 支援的文件格式多,如JSON, BSON, XML, and YAML等
* 文件資料庫的模型被認為是key-value資料庫的延伸,但資料查詢並非僅依賴單一的key
* 文件資料庫中的資料結構[範例](https://aws.amazon.com/tw/nosql/document/)如下(JSON):
```
[
{
"year" : 2013,
"title" : "Turn It Down, Or Else!",
"info" : {
"directors" : [ "Alice Smith", "Bob Jones"],
"release_date" : "2013-01-18T00:00:00Z",
"rating" : 6.2,
"genres" : ["Comedy", "Drama"],
"image_url" : "http://ia.media-imdb.com/images/N/O9ERWAU7FS797AJ7LU8HN09AMUP908RLlo5JF90EWR7LJKQ7@@._V1_SX400_.jpg",
"plot" : "A rock band plays their music at high volumes, annoying the neighbors.",
"actors" : ["David Matthewman", "Jonathan G. Neff"]
}
},
{
"year": 2015,
"title": "The Big New Movie",
"info": {
"plot": "Nothing happens at all.",
"rating": 0
}
}
]
```
* [MongoDB](https://www.mongodb.com/?utm_campaign=academia_partners&utm_source=codecademy&utm_medium=referral)是一種受歡迎的文件資料庫
4. **圖形資料庫 (Graph)**
* 顧名思義,運用圖形結構儲存資料,在圖形結構中,資料存在節點(node/verticle)中,並且透過邊(edge)或線(line/links)進行連結、建立關係。
* 相較於關聯式資料庫,圖形資料庫的好處是建立、管理、查詢上都相對簡便
* [Neo4j](https://neo4j.com/)是一種熱門的圖形資料庫
5. **單欄式資料庫 (Column Oriented)**
* 儲存資料的方式和關聯式資料庫類似,但是在單欄式資料庫中,資料是以欄(column)的方式儲存,如下表:
**Row-Oriented(關聯式資料庫)**
| ID | Product | Amount | Price |
|----|---------|--------|-------|
| 1 | Coffee | 20 | 50 |
| 2 | Coke | 3 | 20 |
| 3 | Milk | 11 | 35 |
**Column-Oriented(單欄式資料庫)**
| ID | Product |
|----|---------|
| 1 | Coffee |
| 2 | Coke |
| 3 | Milk |
| ID | Amount |
|----|--------|
| 1 | 20 |
| 2 | 3 |
| 3 | 11 |
| ID | Price |
|----|-------|
| 1 | 50 |
| 2 | 20 |
| 3 | 35 |
* 例如上表中我們要取得產品價格的資料,在關聯式資料庫中必須將資料從各列拉出來,而在單欄式資料庫中,只需要加總價格資料表即可。單欄式資料庫的好處是可以快速擷取資料,可以減少需要載入的資料量,進行橫向擴展(Horizontal Scaling)提高傳輸量。
* [Amazon Redshift](https://aws.amazon.com/tw/redshift/)是一種熱門的單欄式資料庫。
## 小結
RDBMS與NoSQL並沒有絕對的好壞,端看使用的時機與需求
---
## 參考資料
* [[Day 4] NoSQL Database 的 BASE 特性](https://ithelp.ithome.com.tw/articles/10287859)
* [RDBMS vs. NOSQL | 關聯式資料庫 vs. 非關聯式資料庫](https://medium.com/@eric248655665/rdbms-vs-nosql-%E9%97%9C%E8%81%AF%E5%BC%8F%E8%B3%87%E6%96%99%E5%BA%AB-vs-%E9%9D%9E%E9%97%9C%E8%81%AF%E5%BC%8F%E8%B3%87%E6%96%99%E5%BA%AB-1423c9fbb91a)
* [圖形資料庫簡介,讓你對資料的關係一目瞭然!](https://ithelp.ithome.com.tw/articles/10237534)
* [什麼是關聯式資料庫?](https://aws.amazon.com/tw/relational-database/)
* [初步認識分散式資料庫與 NoSQL CAP 理論](https://oldmo860617.medium.com/%E5%88%9D%E6%AD%A5%E8%AA%8D%E8%AD%98%E5%88%86%E6%95%A3%E5%BC%8F%E8%B3%87%E6%96%99%E5%BA%AB%E8%88%87-nosql-cap-%E7%90%86%E8%AB%96-a02d377938d1)
* [[淺談]-NoSQL資料庫怎麼選?](https://xiang753017.gitbook.io/zixiang-blog/database/qian-tan-nosql-zi-liao-ku-zen-me-xuan)
* [什麼是 NoSQL?](https://aws.amazon.com/tw/nosql/)
* [[筆記] RDBMS v.s. NoSQL](https://shininglionking.blogspot.com/2018/04/rdbms-vs-nosql.html)
::: success
:crescent_moon: 本站內容僅為個人學習記錄,如有錯誤歡迎留言告知、交流討論!
:::