関係データベースの初等キー正規形を扱う
初等キー正規形は初等キーに入らない重複を分ける
関係データベースの正規化で、第三正規形の次に置く段階が初等キー正規形 (Elementary Key Normal Form, EKNF) である。
3NF では、キー以外の列が、別のキー以外の列を経由して決まることはない。それでも、候補キーの一部が、キーではない列だけで決まる重複は残る。EKNF は、そのうち決まる側が初等キーに入っていないものを別の表へ移す。
ある列が、より少ない列の組では決まらず、その列の組でちょうど決まる関係を初等関数従属と呼ぶ。候補キーのうち、キー以外の列への初等関数従属を持つものを初等キーと呼ぶ。初等キーに入っている列を初等キー属性と呼ぶ。EKNF は、どの初等関数従属でも、決める側が候補キーであるか、決まる側が初等キー属性である状態である。
割当表の教室を科目の表へ移す
第三正規形の割当表では、1つの科目の教室は1室で、1室で行う科目は1つである。行を区別する候補キーは (学級, 科目) と (学級, 教室) の2つある。
| 学級 | 科目 | 教室 |
|---|---|---|
| 甲組 | 数学 | 北棟 |
| 乙組 | 数学 | 北棟 |
| 甲組 | 英語 | 南棟 |
(学級, 科目) が分かれば教室は決まる。ただし教室は科目だけでも決まる。列を1つ削っても決まるので、この関係は初等関数従属ではない。(学級, 教室) から科目への関係も、教室だけで決まる。どちらの候補キーも初等キーにならない。初等キー属性はない。
科目が分かれば教室が決まる関係は、科目を削ると決まらなくなるので初等関数従属である。科目は候補キーではなく、教室は初等キー属性でもない。この表は 3NF だが EKNF ではない。
教室は科目の表へ移す。学級と科目の対応は割当の表に残す。
科目の表では、科目 が分かれば教室が1つに決まる。数学の北棟は、学級のたびに書かなくてよい。
| 科目 | 教室 |
|---|---|
| 数学 | 北棟 |
| 英語 | 南棟 |
割当の表では、学級 と 科目 の組で行が1つに決まる。
| 学級 | 科目 |
|---|---|
| 甲組 | 数学 |
| 乙組 | 数学 |
| 甲組 | 英語 |
2つの表を 科目 でつなぐと、分ける前の行に戻る。甲組の数学は、教室が北棟になる。
初等キー正規形でもキーではない列が残る
表を分けると、値の直し方と追加の仕方が単純になる。
- 教室を直すときは、科目の表の1行を直せばよい。数学の学級が2つあっても、2行とも直す必要はない。
- まだ一度も学級が割り当てられていない科目も、科目の表へ追加できる。
- ある科目の割当をすべて消しても、教室は科目の表に残る。
ここまでの表では、初等関数従属の決める側は候補キーである。それでも、キーではない列が初等キー属性を決める重複は残ることがある。次の回線表は EKNF である。
| 拠点 | 区域 | 回線 |
|---|---|---|
| 北区 | 東番 | L1 |
| 北区 | 東番 | L2 |
| 中区 | 東番 | L3 |
| 南区 | 西番 | L1 |
1つの拠点の区域は1つである。区域と回線が揃えば拠点が1つに決まる。区域だけでは拠点は決まらない。東番は北区でも中区でもある。回線だけでは拠点は決まらない。L1 は北区でも南区でもある。行を区別する候補キーは (区域, 回線) と (拠点, 回線) の2つある。
(区域, 回線) から拠点への関係は、区域だけでも回線だけでも決まらないので初等関数従属である。(区域, 回線) は初等キーになり、区域と回線は初等キー属性になる。拠点が区域を決める関係も初等関数従属である。拠点は候補キーではないが、決まる側の区域は初等キー属性なので、この表は EKNF である。
北区の回線は2本あり、東番が2行に書いてある。拠点が分かれば区域が決まるが、拠点だけでは行を区別できない。北区の区域を直すときは、北区の行をすべて直す必要がある。
拠点が区域を決めるこの関係は、決める側が候補キー全体ではない。決まる側の区域は初等キー属性なので、EKNF の条件は満たす。ボイス・コッド正規形で分ける対象になる。EKNF が整えるのは、初等関数従属について、決める側が候補キーであるか、決まる側が初等キー属性であるところまでである。