SQL & NoSQL 大白話

SQL 結構化查詢語言

SQL 是一種結構化查詢語言,用來與關聯式資料庫進行溝通,可對資料庫的資料表做新增、刪除、修改、更新。SQL 是多數 developer 都會接觸到的語言,根據 Stackoverflow 2021 的年度調查報告,SQL 目前排名在程式語言的第四名。

1
2
-- SQL 語法範例
SELECT * FROM Country;


關聯式資料庫

資料庫簡單來說就是資料的集合體,我們可以讀取或修改資料庫中的內容。資料庫的種類有蠻多的,它們都有各自讀取或修改內容的方式,現在比較流行的資料庫以關聯式資料庫為主。關聯式資料庫由 Table 們組成,那關聯式從何而來呢? 其源自於每個 Table 都可以藉由特殊的 Key Value 與其他 Table 建立關係,可以跨 Table 查詢、驗證資料等等…,每個 Table 都一定有自己的 Key Value,其他 Table 可據此與其溝通。

關聯式資料庫有哪些?

Oracle、MySQL、PostgreSQL、Microsoft SQL Server…


NoSQL 資料庫

NoSQL(Not Only SQL) 的縮寫,和前面的關聯式資料庫不同的地方是"NoSQL 資料庫不使用制式的Table來存放資料",多數情況下都將資料儲存為類似 JSON 的文件,對資料進行查詢時,無法使用SQL程式碼做查詢。

它同時是個 document 資料庫模型,doucment 是 key-value 的有序集合(可以想像成 python 的 dictionary)。資料庫中的每個 doucment 不需要具有相同的數據結構,這些 document 可以是 JSON、XML、CSV檔。

下方是使用 JSON 格式紀錄的書籍資料範例,有「斜槓青年」與「巴菲特寫給股東的信」兩本書,它使用 key-value 的方式紀錄資料,例如:書名的 key 值就是 title,value 值就是「斜槓青年」,在找資料時,只要搜尋 key 值 title 等於「斜槓青年」,就可以找到資料。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[
{
"year" : 2017,
"title" : "斜槓青年",
"info" : {
"release_date" : "2017-09-01",
"rating" : 8.2,
"genres" : ["生涯規劃", "商業理財"],
"plot" : "全球職涯新趨勢,迎接更有價值的多職人生",
"actors" : "Susan Kuang"
}
},
{
"year": 2017,
"title": "巴菲特寫給股東的信",
"info": {
"plot": "巴菲特親筆撰述唯一著作",
"rating": 8.3
}
}
]

NoSQL 資料庫如果不能用 SQL 來與其互動,那要用什麼方式呢? 答案是要仰賴各個 NoSQL 資料庫所提供的 API。

以其中一個 NoSQL資料庫 DynamoDB 為例,下方我們就使用 python 版本的 DynamoDB API (AWS SDK for Python (Boto3)) 與 NoSQL 資料庫進行互動。

1
2
3
4
5
6
7
8
9
import boto3
from boto3.dynamodb.conditions import Key

dynamodb = boto3.resource('dynamodb', endpoint_url='http://localhost:8000')
table = dynamodb.Table('Book')
response = table.query(KeyConditionExpression=Key('title').eq('斜槓青年'))

for book in response['Items']:
print(book['title'])

NoSQL 資料庫的優點在於它可以存放非結構化或半結構化的資料,試想 Facebook 上的互動資料是何等龐大,如果通通採用關聯式資料庫用 Table 來存的話,未來如果有新的互動資料類型(像是新的按讚類型、互動模式),那是不是要東加西加欄位呢? 如果使用 NoSQL 資料庫的話就能避免這個問題,因為它存的可以不必是一致化的資料,可以保有很大的彈性。

但 NoSQL 資料庫不適合拿來存放交易資料,因為交易資料強調資料"一致性",所以用關聯式資料庫比較好。

非關聯式資料庫系統有哪些?

Firebase、Microsoft Azure、MongoDB、Redis…


參考資料&延伸閱讀

NoSQL:解決資料庫暴量的新方法
什麼是SQL?什麼是NOSQL? 用簡單範例看一下他們的差異
Stackoverflow 2021 Developer Survey

分享到