返回文章列表

什麼是SQL?什麼是NOSQL? 用簡單範例看一下他們的差異

資料庫
Code Gym | SQL與NoSQL資料庫比較

當你想要學習一項新技術時,資料庫和SQL可能不是你首先想到的。他看起來沒那麼潮,你可能會想到學習Python或R來進行資料分析。或者是Swift來開發iOS APP。在過去的幾年裡,你可能也聽說過越來越流行的新技術 NoSQL。在大數據和資料分析的世界裡,資料庫和SQL比起以往任何時候都更重要。如果你正準備開始設計一個Web 應用程式,我相信你一開始大部分的時間會花在設計資料庫的架構上,而決定你的Web 應用程式的速度和數據準確性最重要的指摽,就是你的如何設計資料庫的架構。

 什麼是關聯式資料庫

資料庫是一個有規則和序列,存放資料的集合,允許我們儲存和讀取資料。目前有許多不同類型的資料庫技術,每個類型都有不同的儲存和讀取資料的方式,但到目前為止,最流行的還是關聯式資料庫。

在關聯式資料庫中,資料存儲在 Table 中, Table 類似於 Excel 的表單,由欄和列組成的多個儲存格,Table 中有一個唯一的 key 來標識每一行數據。這些唯一的 key 可以用來將 Table 連接在一起。正是這種結構使我們能夠辨識和存取資料,建立起資料庫中其他區塊之間的關係。也正是這些關係,使得關聯式資料庫變得如此強大,並且在資料庫中提供資料的一致性。

SQL 結構化查詢語言

SQL (結構化查詢語言) 是用於和關聯式資料庫溝通的語言,它用在資料庫中建立 Table ,以及從資料庫中新增、修改和刪除資料,串連 Table 之間的資料。在工程師社群的問答平台 Stackoverflow 的調查中發現,SQL 目前排名在程式語言的第三名,所以它是一個在開發人員中,普遍使用的程式語言,除了從Stackoverflow 客觀的圖表分析,根據Ryan 自己在業界工作的觀察,絕大多數的後端開發人員,不管你是使用哪一種程式語言,也都會使用SQL 存取資料庫中的資料,所以很少有人只會Java, Ptyhon, C# 程式語言,但不懂SQL 程式語言的開發工程師。

SQL 語法使用起來非常簡單,我們只要寫好Table名稱、要搜尋的欄位名稱以及搜尋條件就可以了,像是下方我想在資料庫中搜尋書名為「斜槓人生」的書,我只要用SQL關鍵字select 後方寫下想要找出的欄位名稱,例如書名與出書年份,然後在關鍵字from 後方寫上table名稱book,最後則是搜尋條件,而這樣簡單的語法可以在Oracle, MySQL, MS SQL等關聯式資料庫上執行。

 


關聯式資料庫系統

目前著名的資料庫系統有甲骨文 Oracle、微軟 Microsoft SQL Server和 MySQL。這些資料庫都是關聯式資料庫,其中應用最廣泛的是MySQL。事實上,最近對stackoverflow的調查發現,超過50%的工程師在職業生活中使用過MySQL,其重要程度可見一斑。


NoSQL 資料庫

NoSQL是Not Only SQL的縮寫,和剛才前面介紹的不同是,NoSQL 資料庫是一種非關聯式資料庫,將資料儲存為類似 JSON 的文件,並對資料進行查詢,這是一個 document 資料庫模型,在這個模型中,資料並不存儲在 Table 中,doucment 是 key-value 的有序集合。資料庫中的每個doucment 不需要具有相同的數據結構,你可以將資料儲存在 JSON、XML文件甚至CSV文件 ,我下方使用紀錄書籍資訊的JSON格式作為範例,讓你更容易理解。

