歡迎來到「關聯式資料庫」的世界!

各位同學大家好!你有沒有想過,Instagram 或 YouTube 這些網站是怎樣有效率地管理數以百萬計的用戶、相片和留言呢?他們可不是單純用一張巨型試算表喔!他們用的是更聰明、更有條理的東西:就是「關聯式資料庫」。在這一章,我們會揭開神秘面紗,看看這些資料庫究竟是怎樣運作的。即使聽起來有點複雜,也別擔心;我們會用簡單易明、貼近生活的例子來為你逐步解說。準備好了嗎?我們開始吧!


資料庫的基本構成要素

想像一下你在玩 LEGO 樂高積木。在搭建城堡之前,你必須先了解各種積木的樣子。資料庫也是一樣!現在,就讓我們來學習一下這些基本「積木」吧。

實體:我們儲存資料的「對象」

實體」簡單來說,就是你想儲存資料的「人、地方、物件、事件或概念」。它通常是一個資料表的主要「主題」。

  • 例子:在一個學校資料庫中,主要實體會是「學生」、「教師」和「課程」。
  • 例子:在一個圖書館資料庫中,實體可能是「書籍」和「會員」。

屬性:這些「對象」的詳細資訊

屬性」是實體的「特徵」或「性質」。你可以把屬性想像成資料表中用來描述實體的「欄位」。

  • 例子:對於「學生」這個實體,其屬性可以是「學生編號」、「姓名」、「出生日期」和「班級」。
  • 例子:對於「書籍」這個實體,屬性可以是「書籍編號」、「書名」和「作者」。
類比時間:你的手機聯絡人

想想你手機裡的聯絡人清單。每個「聯絡人」都是一個「實體」。而你為每個聯絡人儲存的詳細資料,像是他們的「姓名」、「電話號碼」和「電郵地址」,就是「屬性」。很簡單吧?


重點提示

實體是名詞(你想要追蹤的「對象」),而屬性則是形容詞(這些對象的「描述」)。


資料庫的核心:鍵 (Keys)!

想像一下學校裡有三位學生都叫「陳大文」。你怎麼知道你說的是哪一位?你需要一個獨特的識別碼。在資料庫中,我們就用「 (Keys)」來達到這個目的。

主鍵 (Primary Key)(資料表的「大佬」)

主鍵 (Primary Key, PK)」是一個(或一組)屬性,它能夠在資料表中「獨一無二」地識別每一筆記錄。它是最終極的獨特識別碼。

主鍵有兩條非常重要的規則:

  1. 每筆記錄的它都必須是獨一無二的。(沒有兩位學生可以擁有相同的學生編號。)
  2. 不能是空值 (NULL)。(每位學生都「必須」有一個學生編號。)
  • 例子:在「`學生 (Students)`」資料表中,「學生編號 (StudentID)」會是一個完美的主鍵。學生的姓名就不是一個好選擇,因為姓名可能會重複。

候選鍵 (Candidate Key)(潛在的「大佬」們)

候選鍵 (Candidate Key)」是任何「可能」成為主鍵的屬性。它也必須是每筆記錄中獨一無二的。一個資料表可以有多個候選鍵,但你只能選擇其中一個作為官方的主鍵。

  • 例子:在「`學生 (Students)`」資料表中,「學生編號 (StudentID)」和「香港身份證號碼 (HKID_Number)」對於每位學生來說都是獨一無二的。它們都是候選鍵。我們可能會選擇「學生編號」作為主鍵,因為它與學校的關聯性更高。

外來鍵 (Foreign Key)(連接的「橋樑」)

外來鍵 (Foreign Key, FK)」是讓資料庫變得「關聯式」的秘密武器。它是一種用來連接兩個資料表的鍵。外來鍵簡單來說,就是一個資料表的主鍵被複製到另一個資料表中,用來建立關聯。

  • 例子:假設我們有一個「`圖書借閱 (Book_Loans)`」資料表,用來追蹤哪些學生借了哪些書。我們會包含「學生編號 (StudentID)」(來自「`學生 (Students)`」資料表)和「書籍編號 (BookID)」(來自「`書籍 (Books)`」資料表)。在這裡,「學生編號」和「書籍編號」在「`圖書借閱`」資料表中就是外來鍵。它們就像橋樑一樣,將特定的借閱記錄與特定的學生和特定的書籍連接起來。
記憶小貼士:鍵 (Keys)

Primary Key(主鍵)= 資料表的Principal(主要),獨特的識別碼。
Foreign Key(外來鍵)= 來自Foreign(外部)資料表的鍵,用來建立橋樑。

快速回顧:鍵的種類

主鍵 (Primary Key): 資料表的主要、獨特識別碼(例如,`學生 (Students)` 資料表中的 `學生編號 (StudentID)`)。
候選鍵 (Candidate Key): 任何可能成為主鍵的欄位(例如,`學生編號 (StudentID)` 或 `香港身份證號碼 (HKID_Number)`)。
外來鍵 (Foreign Key): 來自另一個資料表的主鍵,用來連接資料表(例如,`圖書借閱 (Book_Loans)` 資料表中的 `學生編號 (StudentID)`)。


串連點滴:關係與組織

「關聯式」資料庫的重點,就是把資料儲存在獨立、有條理的資料表中,然後在它們之間建立「關係」。這樣能避免混亂,讓資料井井有條。

建立一個簡單的關聯式資料庫

想像你經營一家小商店,並使用一張單一的試算表來追蹤銷售情況。它可能長這樣:

