前面的文章我們提到,資料庫的欄位(Column)一旦設計好,通常不建議隨意增減。
但有些情況下,資料的「共同性質」並不固定,這時候傳統的表格設計就會遇到困難。
這就牽涉到資料庫的兩大流派:關聯式資料庫與非關聯式資料庫。
這篇文章會帶你認識這兩種資料庫的差異,以及它們各自適合的使用情境。
資料庫的兩大流派
資料庫依照「欄位是否固定」,可以分成兩大流派:
| 流派 | 欄位特性 | 對應語法 |
|---|---|---|
| 關聯式資料庫 | 欄位固定 | SQL |
| 非關聯式資料庫 | 欄位彈性 | NoSQL |
你可能聽過 SQL 和 NoSQL 這兩個詞,它們就是對應這兩種資料庫的操作語法。
💡 NoSQL 不是「不要 SQL」的意思,而是 Not Only SQL(不只是 SQL)。因為實務上,大多數系統會同時使用關聯式和非關聯式資料庫,互相搭配。
關聯式資料庫(SQL)
什麼是關聯式資料庫?
關聯式資料庫的特色是:欄位在一開始就固定下來,之後不能隨意增減。
當你建立一張資料表時,必須先定義好有哪些欄位:
| 姓名 | 年齡 | 居住地 |
|---|---|---|
| 小明 | 28 | 台北 |
| 小美 | 26 | 高雄 |
之後每新增一筆資料,都必須照著這個結構填寫。
你不能在新增某一筆資料時,突然多一個「電話」欄位:
| 姓名 | 年齡 | 居住地 | 電話 |
|---|---|---|---|
| 小明 | 28 | 台北 | ❌ 不存在這個欄位 |
如果需要「電話」欄位,必須先去修改資料表的欄位定義,讓整張表都多出這個欄位:
| 姓名 | 年齡 | 居住地 | 電話 |
|---|---|---|---|
| 小明 | 28 | 台北 | NULL |
| 小美 | 26 | 高雄 | NULL |
| 小王 | 30 | 台中 | 0912-345-678 |
修改後,整張表的所有資料都會多出「電話」欄位,舊資料的電話會是空值(NULL)。
為什麼欄位要固定?
欄位固定的好處是:資料結構嚴謹,不容易出錯。
- 每筆資料都有相同的欄位,格式一致
- 可以設定欄位的限制(例如:年齡必須是數字、姓名不能空白)
- 讀取資料時,你可以確定每筆資料長什麼樣子
這就像是一份標準化的表單,每個人填的欄位都一樣,不會有人自己亂加欄位。
關聯式資料庫的術語
| 術語 | 說明 |
|---|---|
| Table(表格) | 儲存資料的表格 |
| Column(欄位) | 直行,代表資料的共同屬性 |
| Row(列) | 橫列,代表一筆完整的資料 |
非關聯式資料庫(NoSQL)
什麼是非關聯式資料庫?
非關聯式資料庫的特色是:欄位可以彈性變動,不需要事先固定。
非關聯式資料庫的儲存方式很像 JSON 格式,每筆資料就像一個獨立的物件,可以有自己的欄位:
資料 1:{ "姓名": "小明", "年齡": 28, "居住地": "台北" }
資料 2:{ "姓名": "小美", "電話": "0912-345-678", "興趣": "閱讀" }你會發現,資料 1 和資料 2 的欄位完全不同,這在非關聯式資料庫中是允許的。
為什麼需要彈性欄位?
有些情況下,資料的結構很難事先定義:
- 商品資料:書籍有「作者、頁數」,衣服有「尺寸、顏色」,食品有「有效期限、成分」,欄位差異很大
- 使用者偏好設定:每個使用者可能有不同的設定項目
- 日誌紀錄:不同類型的事件,記錄的資訊不同
這時候,非關聯式資料庫的彈性就很有用。
非關聯式資料庫的術語
在關聯式資料庫中,所有資料的欄位必須「對齊」——每筆資料都有相同的欄位,排列成整齊的表格。但非關聯式資料庫沒有這個限制,每筆資料可以有不同的欄位,不需要對齊成表格。
因此,非關聯式資料庫的術語也不太一樣:
| 關聯式術語 | 非關聯式術語 | 說明 |
|---|---|---|
| Table(表格) | Collection(資料集) | 存放資料的容器 |
| Column(欄位) | Field(領域) | 資料的屬性,但不需要對齊 |
| Row(列) | Document(文件) | 一筆完整的資料 |
非關聯式資料庫的儲存方式很像 JSON 格式,所以拿出來的資料可以直接當作物件使用,不需要額外轉換。
兩種資料庫的比較
| 比較項目 | 關聯式資料庫(SQL) | 非關聯式資料庫(NoSQL) |
|---|---|---|
| 欄位 | 固定,事先定義 | 彈性,可隨時變動 |
| 結構 | 嚴謹,每筆資料格式一致 | 靈活,每筆資料可以不同 |
| 適合情境 | 結構明確的資料(會員、訂單、交易) | 結構不固定的資料(日誌、偏好設定) |
| 學習順序 | 初階,先學這個 | 進階,之後再學 |
| 代表產品 | MySQL、PostgreSQL、SQLite | MongoDB、Redis、Firebase |
SQL 與 NoSQL 的語法差異
雖然這篇文章不會深入講語法,但可以先讓你有個概念。
SQL(關聯式資料庫)
讀取資料:
SQL 讀取資料的特色是:先說要取哪些欄位,再說從哪張表取。
SELECT 姓名, 年齡 FROM 會員表 WHERE 居住地 = '台北'順序是:
SELECT 姓名, 年齡:先說要取哪些欄位FROM 會員表:再說從哪張表取WHERE 居住地 = '台北':最後說篩選條件
新增/刪除/更新:
這三種操作的特色是:先說動作類型,再說對哪張表操作。
INSERT INTO 會員表 (姓名, 年齡) VALUES ('小明', 28)
DELETE FROM 會員表 WHERE 姓名 = '小明'
UPDATE 會員表 SET 年齡 = 29 WHERE 姓名 = '小明'順序是:先說動作類型(INSERT / DELETE / UPDATE),再說表格,最後說欄位和值。
NoSQL(非關聯式資料庫)
NoSQL 語法的特色是:先說要操作哪個資料集,再說篩選條件。
讀取資料:
db.會員集.find({ 居住地: "台北" })順序是:
db.會員集:先說要操作哪個資料集.find({ 居住地: "台北" }):再說篩選條件
因為資料拿出來就像 JSON 物件,所以不需要特別指定要取哪些欄位,拿出來之後直接處理就好。
新增/刪除/更新:
db.會員集.insertOne({ 姓名: "小明", 年齡: 28 })
db.會員集.deleteOne({ 姓名: "小明" })
db.會員集.updateOne({ 姓名: "小明" }, { $set: { 年齡: 29 } })順序一樣是:先說資料集,再說條件和內容。
兩者的關鍵差異
| 比較項目 | SQL | NoSQL |
|---|---|---|
| 語法順序 | 先說動作,再說表格 | 先說資料集,再說條件 |
| 取出的資料格式 | 表格格式,需要轉換 | JSON 物件,可直接使用 |
| 指定欄位 | 必須明確指定要取哪些欄位 | 不需要,整筆資料直接拿出來 |
初學者該從哪個開始?
建議先學關聯式資料庫(SQL)。
原因:
- 歷史悠久,是主流:大部分系統的核心資料都用關聯式資料庫
- 結構嚴謹,適合入門:欄位固定,比較容易理解和學習
- 實務上是基礎:就算之後用到非關聯式資料庫,通常也是搭配關聯式資料庫一起使用
所以在接下來的課程中,我們會先介紹關聯式資料庫的基礎操作。
小結
資料庫有兩大流派:
| 流派 | 特色 | 語法 |
|---|---|---|
| 關聯式資料庫 | 欄位固定、結構嚴謹 | SQL |
| 非關聯式資料庫 | 欄位彈性、結構靈活 | NoSQL |
對於初學者來說,先學關聯式資料庫是最好的起點。掌握了基礎之後,再學非關聯式資料庫會更容易理解它的優勢和使用情境。