SQLやRDBMSにおける主キーとは、「表を関数としてみるときの入力」である


あなたは次の8名を雇用しました。

  • 野々村真由子
  • 豊田竜太郎
  • 小保方守
  • 佐村河内春子
  • 湯川淳也
  • 樋田遥菜
  • カルロス正人
  • 内田ゴーン

人事部が、彼らの住所をあなたに知ってもらうために、表1を送信してくれました。

表1. 従業員の氏名とその住所

氏名 都道府県 市区町村 それ以降の住所
野々村真由子 東京都 足立区 █████
豊田竜太郎 青森県 青森市 █████
小保方守 神奈川県 █████ 鵠沼X-X-X
佐村河内春子 山口県 █████ 綾羅木本町Y-Y-Y
湯川淳也 █████ 千葉市 中央区Z-Z-Z
樋田遥菜 █████ 那覇市 首里石嶺町A-A-A
█████ 兵庫県 明石市 和坂B-B-B
█████ 栃木県 宇都宮市 西刑部町C-C-C

表1は、システムの問題でデータが一部欠損してしまっています。
1行目に関しては「従業員 野々村真由子の住所が、ほとんどわかるけど一部だけ分からない」といえます。
2行目から6行目に関しても同様です。
しかし、7行目、8行目に関しては「この従業員、そもそも誰なのかわからない」という、別格の問題が生じてしまいます。
消去法で「カルロス正人」と「内田ゴーン」の2名であることは特定できても、2名の住所を知らないので、どっちがどっちなのかわかりません。
結局、彼ら2名の住所に関する情報は、この表からほとんど得られないということになります。
よって、たったこの1列が欠損しただけで、あたかも他のすべての列が欠損したかのような損害を受けなくてはならないのです。

このように考えると、表1について、次のようなことが言えます。

  1. 氏名の列(カラム)だけは、欠損しないでほしい
  2. あなたは、氏名の列をみて「あの従業員だ」と頭の中でイメージし、氏名以外の列を見て、「あの従業員に関する追加情報」をテーブルから得ている。

2.であるからこそ、氏名が欠損すると、そもそも頭の中で「どの従業員なのか」をイメージできないわけです。
2.を写像を使って言い換えると、

(厳密には)あなたは$$m: 氏名→(都道府県×市区町村×それ以降の住所)$$な写像$m$として表1を使っている

(わかりやすく言うと)あなたは$$f(氏名) = (都道府県, 市区町村, それ以降の住所)$$な関数$f$として表1を使っている

といえます。

以上のように、人がテーブルから何かを知るとき、無意識のうちにテーブルを写像(関数)とみているといえます。
そしてそのような写像における定義域(関数における入力)を、主キーといいます。

今回の場合は、氏名が主キーです。