這是使用JSON格式紀錄的書籍資料,這裏有兩本書,分別是「斜槓青年」與「巴菲特寫給股東的信」,使用key-value 的方式紀錄資料,像是書名的key值,就是title,value值就是「斜槓青年」,這樣我們在找資料時,只要搜尋key值title等於「斜槓青年」,就可以找到資料。

[
    {
        "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
        }
    }
]

 但是存取資料的方式,必須使用資料庫系統提供的 API 才能夠新增、修改、刪除資料,也就是需要透過程式語言呼叫特定的函式,或是使用資料庫系統 提供的指令,遠端連線執行後才能存取資料,像是Amazon 的雲端服務AWS,也有提供NoSQL的資料庫服務,名稱是DynamoDB,下面是一段使用Python 程式語言搜尋「斜槓青年」這本書的簡單範例,其中最重要的是有中文「斜槓青年」這一行,搜尋的方式是使用Key物件,使用函式eq判斷書名是否相同,如果相同就會將書籍資料回傳,並且可以透過下面for 迴圈一本一本找出來,列印出書名或其他相關資訊。

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 資料庫的優點是它們能夠處理大量的結構化或半結構化數據,更容易擴展,並且能夠提供高可用性。使用NoSQL 資料庫的一些好例子包括:事件記錄(例如存儲用戶登錄)、電子商務應用(存儲用戶購物車的數據)和即時的分析。


SQL與NoSQL的比較

雖然No​​SQL 資料庫與關聯式資料庫相比確實有一些優勢,但也有很多缺點。數據一致性和數據完整性是NoSQL資料庫的主要問題,另一個缺點是缺乏標準化。例如SQL 語法適用於所有關聯式資料庫(MySQL、Oracle、MS SQL等),雖然一些特定的函式,語法上有些差異,但大致來說都是使用SQL 的語法操作資料庫,而NoSQL資料庫沒有這樣的標準語言,不同的NoSQL資料庫之間存在很大的差異,剛才上面是使用AWS DynamoDB 範例,我們需要匯入AWS的套件,以及使用特定的函式操作,但如果是使用另一個NoSQL資料庫,像是Firebase,那就需要匯入另一個套件和使用另一組函式來操作資料庫,所以學習SQL 程式語言會是CP值更高的一種投資,因為你不用再另外花時間學習多個操作資料庫的方法。

在這個信息驅動的大數據時代,為你開發的系統選擇正確的資料庫,比以往任何時候都重要。雖然關聯式資料庫已經存在了40多年,你可能會被 "較新 “的NoSQL資料庫技術所吸引,但有一些事情你需要考慮。關係型資料庫提供的數據一致性和數據完整性意味著,如果你的系統是處理金融信息和交易,那麼數據一致性是必須的。如果你希望你的資料庫是安全的,關聯式資料庫提供的安全功能,在這方面有明顯的優勢,而且你只需要學習10~20條簡單的SQL 語法,就能夠操作大部分的資料庫數據。

所有這些都意味著,使用關係型資料庫和SQL是至關重要的。關係型資料庫長期以來一直位居第一是有很好的原因的,90%的時間裡它們都是最好的選擇,而且這種情況不會很快改變,如果你有興趣學習更多關於SQL的知識。可以看看我的課程《資料庫設計 - 有效的使用系統資料》。這堂課程幫助許多初學者學會SQL 語法,也受到許多同學的好評,課程中使用MySQL作為課程示範,相信這堂課程會成為你學習資料庫和資料分析的重要基石。

資料庫設計課程連結:https://www.codegym.tech/database

 

Code Gym 致力於創造實用的高品質線上課程,幫助想要學習程式語言和IT技術的朋友,能透過我的課程,學習知識,發揮熱情,創造出屬於你自己的作品

瀏覽所有課程

Code Gym 部落格

科技趨勢和程式教學分享,Code Gym 的部落格將引領您進入無限的學習領域

我為什麼移居到日本福岡?

Nov 18, 2024

困擾你求職之路的「幽靈職缺」

Jul 16, 2024