関数従属性 (Functional Dependency)
関数従属性とは、リレーション上で属性集合 X の値が定まれば属性集合 Y の値が一意に定まる関係 (X → Y と表記) であり、テーブルの意味的整合性と正規化判定の基準として用いられる概念である。
「A が決まれば B も決まる」= 関数従属
「社員ID が分かれば、その人の氏名は 1 つに決まる」— これは当たり前に感じる関係だが、 正規化の議論では大事なので名前が付いている。関数従属 (functional dependency, FD) だ。 矢印で書くと 社員ID → 氏名。矢印の左が「決める側」、右が「決まる側」。
「決まる」というのは、あるテーブルのどの行を見ても「社員ID が同じなら氏名も同じ」 が成り立つ、という意味。 たまたま同じだった、ではなく、業務ルールとして「社員ID が同じなら氏名も同じはず」と言えるものだけを関数従属として扱う (1 件でも例外が出れば関数従属とは呼ばない)。
| 社員IDPK | 氏名 | 入社日 | 部署ID | 部署名 |
|---|---|---|---|---|
| … | … | … | … | … |
- 社員ID氏名完全関数従属
- 社員ID入社日完全関数従属
- 社員ID部署ID完全関数従属
- 部署ID部署名完全関数従属
- 社員ID部署名推移関数従属部署ID を経由して成立
社員ID → 部署名 も一見成り立っているが、実は「社員ID → 部署ID → 部署名」を経由して間接的に決まっているだけ。この「経由あり」の関数従属を「推移関数従属」と呼び、後で第3正規形が排除の対象にする。
3 種類の関数従属 (これから何度も出てくる)
関数従属には 3 種類あり、それぞれが 2NF・3NF が扱うテーマに対応している。 今は名前と雰囲気だけ覚えておけば OK。実例は各正規形のページで詳しく見る。
- 完全関数従属: 「A と B が両方揃って初めて C が決まる」タイプ。 例:
(注文ID, 商品ID) → 数量。注文ID だけ、商品ID だけでは数量は決まらない。 これは正常な関数従属で、排除の対象ではない。 - 部分関数従属: 「(A, B) の一部分 (例えば B だけ) で決まってしまう」タイプ。 例:
(注文ID, 商品ID) → 商品名は実は商品ID → 商品名だけで成り立つので、注文ID は不要。 これがあると同じ商品名が何度も繰り返されるので、第2正規形 で切り出す対象になる。 - 推移関数従属: 「A → B → C と経由してしまう」タイプ。 例:
社員ID → 部署ID → 部署名。社員ID から部署名を「直接」決めているのではなく、部署ID を経由している。 これがあると同じ部署名が何度も繰り返されるので、第3正規形 で切り出す対象になる。
なぜこの概念が正規化の判定基準になるのか
「同じ情報を 1 か所に書く」を判定するとき、関数従属で見るのが一番シンプル。 例えば 部署ID → 部署名 という関数従属があるということは、 「部署ID が同じ行は部署名も必ず同じ」= 部署名が繰り返し書かれている、ということ。 つまり関数従属を見つけると、そのまま「重複している情報の場所」も見つけたことになる。
正規化 (1NF → 2NF → 3NF) は、こうした「重複を生む関数従属」を段階的に切り出していく手順として理解できる。 各正規形が「どのタイプの関数従属を排除するのか」を意識すると、全体の流れがすっきり見えてくる。
先に「キーの階層」を押さえておこう
関数従属の話を正確にするには キーの階層(スーパーキー・候補キー・主キー) の理解が前提になる。 「主キー全体で決まる」のか「主キーの一部で決まってしまう」のかが、2NF・3NF の判定を分けるからだ。
よくある疑問
関連トピック
- 基礎なぜ正規化が必要か
正規化されていないテーブルでは、同じ事実を複数の行に重複して持つために、挿入・更新・削除の各操作で矛盾や情報損失が発生する。この「更新時異常」を体系的に排除するのが正規化の目的である。
- 基礎キーの階層
正規化の議論に入る前に、スーパーキー・候補キー・主キーの3階層と、外部キー・代替キー・複合キーとの関係を整理する。2NF/3NF の「非キー属性」「部分従属」を語るための語彙を揃える。
- 基礎第1正規形
全ての属性がアトミック値をとり、繰り返しグループを含まない状態が第1正規形。非1NF (unnormalized form) の代表例を並置し、1NF に変換する具体的手続きを図解する。
もっと学びたい方へ(おすすめ書籍)
テーブル設計と正規化、パフォーマンス考慮のインデックス設計まで実務レベルで学べる定番書。第2版ではクラウド対応も強化。
IPAデータベーススペシャリスト試験の総合対策書。インデックス関連は本サイトと合わせて学ぶと理解が深まる。
リレーショナルモデルの理論から、インデックス設計を含む実務で使えるSQLまで解説。
SQLの本質的な使い方と、インデックスが効くクエリの書き方を学べる。ウィンドウ関数など現代SQLも網羅。
実務でやりがちなSQL・DB設計のアンチパターンとその回避策を体系的に学べる。
PostgreSQLの内部構造・ストレージ・インデックス機構を丁寧に解説。設計と運用計画の鉄則が学べる。
本セクションはAmazonアソシエイトのリンクを含みます。
もっと深くDBを学びたい方へ。
たいてっくが、SQL・データベース設計・パフォーマンスチューニング・ IPAデータベーススペシャリスト対策まで、1対1で学習をサポートします。まずは無料相談から。