Kotaro7750's diary

低レイヤを中心とした技術ブログ、たまに日記

データベース正規化

正規化とは

正規化とはデータベースにおいて、データの冗長性をなくすことです。データの属性間に依存関係がある時に、複数のテーブルに分けたりすることで無駄な属性を省くことができます。正規化により、データベース内では1データ1箇所の原則が守られます。

この依存関係のことを関数従属といいます。

関数従属

ある属性Aが決まると、属性Bも一意に決まるとき、属性Bは属性Aに関数従属するといいます。この関数従属にも複数の種類があり、以下の3つに分類されます。

1.部分関数従属

Aが決まるならBも決まる、という関数従属においてAが複数の属性から成り、更に実はBはAの一部の属性だけでも決まるとき、BはAに部分関数従属するといいます。

2.完全関数従属

部分関数従属していない状態のこと。

3.推移関数従属

BがAに関数従属、CがBに関数従属、AはBに関数従属でないとき、CはAに関数従属であるという。

正規化の手順

正規化は本来第五正規形までありますが、実用上は第三までで間に合うケースが多いらしいのでここでは第三正規形まで扱います。

非正規形->第一正規形

非正規形とは、例えば紙での帳簿、領収書などと言った現実における情報の蓄積形態のことを言います。これではデータベースで扱えないので順を追って正規化していきます。

まずは非正規形での情報を以下の2つを守って愚直に表にします。

  • 一列には一つの属性を配置する
  • 行を特定できる属性(主キー)を考える。

この表を作ると、同じような属性が繰り返されていることがあります。この繰り返しを排除するのが第一正規化です。 下のような手順を追って正規化します。

  1. 繰り返されている部分を別の表に切り出す。
  2. 切り出した表の中で行を一意に決める主キーを定める(複数可)。
  3. 切り出した表と切り出し元の表を対応付けるために、外部キーとして参照する属性を定める

第一正規形->第二正規形

第二正規化は主キーが複数ある表に対し適用されます。目的としては主キーの関数従属関係による冗長部分を解決することです。 具体的には下のように行います。

  1. 主キー集合に対し部分関数従属の関係にある属性とその主キーを別の表に切り出す。
  2. 切り出した表と切り出し元の表を対応付けるために、外部キーとして参照する属性を定める。

第二正規形->第三正規形

第三正規化の目的は、主キー以外の属性間の関数従属関係による冗長部分を解決することです。手順は第二正規形のときとほぼ同じですが、主キー以外の従属関係を見るという点のみが異なります。