IT 基礎知識 ch07 資料庫基礎:表格、交易與一致性
下一章→
CH 07 新手先修

資料庫基礎:表格、交易與一致性

SQL 一句話交易與 ACID索引讀寫分離SQL vs NoSQL一致性模型

AWS ch05 一開場就直接比較 RDS、Aurora、DynamoDB、ElastiCache——但如果不知道「關聯式和 NoSQL 差在哪」「交易是什麼」「索引為什麼快」「讀寫分離解決什麼」,那些比較表就只是背誦。本章用轉帳、書的目錄、影印分身三個類比把地基打好,最後講清楚 DynamoDB 考點裡的「強一致 vs 最終一致」。

關聯式資料庫(Relational Database)可以想成「一堆設計嚴謹、會互相參照的 Excel 表」:

  • 表(Table):一張表存一類東西(客戶表、訂單表)。欄(Column)是屬性(姓名、電話),列(Row)是一筆資料。
  • 主鍵(Primary Key):每一列的唯一識別證(客戶編號)——保證不重複,找人就靠它。
  • 外鍵(Foreign Key)=「關聯」的來源:訂單表裡存「客戶編號」指回客戶表——訂單不用重抄客戶資料,要看就照編號去查。表跟表之間這種參照關係,就是「關聯式」三個字的意思。
  • Schema(綱要):每張表的欄位、型別事先定義好,資料進來必須符合格式——嚴謹,但要改結構(加欄位)是大工程。
  • SQL:操作這些表的標準語言,一句話感受一下:SELECT 姓名 FROM 客戶表 WHERE 城市 = '台北'(從客戶表挑出台北的客戶姓名)。強項是跨表查詢(JOIN):「找出上個月買過 A 商品的台北客戶」這種跨好幾張表的複雜問題,一句 SQL 搞定。
💡 AWS 對應:RDS 就是「AWS 幫你代管的關聯式資料庫」(MySQL、PostgreSQL 等引擎照舊,AWS 負責裝機、備份、修補),Aurora 是 AWS 自研的高效能相容版。你的程式怎麼下 SQL 完全不變(詳見 AWS ch05)。

經典場景:A 轉 1000 元給 B = 兩個動作(A 扣款、B 入帳)。如果扣完款系統當機、B 沒收到錢——災難。交易(Transaction)就是把多個動作捆成「不可分割的一包」:要嘛全部成功,要嘛全部沒發生,不存在中間狀態。

  • 關聯式資料庫用 ACID 四個字保證交易品質:
    ・A(Atomicity 原子性):全做或全不做——轉帳不會只轉一半。
    ・C(Consistency 一致性):交易前後帳目都合規——總金額不會憑空增減。
    ・I(Isolation 隔離性):多筆交易同時進行互不干擾——兩個人同時搶最後一張票,不會都買到。
    ・D(Durability 持久性):說成功就是真的寫進去了——斷電也不會消失。
  • 白話記法:「說到做到、帳目乾淨、互不插隊、絕不反悔」。
⭐ 這就是為什麼「金融、訂單、庫存」類考題幾乎都指向關聯式資料庫(RDS/Aurora)——題目出現「transactional」「ACID」「複雜交易」關鍵字,先想 RDS 家族。
  • 沒有索引的查詢=從第一頁翻到最後一頁找關鍵字(全表掃描):資料一百萬筆就翻一百萬次。
  • 索引(Index)=書前面的目錄:事先把某個欄位排好序、記下每筆資料的位置。查「電話 = 0912xxx」直接翻目錄,幾次跳轉就到——百萬筆資料也只要十幾步。
  • 代價(用空間換時間):目錄本身佔空間;而且每次新增/修改資料都要順手更新目錄——索引越多,寫入越慢。所以不是每個欄位都建索引,只建「常拿來查」的。
  • 主鍵天生自帶索引——用主鍵查永遠是最快路徑。
💡 AWS 對應:「資料庫查詢很慢」的考題選項若有「檢查/新增適當的索引」通常是正解之一;DynamoDB 的查詢則「只能」走鍵與索引(GSI/LSI),沒索引的欄位查起來又貴又慢——這是 ch05 DynamoDB 設計考點的地基。

