3-4 第1正規化
第1正規化の定義 〜スカラ値の原則
1つのセルには1つの値しか含まない
この時の値のことをスカラ値と言う
スカラとは「単一」のという意味
第1正規化を作ろう
スカラ値の原則は、当たり前と思うかもしれない
しかし、日常的に使う二次元表においては、守られていないこともある
扶養者テーブル
https://scrapbox.io/files/68678e0858660c08c7c06ede.png
以下、どちらかのパターンに置き換えて、第1正規化をする必要がある
列を増やす
table: 扶養者テーブル(パターン1)
社員ID 社員名 子1 子2 子3
000A 加藤 達夫 信二
000B 藤本
001F 三島 敦 陽子 清美
行を増やす
table: 扶養者テーブル(パターン2)
社員ID 社員名 子
000A 加藤 達夫
000A 加藤 信二
000B 藤本
001F 三島 敦
001F 三島 陽子
001F 三島 清美
パターン2を採用することが望ましい
その理由は、第7章で紹介
第1正規化(パターン2)の問題と解決方法
1️⃣ 主キーは、NULLが許されていない
パターン2のテーブルで1レコードを特定するには3列を指定して主キーにしないといけない
つまり複合キー
しかし列によってはNULLが入るので、矛盾が発生する
2️⃣ 1つのテーブルは1つのエンティティではなくてはならない
パターン2のテーブルは、社員と扶養者の2つのエンティティが存在している
これだと、テーブルの意味やレコードの単位をすぐに理解できない
これらを解決するにはテーブルを分割する必要がある
table: 社員テーブル
社員ID 社員名
000A 加藤
000B 藤本
001F 三島
table:扶養者テーブル
社員ID 子
000A 達夫
000A 信二
001F 敦
001F 陽子
001F 清美
なぜ一つのセルに複数の値を入れてはダメなのか? 〜関数従属性
セルに複数の値を許せば、主キーが各列の値を一意に決定できないため。これは主キーの定義に反している
また、正規化全体を理解するための鍵となる概念がある
それは関数従属性
{X} → {Y}
X列の値を決めれば、Y列の値が1つに決まらなければならない
またXおよびY列は、1列でなく複数列の組み合わせであっても構わない
例
第1正規化前のテーブル
https://scrapbox.io/files/68678e0858660c08c7c06ede.png
{社員ID} → {社員名} の関数従属は成立している
{社員ID} → {子}の関数従属は成立していない
正規化はテーブルのすべての列が、関数従属性を満たすように整理すること