WEBサービス創造記

WEBサービスを作ったり保守したりしてる人のメモブログです。

キーと関数従属 〜 リレーショナル・データベースの初歩 〜

      2014/03/11

キー

以下のような銀行口座のテーブル(以下、本例と記す)があるとする。

+----------+--------+--------+----------+------+------+------+----------+------+
| 口座番号 | 店番号 | 支店名 | 顧客番号 | 氏名 | 地方 | 住所 | 電話番号 | 残高 |
+----------+--------+--------+----------+------+------+------+----------+------+

この表についての注釈は以下の通りで、このことを念頭に続きを読んでいただきたい。

  • 口座番号にはテーブル内で一意な値が割り当てられているものとする
  • 顧客番号には”店番号が同じレコードの間では”一意な値が割り当てられているものとする
  • 氏名・住所は重複してもいい

キーとは、このようなテーブルに格納されている1つのレコード(1行ともいう)を特定することができる項目(※1)、もしくは項目の組み合わせのことをいう。

主キー

一般的に、リレーショナル・データベースのテーブルは主キーとそれ以外の項目(カラム)で構成されているといえる。

主キーは最も中心的なキーで、テーブル中での一意な値が割り当てられる。
本例の場合、口座番号は一意であり、これが顧客を特定するための主キーとなる。

一意な値は、インデックスなどを利用してレコードへの効率的なアクセスを行うことができるので、リレーショナル・データベースにおけるレコードの識別子として好ましいものとされている。

候補キー

キーの種類には主キー以外にもいくつかあり、他の代表的なキーには候補キーがある。

候補キーはテーブルの中からレコードを特定できるキー項目のことである。したがって、前述した主キーも候補キーの一種である。
候補キーはひとつの項目であるとは限らず、複数の項目が組み合わせてなることもある。

本例の場合、顧客番号は一意ではないが、店番号と顧客番号を組み合わせると一意になる。
この組み合わせは、顧客を特定できるため候補キーである(※2)。

リレーショナル・データベースのテーブルには必ずひとつ以上の候補キーが存在する。

関数従属

ある項目が決まれば他の項目が決まることを関数従属という。

例えば、銀行口座テーブルでは口座番号(主キー)は顧客ごとに一意に割り振られているので、口座番号が決まれば顧客情報を登録することができる。
逆にいえば口座番号が決まらないと、そのレコードはどの顧客のものなのか識別する術がないため、顧客情報を保存することはできない。

上記の例のように、候補キーが決まらなければ他の項目の値も決めることができない。
なぜなら、候補キーがない場合はそのレコードを特定することができないからである(具体的には、非キー項目の内容が全く同じで候補キー項目が定義されていない複数のレコードがあった場合は、それらを識別することができない)。

したがって、候補キーは関数従属させる側の項目であり、キー以外の項目は関数従属される項目である。
関数従属とはこのような候補キーと非キー項目の法則的な関係を意味する言葉である。

リレーショナル・データベースでは候補キーとそれ以外の項目(非キー)の関係は関数従属であるといえる。

本例では、以下(※3)のような関数従属が成り立っていると言える。

口座番号 → 店番号
口座番号 → 口座番号
...以下、主キーである口座番号以外のすべての項目で同じように関数従属が成り立つ

{店番号, 顧客番号} → 店名
{店番号, 顧客番号} → 氏名
{店番号, 顧客番号} → 残高

また、関数従属にはいくつが種類がある。

完全関数従属

上記の関数従属の関係のうち、{A,B} → Cであるが、A → C・B → Cが共に成り立たない関数従属の形を完全関数従属という。

本例では{店番号, 顧客番号}に残高が関数従属している。

{店番号, 顧客番号} → 残高

しかし、候補キーの項目個々に対して関数従属が成り立つかを見てみると、共に成り立たない(つまり、候補キー店番号・顧客番号両方とも定まっていないとだめで、どっちか一方しか決まっていない場合はだめ)。

店番号 → 残高
顧客番号 → 残高

このような場合、残高は候補キー{店番号, 顧客番号}に完全関数従属しているという。

部分関数従属

完全関数従属とは違い、{A,B} → Cであるが、A → C・B → Cのどちらかが成り立つ関数従属の形を部分関数従属という。

本例では{店番号, 顧客番号}に店名は関数従属している。

{店番号, 顧客番号} → 店名

つづいて、候補キーの項目個々に対して関数従属が成り立つかを見てみる。
以下は成り立たない。

顧客番号 → 店名

しかし、店番号が決まれば店名も決めることができるので、以下は成り立つ。

店番号 → 店名

このような場合、店名は候補キー{店番号, 顧客番号}に部分関数従属しているという。

推移関数従属

A → B → CのようなAが決まるとBが決まり、その結果Cが決まるという形の関数従属を推移的関数従属という。
つまり、非候補キー項目の中で関数従属がなりたつ場合が該当する。

本例では、地方が住所に関数従属している。

住所 → 地方

ここでの地方とは、具体的には関東や九州などのことである。
住所は非候補キー項目である。しかし、その住所が決まれば地方も決めることができるという状態になっている。

一方で住所は顧客番号に関数従属している。

顧客番号 → 住所

つまり、以下が成り立つ。

顧客番号 → 住所 → 地方

このような場合、地方は候補キー{顧客番号}に推移関数従属していると言える。

注釈


※1 項目は「属性」や「カラム」、「列」など様々な呼び方があるので注意。また、キーとなるカラムをキー属性やキー列と呼ぶこともある
また、「テーブル」は「表」とよばれることもあるし、「レコード」は「行」と呼ばれることもある。


※2 候補キーの中で主キーにならなかったキーを代理キーと呼ぶ


※3 X が Y を関数従属させている様を、X → Y と記述する。


※地方という項目は推移関数従属の説明のために無理やり作った感が否めませんが、ご容赦ください

 - データベースサーバ構築 , , , , , , ,