資料庫扛不住流量時,有一個關鍵觀察:大多數應用「讀」遠多於「寫」(看商品頁的人遠多於下單的人)。所以:

  • 讀寫分離:主庫(Primary)負責寫,另外「影印」幾份分身——唯讀複本(Read Replica)——分攤讀的流量。主庫每寫一筆,非同步地抄給複本們。
  • 複本延遲(Replication Lag):抄寫需要時間(通常毫秒到秒級),所以複本上讀到的可能是「幾秒前的資料」——這是讀寫分離的天生代價,也是下一張卡「最終一致」的預告。
  • 別跟高可用搞混:Read Replica 是為了分攤讀流量(效能);「主庫掛了自動切換到備援」是高可用(HA),兩者目的不同。AWS 把後者叫 Multi-AZ:備援庫平常不服務流量,只等著接手。
⭐ AWS ch05 最高頻陷阱就是這組:Read Replica = 讀效能擴展;Multi-AZ = 高可用(災難接手)。題目問「讀取流量太大」→ Read Replica;問「資料庫要能挺過 AZ 故障」→ Multi-AZ。現在你知道原理差在哪了。

NoSQL 是一大類「不走關聯式路線」的資料庫統稱,最常見的兩種:

  • Key-Value(鍵值):整個資料庫就是一個巨大的置物櫃——給 key(櫃號)放 value(東西),拿的時候報櫃號秒取。簡單到極致,所以快到極致、要擴就加櫃子(水平擴展)。DynamoDB、Redis 都是這類。
  • 文件(Document):value 是結構化的 JSON 文件,每筆資料的欄位可以不一樣(這筆有電話、那筆沒有)——不用事先定義 schema,改結構零成本。MongoDB、DocumentDB 是代表。

取捨的本質:NoSQL 放棄了關聯式的兩大重武器——跨表 JOIN 和完整 ACID 交易——換來無上限的水平擴展和穩定的毫秒級速度。所以:

  • 資料關係複雜、要複雜查詢、要交易 → SQL(RDS/Aurora)
  • 存取模式簡單(都是「拿 key 取資料」)、量極大、要毫秒級延遲 → NoSQL(DynamoDB)
💡 考題翻譯機:「complex queries/joins/transactions」→ RDS;「single-digit millisecond/massive scale/key-value」→ DynamoDB;「schema 常變、JSON 文件」→ DocumentDB。AWS ch05 的服務比較表,底層邏輯全在這張卡。

資料為了安全與效能會複製好幾份(複本、多 AZ),於是出現一個新問題:剛寫入的資料,馬上去讀,每一份都已經同步了嗎?

  • 類比:辦公室有三面白板抄著同一份公告。你更新了其中一面,其他兩面要幾秒後才會抄好。這幾秒內,看不同白板的人會看到不同版本。
  • 強一致(Strong Consistency):保證你讀到的一定是最新版——代價是系統要先確認所有白板都抄好(或指定只看最新那面),比較慢、比較貴。
  • 最終一致(Eventual Consistency):讀的當下可能拿到幾秒前的舊版,但不久之後一定會同步到最新——快、便宜,而且大多數場景根本沒差(社群貼文晚幾秒出現誰在乎)。
  • 什麼時候必須強一致?「寫完馬上讀、而且不能讀到舊的」:扣完庫存馬上檢查、轉帳後馬上看餘額。
⭐ AWS 對應:DynamoDB 預設最終一致讀,可以指定強一致讀(較貴、消耗雙倍讀取容量);S3 現在已是強一致;RDS 的 Read Replica 天生最終一致(複本延遲)。考題「寫入後立即讀取必須拿到最新值」→ 強一致讀。
SQL(關聯式)vs NoSQL
特性SQL / 關聯式NoSQL(Key-Value / 文件)
類比嚴謹的會計帳本(表格互相參照)巨大置物櫃 / 自由筆記本
Schema事先定義,嚴格把關彈性,每筆欄位可不同
查詢能力SQL、跨表 JOIN、複雜查詢主要靠 key 與索引取資料
交易完整 ACID有限度支援
擴展方式垂直為主(換大機器)+讀複本水平擴展近乎無上限(加節點)
適用場景金融、訂單、庫存、複雜報表海量簡單存取、毫秒級延遲、Session、購物車
AWS 服務RDS、AuroraDynamoDB(KV)、DocumentDB(文件)、ElastiCache(記憶體 KV)
Read Replica vs Multi-AZ(原理版)
面向Read Replica(讀寫分離)Multi-AZ(高可用)
目的分攤讀流量=效能主庫掛了有人接手=可用性
複本收流量嗎收(服務讀取請求)平常不收,純待命
同步方式非同步(有複本延遲→最終一致)同步(資料零遺失)
考題觸發詞「讀取流量太大」「報表查詢拖慢主庫」「AZ 故障仍要運作」「自動容錯移轉」

