大量のデータを操作する際は,データの形を扱いやすく整えることが必要だ。特にRDBにおいては,データの属性間の関係が絡み合っていると,内容を正しく保てないことがある。今回はデータの形を整える基礎理論である正規化について,RDBの場合を中心にその考え方や手順を解説しよう。

 リレーショナル・データベース(RDB)の特徴は,表(テーブル)をデータ構造としていることだと,前回述べた。いかに使いやすく実用的な表を作れるかが,RDB設計のカギとなる。

 表の作成は,データ項目を「ユーザーが知りたいことは何か」という観点で洗い出すことから始まる。例えば,社員名簿のRDBでは,「社員番号」,「氏名」,「部署」,「役職」,「内線番号」といった項目を洗い出す。そして,個々の項目のデータ型(文字列,整数,浮動小数点数など)を決定していく。

 では,データ項目とデータ型が決まったら,それらを横に並べて1つの表にすれば表は完成するのだろうか。RDBの設計はそれほど単純でない。データに対して追加,更新,削除といった操作を加えても,データが矛盾なく内容を正しく保つためには,「正規化」という作業を行わなければならない。

「キー」の役割を知る

 正規化の具体的な説明に入る前に,「キー」について確認しておこう。キーは,行を一意に判別したり,表同士を結びつける役割を担う。正規化を理解するうえでは欠かせないものだ。キーは通常,表の中の特定の属性,もしくは属性の組み合わせを指す。ここで言う「属性」とは,集合論における「列」の呼び名である。

 キーには,3つの種類がある。まず,ある表において,行を一意に識別できる属性(または属性の組み合わせ)を「候補キー(candidate key)」と言う。

 候補キーは,1つだけとは限らない。候補キーが複数ある場合は,設計者の判断で表を代表するキーを1つ定める。そのキーが「主キー(primary key)」である。

 また複数の表同士を結びつけるための属性がキーになることもあり,これを「外部キー(foreign key)」と呼ぶ。外部キーは他の表の主キーになると考えればよい。

「表」に潜む様々な問題

 前述したように,正規化が必要な理由は,RDBの内容を操作(追加,更新,削除)しても,データを矛盾なく正しく保つためである。では,十分に表を正規化していないと,どんな問題が生じるのか。

 図1は,正規化が十分に行われていない表だ。この表に操作を加えると,いくつかの問題が発生する恐れがある。

図1●十分に正規化されていない表では様々な問題が起きる
図1●十分に正規化されていない表では様々な問題が起きる
正規化が十分でないと,本来は同じ内容であるはずのデータが更新によって異なってしまったり,あるデータを削除すると関連する別のデータも消えてしまうといった問題が生じる可能性がある
[画像のクリックで拡大表示]

 例えば,データを「更新」する際の問題だ。営業部の内線番号が「100」から「111」に変わり,データの更新作業が必要になったとしよう。表には内線番号が「100」の行が2つある。うっかりして片方の更新を忘れると,「100」という存在しないデータが残ってしまう恐れがある。

 データを「削除」する際にも問題が発生する。例えば,経理部の「日経花子」が退職したとする。それに伴い日経花子の行を削除すると,表の中から「経理部」という部署に関する情報が消えてしまうのだ。

 もちろん,部署に関するデータ(部署名,内線番号)を別の表としてもう1つ用意する方法もある。しかし,同じ情報が複数存在すると,変更があった場合にすべての表の内容を更新しなければならないほか,更新の際に間違った内容が入力される可能性もある。このため部署に関する情報は1つの表に集め,別の表からはそれを参照するようにした方が,メンテナンス性・整合性を確保するうえで最適なのは自明だろう。

属性間の関係を見直す

 こうした問題が生じるのは,属性同士の関係がきちんと整理されていないからである。逆に言えば,正規化とは,属性同士の関係を整理する作業に他ならない。

 属性同士の関係には,理論的に「関数従属性」,「多値従属性」,「結合従属性」の3つがある。これらは個々に独立したものではなく,図2に示したように「関数従属性 ⊂ 多値従属性 ⊂ 結合従属性」という包含関係になっている。

図2●3種類ある属性間の関係
図2●3種類ある属性間の関係
属性同士の関係には,(1)ある属性を決めると別の属性が決定される「関数従属性」,(2)1つの表の中に「1対n」の関係を持つ属性が2組以上含まれている「多値従属性」,(3)1つの表を3つ以上の表に分割し,元通りに結合できる性質を持つ「結合従属性」の3つがある。それぞれ独立したものではなく,包含関係にある。

 関数従属性とは,「関数y=f(x)」のように「xが決まればyが決まる」という関係のことである。多値従属性は,1つの表の中に「1対n」の関係を持つ属性が2組以上含まれている場合を指す。結合従属性は,1つの表を3つ以上の表に分割し,元通りに結合できるという性質である。

 正規化の作業では,「関数従属性の排除→多値従属性の排除→結合従属性の排除」の順番で,段階的に従属性を排除し,属性同士の関係を整理していく。複雑に絡み合った鎖が,徐々に解き放たれていくイメージだ。具体的には,6つの理論的なステップがある図3)。

図3●正規化の段階と作業内容
図3●正規化の段階と作業内容
正規化の段階は全部で6つある。第二正規形からボイス・コッド正規形までの3段階は,関数従属性を排除する作業,第四正規形は多値従属性を排除する作業,第五正規形は結合従属性を排除する作業となる

 従属性の種類が3つなのに,どうして正規化のステップが6つなのかと思った読者もいるかもしれない。これは,関数従属性を「部分関数従属性(第二正規形で排除される)」と「推移関数従属性(第三正規形で排除される)」に分けているからだ。