関係データベースのボイス・コッド正規形を扱う
ボイス・コッド正規形はキーではない決め方を分ける
関係データベースの正規化で、初等キー正規形の次に置く段階がボイス・コッド正規形 (Boyce–Codd Normal Form, BCNF) である。
EKNF では、初等関数従属について、決める側が候補キーであるか、決まる側が初等キー属性である。それでも、キーではない列が候補キーの一部を決める重複は残る。BCNF は、その重複を別の表へ移す。
ある列の組が別の列を決めるとき、その組を決定項と呼ぶ。BCNF は、どの非自明な関数従属でも、決める側が候補キーである状態である。言い換えると、決定項はすべて候補キーである。
回線表の区域を拠点の表へ移す
初等キー正規形の回線表では、1つの拠点の区域は1つである。区域と回線が揃えば拠点が1つに決まる。行を区別する候補キーは (区域, 回線) と (拠点, 回線) の2つある。
| 拠点 | 区域 | 回線 |
|---|---|---|
| 北区 | 東番 | L1 |
| 北区 | 東番 | L2 |
| 中区 | 東番 | L3 |
| 南区 | 西番 | L1 |
(区域, 回線) が分かれば拠点は決まる。(拠点, 回線) が分かれば区域は決まる。拠点が分かれば区域は決まるが、拠点だけでは行を区別できない。拠点は候補キーではない。この表は EKNF だが BCNF ではない。
区域は拠点の表へ移す。拠点と回線の対応は回線の表に残す。
拠点の表では、拠点 が分かれば区域が1つに決まる。北区の東番は、回線のたびに書かなくてよい。
| 拠点 | 区域 |
|---|---|
| 北区 | 東番 |
| 中区 | 東番 |
| 南区 | 西番 |
回線の表では、拠点 と 回線 の組で行が1つに決まる。
| 拠点 | 回線 |
|---|---|
| 北区 | L1 |
| 北区 | L2 |
| 中区 | L3 |
| 南区 | L1 |
2つの表を 拠点 でつなぐと、分ける前の行に戻る。北区の L1 は、区域が東番になる。
ボイス・コッド正規形でも独立した繰返しは残る
表を分けると、値の直し方と追加の仕方が単純になる。
- 区域を直すときは、拠点の表の1行を直せばよい。北区の回線が2本あっても、2行とも直す必要はない。
- まだ一度も回線を持たない拠点も、拠点の表へ追加できる。
- ある拠点の回線をすべて消しても、区域は拠点の表に残る。
ここまでの表では、決める側は候補キーである。それでも、1つのキーに対して独立に繰返す組が残ることがある。次の履修表は BCNF である。
| 学生 | 科目 | 部活 |
|---|---|---|
| 太郎 | 数学 | 野球 |
| 太郎 | 数学 | 音楽 |
| 太郎 | 英語 | 野球 |
| 太郎 | 英語 | 音楽 |
1人の学生が複数の科目を履修し、複数の部活に所属する。科目と部活に直接の決まりはない。行を区別する候補キーは (学生, 科目, 部活) だけである。関数従属の決める側は候補キーなので、この表は BCNF である。
太郎の科目は2つ、部活も2つあるので、組み合わせが4行になる。数学を消すときは、野球の行と音楽の行の両方を消す必要がある。科目の繰返しと部活の繰返しは独立である。
科目と部活が独立に繰返すこの関係は、関数従属では表せない。第四正規形で分ける対象になる。BCNF が整えるのは、関数従属について、決める側が候補キーであるところまでである。