練習題 點選選項查看解析

0 / 7
01 / 7
電商系統下單時要同時「扣庫存+建立訂單+扣款」,三個動作絕不能只完成一部分。這個需求叫什麼?哪類資料庫的招牌能力?
A 索引,NoSQL 的招牌
B 交易(Transaction),關聯式資料庫(如 RDS/Aurora)以 ACID 完整保證
C 讀寫分離,快取的招牌
D 水平擴展,DynamoDB 的招牌
解析
「多個動作全成或全敗」=交易,ACID 的 A(原子性)就是這個保證。關聯式資料庫是交易的大本營——考題出現 transactional、ACID、金融/訂單/庫存等字眼,先想 RDS 家族。NoSQL 對交易的支援有限,這正是它拿速度和擴展性交換掉的東西。
02 / 7
客戶表有一千萬筆資料,用「電話號碼」查詢要好幾秒。DBA 說「建個索引就好了」。索引為什麼能加速?代價是什麼?
A 索引會壓縮資料所以變快,沒有代價
B 索引像書的目錄:事先按電話排序記下位置,查詢從「逐頁翻完」變「翻目錄直達」;代價是佔空間且每次寫入都要更新目錄,寫入變慢
C 索引把資料放進記憶體,代價是斷電遺失
D 索引刪掉舊資料所以變快
解析
全表掃描是一筆筆翻;索引是排好序的目錄,跳幾步就定位。但目錄要空間、寫入時要同步維護——「用空間換時間、用寫入速度換讀取速度」。所以只在常查詢的欄位建索引。這也是 DynamoDB GSI 設計考點的基礎觀念。
03 / 7
報表系統的大量讀取查詢把主資料庫拖慢,影響了線上交易。寫入量不變的情況下,標準解法是?
A 啟用 Multi-AZ
B 建立 Read Replica,把報表的讀取流量導到複本,主庫專心處理寫入與交易
C 把資料庫換成 DynamoDB
D 刪除所有索引加速寫入
解析
讀多寫少場景的標準解=讀寫分離:Read Replica 是主庫的「影印分身」,分攤讀流量。Multi-AZ 是高可用(備援平常不服務流量),解決不了效能問題——這組區分是 AWS ch05 最高頻陷阱:「讀太多」→ Read Replica;「怕 AZ 掛」→ Multi-AZ。
04 / 7
為什麼從 Read Replica 讀到的資料可能是「幾秒前的舊版」?
A 複本的硬體比較差
B 主庫到複本的抄寫是非同步的,存在複本延遲(replication lag)——這就是「最終一致」
C 複本會故意快取舊資料
D 這是設定錯誤,正常不會發生
解析
主庫寫入後「非同步」抄給複本,抄寫需要時間(毫秒到秒級)。這不是故障而是設計取捨:同步抄寫會拖慢主庫的每一筆寫入。讀寫分離天生伴隨最終一致——需要「寫完馬上讀到最新」的查詢應該打主庫。
05 / 7
一個手機遊戲要存全球數億玩家的 Session 資料:存取模式固定是「用玩家 ID 取整包資料」,要求毫秒級延遲、流量會暴增。SQL 還是 NoSQL?
A SQL(RDS),因為資料很重要
B NoSQL Key-Value(DynamoDB):存取模式就是「報 key 取值」,不需要 JOIN 和複雜交易,換來毫秒級延遲與近乎無上限的水平擴展
C SQL(Aurora),因為效能最強
D 都不行,要用檔案系統
解析
選型看「存取模式」而非「資料重不重要」:這個場景完全是 key-value 型(玩家 ID → 整包資料),用不到關聯式的 JOIN/複雜查詢,正好把它們換成 DynamoDB 的水平擴展與穩定毫秒延遲。考題觸發詞:single-digit millisecond、massive scale、簡單存取模式 → DynamoDB。
06 / 7
系統「扣完庫存後立即讀取庫存數量做檢查,絕不能讀到舊值」。用 DynamoDB 時該怎麼讀?
A 預設讀取即可,DynamoDB 永遠是最新的
B 使用強一致讀(Strongly Consistent Read)——代價是較慢且消耗雙倍讀取容量
C 先等 10 秒再讀
D 改用最終一致讀比較快
解析
DynamoDB 預設是最終一致讀(快、便宜,但可能拿到剛寫入前的舊值);「寫後立讀且必須最新」的場景要指定強一致讀,代價是延遲較高、讀取容量消耗加倍。白板類比:強一致=堅持看最新更新的那面白板;最終一致=隨便看一面,可能還沒抄到。
07 / 7
新創產品的資料結構每週都在變(常加欄位),若用關聯式資料庫每次都要改 schema 很痛苦。哪類資料庫較合適?
A 更嚴格的關聯式資料庫
B 文件型 NoSQL(如 DocumentDB/MongoDB):每筆文件的欄位可以不同,改結構零成本
C Key-Value,因為最快
D 資料倉儲(Redshift)
解析
文件型資料庫存 JSON 文件、schema 彈性——這筆有新欄位、那筆沒有,完全合法,適合結構快速演變的場景。代價同樣是放棄跨表 JOIN 與完整 ACID。觸發詞:「flexible schema」「JSON documents」→ DocumentDB。

