関係データベースの第一正規形を扱う
第一正規形はセルを単一の値にする
関係データベースの正規化で、非正規形の次に置く段階が第一正規形 (First Normal Form, 1NF) である。1NF の関係は、各属性がドメイン上の単一の値だけを持ち、繰返しグループを含まない。行は候補キーで一意に識別できる。
Codd の定式化では、属性の値は原子的であり、関係やリストそのものを値にしない。どこまでを原子的とみなすかはドメインの切り方による。住所を都道府県と市区町村に分けるかどうかは、その分解で問い合わせるかで決まる。1NF が除くのは、同じ種類の事実が1行の中に複数並ぶことである。
繰返しを行の方向へ展開する
非正規形の注文表では、商品コード・商品名・数量 が1セルに複数入っていた。明細を1行1件に展開すると、各セルは単一の値になる。
| 注文ID | 顧客名 | 商品コード | 商品名 | 数量 |
|---|---|---|---|---|
| 1 | 山田 | A01 | りんご | 2 |
| 1 | 山田 | A02 | みかん | 1 |
| 2 | 佐藤 | A01 | りんご | 3 |
注文ID だけでは行を区別できない。候補キーは注文と明細を組にした (注文ID, 商品コード) になる。1つの注文に同じ商品コードが複数ありうるなら、明細番号を足して (注文ID, 明細番号) を候補キーにする。
第一正規形でも従属の重複は残る
1NF にすると、「商品コードが A02 の明細」をセル内の分割なしに検索できる。明細の追加と削除は行の追加と削除に一致する。
それでも次の重複は残る。
- 顧客名は
注文IDだけで決まる。明細の数だけ同じ名前が繰り返される。 - 商品名は
商品コードだけで決まる。同じ商品が別注文に現れるたびに繰り返される。
顧客名を改めるときは、その注文の明細行をすべて更新する。候補キーの一部にだけ依存するこの関係は部分関数従属と呼ばれ、第二正規形で切り離す対象になる。1NF は値を原子的にし、1行が1つの明細事実を表すところまでを整える。