superkey 就是能唯一指出一列的欄位組合
「鍵」這組詞聽起來抽象,但判斷方法是一個猜謎遊戲:我給你某幾個欄位的值,你能不能在表裡唯一指出「就是這一列」?
拿一張排課表來玩(每位老師只教一門課):
| 學生 | 課程 | 老師 | |
|---|---|---|---|
| ① | 小明 | 資料庫 | 張老師 |
| ② | 小華 | 資料庫 | 張老師 |
| ③ | 小美 | 資料庫 | 李老師 |
| ④ | 小明 | 網路 | 王老師 |
| 我給你 | 指得出唯一一列嗎 | |
|---|---|---|
| 老師 = 張老師 | ①② 兩列 | ❌ |
| 課程 = 資料庫 | ①②③ 三列 | ❌ |
| 學生 = 小明 | ①④ 兩列 | ❌ |
| 課程 = 資料庫, 老師 = 張老師 | ①② 兩列 | ❌ |
| 學生 = 小明, 課程 = 資料庫 | 只有 ① | ✅ |
| 學生 = 小明, 老師 = 張老師 | 只有 ① | ✅ |
三個詞就此定義完畢:
| 詞 | 意思 | 這張表的例子 |
|---|---|---|
| superkey | 能唯一指出一列的欄位組合 | (學生,課程)、(學生,老師)、(學生,課程,老師) |
| 候選鍵 | 最小的 superkey(再拿掉任一欄就不行) | (學生,課程)、(學生,老師) |
| 鍵值欄位(prime attribute) | 出現在任何一個候選鍵裡的欄位 | 學生、課程、老師 — 三個全是 |
兩個常被跳過的點:
- 候選鍵可以有很多個,主鍵只是你從中挑一個來用 — 見 正規化的判準是候選鍵,不是主鍵。
- 「這張表一個非鍵值欄位都沒有」是可能發生的,而且它正是 BCNF 拿掉 3NF「只檢查非鍵值欄位」的前提 那個漏洞的成因。
(學生, 老師) 為什麼也是候選鍵:因為老師只教一門課,說出「小明 + 張老師」就等於說出了課程,三欄全湊齊。候選鍵取決於領域規則,不是看資料長相猜的。