関数従属性 【functional dependency】
概要
関数従属性(functional dependency)とは、リレーショナルデータベース(RDB)の表で、2つの属性の間で片方の値を決定するともう一方の値が一意に決まるという性質のこと。属性間の関数従属性を元に正規化が行われる。ここでの「関数」は一意に定まる対応関係のみを表し、数学関数のような規則性は必要ない。例えば、社員名簿を管理する表で、「社員ID」を決定すれば「氏名」は一意に定まる。このとき、「社員ID」を「決定項」、「氏名」を「従属項」あるいは「被決定項」と呼び、「氏名は社員IDに関数従属している」という。この関係は「社員ID→氏名」のように表記される。同姓同名の可能性を考慮すると逆の関係は成立しない。
また、例えば「注文番号, 商品ID, 商品名, 数量」のように候補キー2つ(注文番号・商品ID)で複合主キーを構成するような表で、「注文番号」と「商品ID」の値の組み合わせに対して、「商品名」および「数量」がそれぞれ従属しており、「{注文番号, 商品ID}→商品名」(または数量)という関係が成立している。
このとき、「商品名」は「商品ID」が決まれば「注文番号」の値によらず決まるため、「商品ID→商品名」という関係も同時に成立している。これを「部分関数従属」という。一方、「数量」は「注文番号」と「商品ID」のいずれか片方のみでは決定できず、両者の組み合わせにのみ従属する。これを「完全関数従属」であるという。
また、「社員ID, 氏名, 住所, 郵便番号」という表で、「社員ID→住所」が成り立つが、「住所」が決まれば「郵便番号」も一意に定まるため「住所→郵便番号」も成り立っている。このとき、「社員ID→郵便番号」という従属性も成立し、「郵便番号」は「社員ID」に「推移的関数従属」しているという。
リレーショナルデータベースの表を構成する項目の冗長性や不整合を排除することを正規化という。どのような関係を整理するかによって第1正規形、第2正規形、第3正規形…といった段階があるが、第2正規形以降の正規化は項目間の関数従属性に従って関係の整理を行っていく。
(2024.3.1更新)