前面的文章我們學會了資料庫表格的基本結構:表格(Table)、欄位(Column)、列(Row)、格子(Cell)、值(Value)。
但在真實世界中,資料不會乖乖地以表格形式出現。你拿到的可能是一段文字描述、一份會議記錄、或是一堆散亂的筆記。
這篇文章要帶你練習:如何從雜亂的資料中,找出共同性質,整理成結構化的表格?
這是學習資料庫非常重要的技能,讓我們透過三個實際案例來練習。
案例一:商品清冊
原始資料
假設你拿到一本商品清冊,裡面這樣寫:
David 撰寫的鉅作《資料庫入門:從開始到放棄》共 335 頁,是在 2020 年 1 月出版。另外,這本篇幅只有 35 頁的《中華民國美學史》是 Emily 寫的,在 2025 年 3 月出版。
這段文字讀起來很混亂,資訊散落各處。我們要怎麼把它整理成表格?
找出共同性質
首先,標記出這段文字中的關鍵資訊:
- 書名:資料庫入門:從開始到放棄、中華民國美學史
- 作者:David、Emily
- 頁數:335、35
- 出版年月:2020年1月、2025年3月
這些就是「共同性質」——每本書都會有書名、作者、頁數、出版年月。
整理成表格
| 書名 | 作者 | 頁數 | 出版年月 |
|---|---|---|---|
| 資料庫入門:從開始到放棄 | David | 335 | 2020/01 |
| 中華民國美學史 | Emily | 35 | 2025/03 |
欄位設計的思考
整理的過程中,你可能會遇到一個問題:出版年月要怎麼存?
有幾種選擇:
- 存成「年月」格式:2020/01(目前的做法)
- 分成「年」和「月」兩個欄位:年=2020,月=01
- 存成完整日期:2020/01/01
哪一種比較好?這要看你之後的需求:
- 如果你需要比較「哪本書先出版」,存成日期格式會比較方便,因為資料庫有內建的日期比較功能
- 如果你把年和月分開存,之後要比較時就得先組合起來,比較麻煩
- 但如果存成完整日期,你會遇到另一個問題:出版資訊通常只有年月,沒有「日」,你要補什麼?全部補 1 號嗎?
這種「欄位該怎麼設計」的問題,在資料庫設計中非常常見,沒有標準答案,要根據你的使用情境來決定。
案例二:會員名冊
原始資料
程式講師 David 在 3 月 15 日加入,並且成為高級會員。David 有介紹另外一個講師,設計講師 Emily,他加入的時間是 3 月 18 日,目前只是一般會員。
找出共同性質
標記關鍵資訊:
- 職業:程式講師、設計講師
- 名字:David、Emily
- 入會日期:3月15日、3月18日
- 會員等級:高級會員、一般會員
但等等,還有一個資訊:Emily 是 David 介紹的。
這個「介紹關係」也是重要資訊,我們需要記錄下來。
整理成表格
| 職業 | 名字 | 入會日期 | 等級 | 介紹人 |
|---|---|---|---|---|
| 程式講師 | David | 3/15 | 高級 | NULL |
| 設計講師 | Emily | 3/18 | 一般 | David |
兩個重要概念
概念一:空值(NULL)
David 沒有介紹人,那這格要填什麼?
在資料庫中,我們用 NULL 來表示「沒有值」,代表「這個資訊不存在」。
概念二:資料之間的關聯
注意看 Emily 那一列的「介紹人」欄位,填的是「David」。
這個「David」不只是一個名字,它其實是指向另一筆資料——就是上面那一列的 David。
這種「一筆資料指向另一筆資料」的關係,叫做資料關聯。在資料庫中非常常見,之後學到「關聯式資料庫」時會深入探討。
欄位設計的思考
「職業」這個欄位,要存成「程式講師」還是分成「講師」+「專長領域」?
- 如果存成「程式講師」,之後要找「所有講師」就比較麻煩
- 如果分成兩個欄位,查詢會更靈活
這又是一個沒有標準答案的設計問題,要看你的需求。
案例三:活動日誌
原始資料
現在有一個社交活動叫做「反社交社交俱樂部」,這個活動會在 4 月 1 日舉行,主持人是 David,而 Emily 已經被邀請來參加這場盛會。
找出共同性質
- 活動名稱:反社交社交俱樂部
- 日期:4月1日
- 主持人:David
- 邀請對象:Emily
整理成表格(初版)
| 活動名稱 | 日期 | 主持人 | 邀請對象 |
|---|---|---|---|
| 反社交社交俱樂部 | 4/1 | David | Emily |
看起來沒問題?但仔細想想…
一個欄位需要存多個值怎麼辦?
如果這個活動不只邀請 Emily,還邀請了「David」和「小美」呢?
「邀請對象」這個欄位要怎麼存?
方法一:全部塞在同一格
| 活動名稱 | 日期 | 主持人 | 邀請對象 |
|---|---|---|---|
| 反社交社交俱樂部 | 4/1 | David | Emily, David, 小美 |
這樣做的問題:之後要查「David參加了哪些活動」會很麻煩,因為你要去「邀請對象」欄位裡面搜尋字串。
方法二:多加幾列
| 活動名稱 | 日期 | 主持人 | 邀請對象 |
|---|---|---|---|
| 反社交社交俱樂部 | 4/1 | David | Emily |
| 反社交社交俱樂部 | 4/1 | David | David |
| 反社交社交俱樂部 | 4/1 | David | 小美 |
這樣做的問題:活動名稱、日期、主持人重複了很多次,浪費空間,而且如果要改活動名稱,要改很多列。
方法三:拆成兩張表
這是比較專業的做法,把「活動」和「參加者」拆成兩張表,用關聯連起來。
活動表:
| 活動編號 | 活動名稱 | 日期 | 主持人 |
|---|---|---|---|
| 1 | 反社交社交俱樂部 | 4/1 | David |
參加者表:
| 活動編號 | 參加者 |
|---|---|
| 1 | Emily |
| 1 | 小明 |
| 1 | 小美 |
這樣一來,活動資訊只需要存一次,參加者要加幾個都可以。兩張表透過「活動編號」關聯在一起。
這個技巧叫做「正規化」,我們之後會專門討論。
現在你只要知道:當一個欄位需要存多個值時,通常代表你的表格設計需要調整。
整理資料的兩個關鍵步驟
經過這三個案例,我們可以歸納出整理資料的兩個關鍵步驟:
步驟一:找出共同性質,決定欄位
從雜亂的資料中,找出每筆資料都會有的「共同性質」,這些就是你的欄位。
例如:
- 商品都有:名稱、作者、頁數、出版日期
- 會員都有:名字、職業、入會日期、等級
- 活動都有:名稱、日期、主持人
即使目前只有一筆資料,你也可以想像「未來如果有更多資料,它們應該也會有這些共同性質」。
步驟二:思考資料之間的關聯
資料不是孤立的,它們之間會有關係:
- Emily 的介紹人是 David → 會員之間有「介紹關係」
- 活動的主持人是 David → 活動和會員之間有「主持關係」
- 活動的邀請對象是 Emily → 活動和會員之間有「參加關係」
這些關聯要怎麼記錄在表格中,是資料庫設計的核心問題。
小結
這篇文章我們練習了如何把雜亂的資料整理成表格,重點包括:
- 找出共同性質 → 決定表格的欄位
- 思考資料關聯 → 決定資料之間如何連結
- 處理空值(NULL) → 有些欄位可能沒有值
- 一個欄位多個值的問題 → 可能需要調整表格設計
這些都是資料庫設計的基礎觀念。在之後的課程中,我們會學習更專業的設計方法,例如「正規化」,來解決這些問題。
下一篇文章,我們會開始學習如何操作資料庫中的資料——新增、查詢、修改、刪除,也就是所謂的 CRUD。