部分関数従属(ブブンカンウスウドウ)とは | 意味や読み方など丁寧でわかりやすい用語解説
部分関数従属(ブブンカンウスウドウ)の意味や読み方など、初心者にもわかりやすいように丁寧に解説しています。
読み方
日本語表記
部分関数従属 (ブブンカンウスウゾク)
英語表記
partial functional dependency (パーティアルファンクショナルディペンデンシー)
用語解説
リレーショナルデータベースの設計において、データの整合性と効率性を保つために重要な概念の一つに「関数従属」がある。この関数従属の中でも、特に注意が必要な状態として「部分関数従属」というものがある。システムエンジニアを目指す上で、この概念はデータベースの正規化という設計手法を理解する上で不可欠となる。
概要
部分関数従属とは、簡単に言えば、テーブルの主キーが複数の属性(列)で構成されている場合(これを複合主キーと呼ぶ)、その主キーを構成する一部の属性だけで、他の非キー属性(主キーではない属性)が一意に決定されてしまう状態を指す。本来、複合主キー全体でなければ一意に決まらないはずの非キー属性が、主キーのごく一部によって決定されてしまうという状態だ。この状態は、データベース内にデータの重複(冗長性)を引き起こし、データの更新・挿入・削除時に予期せぬ問題(更新異常、挿入異常、削除異常)を発生させる原因となるため、データベース設計では解消することが求められる。具体的には、この部分関数従属を解消することで、データベースは「第二正規形」というより望ましい状態へと移行する。
詳細
まず、「関数従属」とは何かを理解する必要がある。リレーショナルデータベースにおける「関数従属」とは、ある属性(または属性の集合)Xの値が決まると、それに応じて別の属性(または属性の集合)Yの値が一意に決まる関係を指す。これを「XがYを関数的に決定する」と表現し、「X → Y」と表記する。例えば、「社員番号 → 氏名」という関係があれば、社員番号が決まれば氏名も一意に決まるということだ。
次に、部分関数従属の具体的な定義に入る。あるリレーション(テーブル)Rにおいて、属性集合Xが属性Yを関数的に決定する関係(X → Y)があるとする。ここで、Xがそのリレーションの候補キー(または主キー)であり、Yが非キー属性である(つまり、Yは候補キーのどの属性の一部でもない)という前提がある。このとき、Xの「真部分集合」X'(Xから一つ以上の属性を取り除いた集合)が存在し、そのX'もYを関数的に決定する(X' → Y)場合、これを「部分関数従属」と呼ぶ。
もう少し具体的に見てみよう。例えば、「注文詳細」というテーブルを考える。このテーブルには、「注文番号」「商品コード」「商品名」「単価」「数量」といった属性があるとする。ここで、主キーを「注文番号」と「商品コード」の組み合わせ({注文番号, 商品コード})と設定したとする。この主キーは複合主キーである。 このテーブルで、「商品コード」が決まれば「商品名」や「単価」が一意に決まる場合、「商品コード → 商品名」および「商品コード → 単価」という関数従属が存在することになる。 しかし、「商品コード」は主キー{注文番号, 商品コード}の真部分集合(主キーの一部)である。そして、「商品名」や「単価」は非キー属性だ。この状況はまさに部分関数従属に該当する。つまり、非キー属性である「商品名」や「単価」が、主キー全体ではなく、その一部である「商品コード」にのみ関数従属している状態である。
このような部分関数従属が存在すると、以下のような問題が発生する。
-
更新異常(Update Anomaly): 同じ商品が複数の注文に含まれている場合、各注文詳細レコードにその商品の「商品名」や「単価」が重複して格納される。もし商品の「単価」が変更された場合、その商品を含む全ての注文詳細レコードを更新する必要がある。もし一つでも更新し忘れると、データベース内で同じ商品に対して異なる単価が存在するというデータの不整合が生じてしまう。
-
挿入異常(Insert Anomaly): まだ一度も注文されたことのない新しい商品をデータベースに登録したい場合、その商品を識別する「商品コード」「商品名」「単価」といった情報だけでは、注文詳細テーブルにレコードを挿入することができない。「注文番号」という、本来その商品自体とは関係のない情報(注文の詳細を示す情報)が必要となってしまう。これは、商品の情報を登録するために余計な情報が要求されるという不自然な状況である。
-
削除異常(Delete Anomaly): ある商品が特定の注文に一度だけ含まれており、その注文がキャンセルされて注文詳細レコードが削除されたとする。この場合、その商品の「商品名」や「単価」といった情報が他のどこにも格納されていなければ、データベースからその商品に関する全ての情報が失われてしまう可能性がある。商品の情報自体は残しておくべきなのに、注文の削除によって意図せず失われるのは問題である。
これらの問題は、データが冗長に格納されていることに起因する。部分関数従属を解消するためには、データベースの「正規化」というプロセスが用いられる。特に、部分関数従属を解消することは「第二正規形」を満たすことと密接に関係している。
第二正規形とは、リレーションが第一正規形であり、かつ、非キー属性が候補キーのいかなる真部分集合にも部分関数従属しない状態のことである。つまり、部分関数従属があるテーブルは第二正規形を満たしていない。
部分関数従属を解消する方法は、テーブルを適切に分解することである。上記の「注文詳細」テーブルの例であれば、部分関数従属している属性(商品名、単価)と、それを決定する属性(商品コード)を別のテーブルとして分離する。
-
元の「注文詳細」テーブル: 主キー: {注文番号, 商品コード} 属性: 注文番号, 商品コード, 数量
-
新しく作成する「商品」テーブル: 主キー: {商品コード} 属性: 商品コード, 商品名, 単価
このようにテーブルを分解することで、「商品名」や「単価」は「商品」テーブルに一度だけ格納されるようになる。元の「注文詳細」テーブルからは「商品名」と「単価」を削除し、「商品コード」のみを残すことで、「商品」テーブルへの参照が可能になる。これにより、データの冗長性がなくなり、更新・挿入・削除異常は発生しなくなる。例えば、商品の単価が変更されても「商品」テーブルの該当レコードを一度更新するだけで済み、新しい商品の情報を登録する際は「商品」テーブルにレコードを追加するだけでよくなり、ある注文が削除されても商品の情報自体は「商品」テーブルに残るため失われることはない。
部分関数従属の理解と解消は、効率的で整合性の取れたデータベースを設計する上で非常に基本的ながら重要なステップである。