銷售編號:101, 顧客姓名:Tom, 顧客電話:555-1234, 商品:蘋果, 價格:5, 數量:10
銷售編號:102, 顧客姓名:Mary, 顧客電話:555-5678, 商品:橙, 價格:4, 數量:20
銷售編號:103, 顧客姓名:Tom, 顧客電話:555-1234, 商品:橙, 價格:4, 數量:15

有沒有發現問題?Tom 的姓名和電話號碼重複出現了。如果他更改了電話號碼,你必須找到所有出現過的地方並更新!這就是所謂的「資料冗餘」。關聯式資料庫就能解決這個問題。

第一步:識別實體。在這裡,我們有「`顧客 (Customers)`」、「`產品 (Products)`」和「`銷售 (Sales)`」。

第二步:為每個實體建立一個獨立的資料表。

  • `顧客 (Customers)` 資料表:`顧客編號 (CustomerID)` (主鍵), `顧客姓名 (CustomerName)`, `顧客電話 (CustomerPhone)`
  • `產品 (Products)` 資料表:`產品編號 (ProductID)` (主鍵), `商品名稱 (ItemName)`, `價格 (Price)`
  • `銷售 (Sales)` 資料表:`銷售編號 (SaleID)` (主鍵), `顧客編號 (CustomerID)` (外來鍵), `產品編號 (ProductID)` (外來鍵), `數量 (Quantity)`

第三步:利用外來鍵建立關係。

「`銷售`」資料表使用 `顧客編號` 指向「`顧客`」資料表,並使用 `產品編號` 指向「`產品`」資料表。現在,Tom 的資料只會儲存一次。如果他更改電話號碼,你只需要在一個地方更新就可以了!這就是我們如何合理地組織資料建立關係的方法。


保持資料的乾淨與可靠:資料完整性

資料完整性就是要確保資料庫中的資料是準確、一致且可靠的。你可以把這些想像成資料庫必須遵守的嚴格「規則」。

實體完整性 (Entity Integrity)(「沒有無名公民」規則)

這條規則很簡單:資料表的主鍵不能是空值 (NULL)。這確保了每筆記錄都有一個獨特的身份,並且可以被找到。這就像是說,一個國家裡的每個公民都必須有一個身份證號碼。

參照完整性 (Referential Integrity)(「沒有幽靈參照」規則)

這是針對外來鍵的規則。它指出外來鍵必須符合以下其中一項:

  1. 與它所指向的資料表中現有的主鍵值相符。
  2. 是空值 (NULL)(如果允許的話)。

例子:你不能在「`圖書借閱 (Book_Loans)`」資料表中添加一筆 `學生編號 (StudentID)` 為「S1234」的記錄,如果「`學生 (Students)`」資料表中沒有這個編號的學生。這可以防止出現指向不明的「孤立」記錄,確保所有連結都是有效的。

域完整性 (Domain Integrity)(「放對盒子」規則)

這條規則確保一個欄位中的所有值都具有正確的資料類型,並且來自一個允許值集合,這個集合稱為「域 (Domain)」。

  • 」是一個屬性所有可能合法值的集合。
  • 例子:一個「性別 (Gender)」屬性的域可以是集合 {'M', 'F'}。域完整性會阻止有人在這個欄位輸入「Cat」。
  • 例子:一個「分數 (Score)」屬性的域可能是 0 到 100 之間的整數。你不能輸入 101 或「Hello」。
重點提示

完整性規則就是資料庫的「警察」!實體完整性保護主鍵,參照完整性保護外來鍵的關係,而域完整性則保護欄位中的資料。


加快速度:索引

想像一下,如果你要在一本沒有索引的 1,000 頁書中找到一個特定的詞語,你可能要翻遍每一頁!資料庫中的「索引 (Index)」運作方式就跟教科書最後面的索引一樣。

  • 它是一個特殊的查找表,資料庫的搜尋引擎可以利用它來加快資料檢索的速度。
  • 資料庫可以利用索引直接找到資料的位置,而不用搜尋資料表中的每一列(這稱為「全表掃描」)。
  • 索引通常建立在那些經常被用作搜尋條件的欄位上,例如姓名、編號或日期。

你知道嗎?資料庫會自動為主鍵建立索引,因為它是最常用來查找記錄的方式!


糟糕!那個「還原」按鈕:回溯

如果你在進行一個關鍵操作的過程中突然停電了怎麼辦?想想銀行轉帳:錢從你的帳戶扣除了,但在存入你朋友的帳戶之前,系統卻崩潰了。你肯定不希望你的錢就這樣不見了吧!

這就是交易 (transactions) 和回溯 (rollbacks) 派上用場的地方。「交易」是一系列資料庫操作,這些操作必須作為一個單一的、「要麼全部完成,要麼全部不完成」的單元來執行。

回溯的目的

回溯」是一個指令,用於撤銷一個未能成功完成的交易所做的所有更改。它的主要目的是:

  • 撤銷更改: 如果交易的任何部分失敗了(或用戶取消了它),就會執行回溯,將資料庫恢復到交易開始之前的狀態。
  • 確保資料一致性: 它防止資料庫處於不完整或不一致的狀態。在我們的銀行例子中,回溯會把錢退回你的帳戶,就像轉帳從未發生過一樣。
  • 維護完整性: 它透過確保只有完整、成功的操作才被永久儲存,從而保護資料的完整性。
重點提示

回溯」是資料庫交易的終極「還原」按鈕。它是一個安全網,確保你的資料即使在出現問題時也能保持一致和正確。