keyword 5 正規化
データベースに格納するデータは、適当な単位で適当に格納するわけにはいきません。きちんと設計して格納する必要があります。データがどのような「実体」を表わしているのかを洗い出し、いかに効率的に分類し集合化したら良いかを検討します。この作業を「正規化」と言います。
正規化はデータベースにとっては大変重要な作業となります。正規化の作業を行なわないと、同じ実体を持つデータが複数の箇所に格納されるケースが発生します。そのような場合、データの修正時に修正漏れが生じ、データベースに格納されているデータに矛盾が発生する可能性があるのです。
例えば、社員表と部署表があったとします。この社員表には社員情報が管理され、部署表には部署に関する情報が管理されています。もし、ここで部署名の「人事部」を「管理部」に変更すると、部署表の部署名を変更するだけでなく、社員表の部署名も関係ある場所はすべて変更しなければならなくなります。社員表に部署名がなかったとしたら、部署表の「人事部」を「管理部」に1箇所だけ変更すれば良いので、こういった問題はなくなるわけです(図10)。

このように正規化を行ない、データを1箇所で管理することにより、修正漏れをなくすようにします。正規化は正規化の程度によって第1正規化から第5正規化までに分けられていますが、一般的には第3正規化まで行ないます。通常の作業においてほとんどの場合、第3正規化まで行なえば的確な正規化を表現できます。なお、正規化が行なわれていない状態を「非正規化」と呼んでいます。
正規化の作業を行なう場合には、行を何で識別するのかということを必ず考えます。この識別するものを「主キー」と言い、表の特定の列に設定します。例えば、先ほどの社員表で言うと、社員を識別するものとして社員番号を主キーと想定します。社員を識別する場合には氏名で行なうと考えがちですが、同姓同名の人が社員にいることも想定されます。そのため氏名は識別するものとはなり得ません。つまり主キーには必ず値が必要で、かつ値が重複していてはならないというルールになります。
第1正規化から第3正規化を簡単にまとめると表2のようになります。
| 正規化 | 正規化した結果 | 具体的に行なうこと |
|---|---|---|
| 第1正規化 | データ内に繰り返される部分がない | 繰り返される部分を別の行にするか、別の表として分割する |
| 第2正規化 | 同一行内で主キーが決まればほかの列の値も一意に決まる | 一意に決定できない部分は別の表として分割する |
| 第3正規化 | 主キー以外の列において、それぞれが従属関係(列の値同士の関係)を持っていない | 従属関係を持つ部分を別の表として分割する |
なお、正規化を進めるとデータ検索の効率が悪くなります。例えば社員表から部署名を取り除くと、その社員がどの部署に所属しているかを具体的に調べるためには、社員表を検索した後に部署表を続けて検索する必要があり、検索時間が長くなります。そのため、検索時間の短縮のために社員表に部署名を残しておく場合があります。これが正規化をしない非正規化の代表例です。非正規化をした場合、データベースのデータの修正漏れが発生する可能性が残るので、アプリケーションなどでこれを防ぐためのロジックを検討し、付け加える手間が生じます。
