データベース設計における関数従属の種類と具体例
データベース設計では、「関数従属」という概念が重要です。関数従属はデータの冗長性を避け、正規化を適切に行うために必要な知識です。この記事では、「完全関数従属」「部分関数従属」「推移的完全関数従属」を具体例とともに解説します。
🔹 関数従属とは?
関数従属(Functional Dependency)とは、「ある属性(または属性の集合)が決まれば、他の属性が一意に決まる」関係のことを指します。以下では、その具体的な種類を解説します。
🔹 完全関数従属(Full Functional Dependency)
完全関数従属とは、「複合キーのすべての属性を用いて初めて、他の属性が一意に決定できる状態」を言います。
具体例
次のテーブルを考えます。
受講者番号 | 講義番号 | 成績 |
---|---|---|
001 | A01 | 80 |
001 | A02 | 85 |
002 | A01 | 75 |
- この場合、「受講者番号」と「講義番号」の複合キーにより「成績」が決定されます。
- 「受講者番号」だけや「講義番号」だけでは成績を特定できず、両方が必要です。
- このとき、「成績」は複合キーに完全関数従属しています。
🔹 部分関数従属(Partial Functional Dependency)
部分関数従属とは、「複合キーの一部だけで他の属性が決定できる状態」を言います。これは好ましくない従属関係であり、正規化によって解消すべき対象です。
具体例
次のテーブルを考えます。
社員番号 | 部署コード | 部署名 |
---|---|---|
1001 | D01 | 営業部 |
1002 | D01 | 営業部 |
1003 | D02 | 開発部 |
- 上記のテーブルは、複合キーとして「社員番号」「部署コード」を想定しています。
- しかし、「部署名」は「部署コード」だけで特定可能です。
- つまり、「部署名」は複合キーの一部(部署コード)だけに従属しているため、部分関数従属となります。
部分関数従属の問題点
- データの重複が発生し、更新の不整合が生じる可能性があります。
- これは第2正規形で解消する必要があります(別テーブルに分離)。
🔹 推移的完全関数従属(Transitive Functional Dependency)
推移的完全関数従属とは、「主キーに依存する非キー属性が、さらに別の非キー属性を決定する」という間接的な関数従属関係を指します。これも正規化によって解消する必要があります。
具体例
次のテーブルを考えます。
社員番号 | 社員名 | 部署コード | 部署名 |
---|---|---|---|
1001 | 佐藤 | D01 | 営業部 |
1002 | 鈴木 | D01 | 営業部 |
1003 | 田中 | D02 | 開発部 |
- 「社員番号」が主キーであり、「部署コード」が社員番号に関数従属しています。
- しかし「部署名」は「部署コード」に依存しているため、「社員番号」→「部署コード」→「部署名」という推移的関係が生じます。
- この推移的完全関数従属は第3正規形で解消されるべきです。
🔹 正規化による解消方法
上記の問題を解決するには、正規化を行います。
- 第1正規形:全ての属性が単一の値を持つ。
- 第2正規形:部分関数従属を解消(部分的に従属している属性を別テーブルへ)。
- 第3正規形:推移的完全関数従属を解消(間接的な従属を別テーブルへ)。
正規化後のテーブル例(第3正規形)
社員テーブル
社員番号 | 社員名 | 部署コード |
---|---|---|
1001 | 佐藤 | D01 |
1002 | 鈴木 | D01 |
部署テーブル
部署コード | 部署名 |
---|---|
D01 | 営業部 |
D02 | 開発部 |
🔹 まとめ
データベース設計では関数従属を理解し、適切な正規化を実施することで冗長性や不整合を防ぎ、整合性の高いデータベースを構築できます。