點擊卡片翻面查看答案,共 10 張。

QUESTION
關聯式資料庫的「關聯」是指什麼?
點擊翻面
ANSWER
表與表之間用鍵互相參照
主鍵 = 每列的唯一識別證
外鍵 = 存別張表的主鍵來指回去(訂單存客戶編號)
點擊翻回
QUESTION
ACID 四個字白話版?
點擊翻面
ANSWER
A 原子性 = 全做或全不做(轉帳不轉一半)
C 一致性 = 帳目永遠合規
I 隔離性 = 同時交易互不插隊
D 持久性 = 說成功就絕不反悔
點擊翻回
QUESTION
索引的類比與代價?
點擊翻面
ANSWER
書的目錄:從逐頁翻找變翻目錄直達
代價:佔空間+每次寫入要更新目錄(寫入變慢)
→ 只建在常查詢的欄位
點擊翻回
QUESTION
Read Replica vs Multi-AZ 一句話區分?
點擊翻面
ANSWER
Read Replica = 影印分身分攤讀流量(效能)
Multi-AZ = 待命備援等著接手(高可用)
讀太多→前者;怕 AZ 掛→後者
點擊翻回
QUESTION
什麼是複本延遲(Replication Lag)?
點擊翻面
ANSWER
主庫→複本的抄寫是非同步的,需要時間
複本可能讀到幾秒前的舊資料
這就是「最終一致」的來源
點擊翻回
QUESTION
SQL vs NoSQL 的本質取捨?
點擊翻面
ANSWER
NoSQL 放棄:跨表 JOIN+完整 ACID
換來:水平擴展無上限+穩定毫秒級延遲
複雜查詢/交易→SQL;海量簡單存取→NoSQL
點擊翻回
QUESTION
Key-Value vs 文件型 NoSQL?
點擊翻面
ANSWER
Key-Value = 巨大置物櫃(報 key 秒取)→ DynamoDB、Redis
文件型 = 存 JSON、欄位彈性 → DocumentDB/MongoDB
點擊翻回
QUESTION
強一致 vs 最終一致的白板類比?
點擊翻面
ANSWER
多面白板抄同一份公告,抄寫有時間差
強一致 = 保證看到最新版(慢、貴)
最終一致 = 可能看到舊版,但終會同步(快、便宜)
點擊翻回
QUESTION
DynamoDB 的一致性預設與選項?
點擊翻面
ANSWER
預設:最終一致讀(快、便宜)
可選:強一致讀(寫後立讀保證最新,耗雙倍讀取容量)
S3 現在已是強一致
點擊翻回
QUESTION
資料庫考題觸發詞對應?
點擊翻面
ANSWER
ACID/JOIN/複雜查詢 → RDS/Aurora
single-digit ms/massive scale → DynamoDB
彈性 schema/JSON → DocumentDB
毫秒快取/記憶體 → ElastiCache
點擊翻回