👋

関数従属、完全関数従属、部分関数従属、推移関数従属の概念と具体例

2024/03/16に公開

1. 関数従属(Functional Dependency)

定義: ある属性(列)の値Xが決定すると、別の属性の値Yが決まる状態です。BはAに関数従属すると言います。これを「A → B」と表します。

  • 関数従属が成立する例:
学生ID | 学生名 | 学年
-------------------
1      | 太郎   | 3
2      | 花子   | 2
3      | 次郎   | 1

関数従属が成立する例のテーブルでは、「学生ID → 学生名」と「学生ID → 学年」が成立します。学生IDが学生名と学年を一意に決定します。

  • 関数従属が成立しない例:
顧客ID | 顧客名   | 住所
-----------------------
1      | 山田太郎 | 東京
2      | 佐藤花子 | 大阪
2      | 佐藤花子 | 東京

このテーブルでは、「顧客ID → 住所」の関数従属が成立しません。顧客IDが2の顧客は大阪と東京、2つの住所を持っています。これは、同一の顧客IDで異なる住所が存在するため、顧客IDによって住所を一意に決定することができません。

2. 完全関数従属(Full Functional Dependency)

定義: BがAの全体にのみ関数従属し、Aの任意の真部分集合には依存しない場合、BはAに完全関数従属すると言います。

  • 完全関数従属が成立する例
商品ID | カラー | 商品名
-----------------------
1      | 赤     | ボールペン
2      | 青     | シャープペンシル

「商品ID → 商品名」は完全関数従属で、「商品ID」と「カラー」の組み合わせによって「商品名」が一意に決まりますが、「商品ID」だけで「商品名」が一意に決定されます。

  • 完全関数従属が成立しない例
注文ID | 商品ID | 商品名       | 数量
-------------------------------------
1      | 1      | スマートフォン | 2
1      | 2      | タブレット     | 1
2      | 1      | スマートフォン | 1

ここで、「{注文ID, 商品ID} → 数量」は成立しますが、「注文ID → 数量」や「商品ID → 数量」は成立しません。数量は「注文ID」と「商品ID」の組み合わせに完全に依存しています。この場合、「数量」は「注文ID」や「商品ID」のいずれか一方に完全関数従属しているわけではないため、完全関数従属の例にはなりません。

3. 部分関数従属(Partial Functional Dependency)

定義: Aの部分集合によってもBが関数従属する場合、BはAに部分関数従属します。第2正規化をする際に重要な概念になります。

  • 部分関数従属が成立する例
学生ID | 科目ID | 学生名     | 成績
-----------------------------------
1      | 1      | 山田太郎   | A
1      | 2      | 山田太郎   | B
2      | 1      | 佐藤花子   | A
2      | 2      | 佐藤花子   | C

「学生ID → 学生名」は、学生名が学生IDによって一意に決定されることを意味します。これは、複合キー(学生IDと科目ID)のうち、学生IDだけを見ても学生名を特定できることを示しています。これが部分関数従属の典型的な例です。

  • 部分関数従属が成立しない例
学生ID | 科目ID | 科目名   | 成績
-------------------------------
1      | 1      | 数学     | A
1      | 2      | 英語     | B
2      | 1      | 数学     | C

ここで、「{学生ID, 科目ID} → 成績」は成立しますが、「学生ID → 成績」や「科目ID → 成績」は成立しません。成績は「学生ID」と「科目ID」の組み合わせに依存しており、これらの属性のどちらか一方だけでは成績を一意に決定できません。このケースでは部分関数従属の条件を満たさないため、部分関数従属の例にはなりません。

4. 推移関数従属(Transitive Functional Dependency)

定義: A → BかつB → Cの場合、CはAに推移関数従属します。第3正規化を実施する際に使用します。
推移関数従属は、ある属性Aから別の属性Bへの関数従属があり、さらにBから別の属性Cへの関数従属がある場合に、AからCへの間接的な関数従属が成立する状況を指します。このとき、AからBへ、そしてBからCへの直接的な関数従属に基づいて、AからCへの関数従属が推論できる場合にのみ、「A → C」の推移関数従属が成立します。

  • 推移関数従属が成立する例
社員ID | 部署   | 部署所在地
-----------------------
1      | 販売   | 東京
2      | 開発   | 大阪
3      | 販売   | 東京

「社員ID → 部署」と「部署 → 部署所在地」が成立します。これにより、「社員ID」から間接的に「部署所在地」を一意に決定できます。つまり、「社員ID」から「部署所在地」への推移関数従属が存在します。

  • 推移関数従属が成立しない例
  • テーブル: 学生情報
学生ID | 学生名   | クラブID
-------------------------
1      | 鈴木一郎 | C1
2      | 佐藤二郎 | C2
3      | 田中三郎 | C3

  • テーブル: クラブ活動
クラブID | 活動日
---------------
C1      | 月曜日
C2      | 火曜日
C3      | 水曜日

「学生ID → 学生名」は成立します。これは、各学生IDが一意の学生名を持つという直接的な関数従属を示します。
「学生ID → クラブID」も成立します。これは、各学生が一意のクラブに所属しているという直接的な関数従属を示します。
「クラブID → 活動日」も成立します。これは、各クラブIDが一意の活動日を持つという直接的な関数従属を示します。
しかし、「学生ID → 活動日」の関係について考えると、学生IDが直接活動日を決定するわけではありません。学生が所属するクラブIDを通じて間接的に活動日が関連付けられていますが、これは推移関数従属の定義に沿った直接的な関数従属ではありません。

終わりに

資格の勉強がてら復習も兼ねて関数従属についてまとめました。お役に立ちましたでしょうか?何かを勉強する時、特に抽象的な概念や理論を理解するのはどのようなものであっても骨が折れますね。世の中に存在する概念や理論もたくさんの具体的な事象から導き出されているはずで、しからば具体的事象を取っ掛かりにして理解していくようにしています。今回も具体的な表から概念を説明するようにしました。この記事が皆さんのお役に立てていれば嬉しいです。

Discussion