茨の道も一歩から

インフラ構築からプログラミング(Python・JavaScript)までITに関するブログです。

データベース:正規化

■ 正規化

正規化とは

冗長性を排除することでデータの更新時異状を防ぐことを目的として、

1つの事実を1箇所(1 fact in 1 place)で記録することを原則とする。


非正規形

  • 属性値に繰り返しを持つような属性が存在する。

[注文]

注文番号 顧客コード 氏名 商品番号 商品名 単価 数量 合計金額
00001 U001 大阪 太郎 C0001
C0002
C0003
消しゴム
ボールペン
コンパス
100
200
300
1
1
1
600
00002 U002 東京 次郎 C0002 ボールペン 200 2 400
00003 U003 福岡 花子 C0002
C0003
ボールペン
コンパス
200
300
3
2
1200

第1正規形

  • 属性値に繰り返しを持つような属性が存在しない。
  • 導出項目(単価 × 数量 = 合計金額)を排除する。

[注文]

注文番号 顧客コード 氏名 商品番号 商品名 単価 数量
00001 U001 大阪 太郎 C0001 消しゴム 100 1
00001 U001 大阪 太郎 C0002 ボールペン 200 1
00001 U001 大阪 太郎 C0003 コンパス 300 1
00002 U002 東京 次郎 C0002 ボールペン 200 2
00003 U003 福岡 花子 C0002 ボールペン 200 3
00003 U003 福岡 花子 C0003 コンパス 300 2

第2正規形

  • 候補キーに部分関数従属する属性を排除する。

[注文]

注文番号 顧客コード 商品番号 数量
00001 U001 C0001 1
00001 U001 C0002 1
00001 U001 C0003 1
00002 U002 C0002 2
00003 U003 C0002 3
00003 U003 C0003 2

[商品]

商品番号 商品名 単価
C0001 消しゴム 100
C0002 ボールペン 200
C0003 コンパス 300

[顧客]

顧客コード 氏名
U001 大阪 太郎
U002 東京 次郎
U003 福岡 花子

第3正規形

  • 候補キーに推移的関数従属する属性を排除する。
  • 被決定項として非キー属性のみを対象とする。
  • データ整合性を保障する。

[注文]

注文番号 顧客コード
00001 U001
00002 U002
00003 U003

[注文明細]

注文番号 商品番号 数量
00001 C0001 1
00001 C0002 1
00001 C0003 1
00002 C0002 2
00003 C0002 3
00003 C0003 2

[商品]

商品番号 商品名 単価
C0001 消しゴム 100
C0002 ボールペン 200
C0003 コンパス 300

[顧客]

顧客コード 氏名
U001 大阪 太郎
U002 東京 次郎
U003 福岡 花子

ボイスコッド正規形

  • 被決定項としてキー属性を対象とする。
  • 関数従属性の保存が出来ない場合や、参照整合性が失われる場合がある。

【試験対策】

  • 各正規形の条件を理解する。
  • 色々な表を正規化してみる。

目次へ戻る