データベース
第 10 回 正規化
鈴木幸市
理解度調査講評 (1-1)
a b c
1 2 3
4 5 6
7 8 9
10 11 12
13 14 15
16 17 18
19 20 21
SELECT a FROM S WHERE b > 10;
FROM S
理解度調査講評 (1-2)
a b c
1 2 3
4 5 6
7 8 9
10 11 12
13 14 15
16 17 18
19 20 21
SELECT a FROM S WHERE b > 10;
FROM S WHERE b > 10
理解度調査講評 (1-3)
a b c
1 2 3
4 5 6
7 8 9
10 11 12
13 14 15
16 17 18
19 20 21
SELECT a FROM S WHERE b > 10;
SELECT a FROM S WHERE b > 10 a
10 13 16 19
理解度調査講評 (2-1)
a b c
1 2 3
4 5 6
7 8 9
10 11 12
13 14 15
16 17 18
19 20 21
SELECT a,d FROM S,T WHERE b=e AND a>10; S
d e f
21 20 19
18 17 16
15 14 13
12 11 10
9 8 7
6 5 4
3 2 1
T
理解度調査講評 (2-2)
a b c d e f
SELECT a,d FROM S,T WHERE b=e AND a>10; FROM S,T ( その
1 )
理解度調査講評 (2-3)
a b c d e f
1 2 3 21 20 19
1 2 3 18 17 16
1 2 3 15 14 13
1 2 3 12 11 10
1 2 3 9 8 7
1 2 3 6 5 4
1 2 3 3 2 1
4 5 6 21 20 19
4 5 6 18 17 16
SELECT a,d FROM S,T WHERE b=e AND a>10; FROM S,T ( その
2)
理解度調査講評 (2-4)
a b c d e f
1 2 3 3 2 1
4 5 6 6 5 4
7 8 9 9 8 7
10 11 12 12 11 10
13 14 15 15 14 13
16 17 18 18 17 16
19 20 21 21 20 19
SELECT a,d FROM S,T WHERE b=e AND a>10; FROM S,T WHERE b=e
理解度調査講評 (2-5)
a b c d e f
1 2 3 3 2 1
4 5 6 6 5 4
7 8 9 9 8 7
10 11 12 12 11 10
13 14 15 15 14 13
16 17 18 18 17 16
19 20 21 21 20 19
SELECT a,d FROM S,T WHERE b=e AND a>10; FROM S,T WHERE b=e AND a>10
理解度調査講評 (2-6)
a b c d e f
1 2 3 3 2 1
4 5 6 6 5 4
7 8 9 9 8 7
10 11 12 12 11 10 13 14 15 15 14 13 16 17 18 18 17 16 19 20 21 21 20 19
SELECT a,d FROM S,T WHERE b=e AND a>10; SELECT a, d FROM S,T WHERE b=e AND a>10
a d
13 15 16 18 19 21
理解度調査講評 (3-1)
a b c
1 2 3
4 5 6
7 8 9
10 11 12
13 14 15
16 17 18
19 20 21
SELECT a,d FROM S,T WHERE b=e AND a>10; S
d e f
21 20 19
18 17 16
15 14 13
12 11 10
9 8 7
6 5 4
3 2 1
T
理解度調査講評 (3-2)
SELECT count(*) FROM T WHERE d > 5;
d e f
21 20 19
18 17 16
15 14 13
12 11 10
9 8 7
6 5 4
3 2 1
FROM T
理解度調査講評 (3-3)
SELECT count(*) FROM T WHERE d > 5;
d e f
21 20 19
18 17 16
15 14 13
12 11 10
9 8 7
6 5 4
3 2 1
FROM T WHERE d>5
理解度調査講評 (3-4)
SELECT count(*) FROM T WHERE d > 5;
d e f
21 20 19
18 17 16
15 14 13
12 11 10
9 8 7
6 5 4
3 2 1
SELECT count(*) FROM T WHERE d>5
6行
count(*) 6
今日の内容
正規化の概要と背景
正規化の段階
第一正規形~第三正規形
演習
正規化 (normalization) とは
実際のデータをテーブルに展開するための方法
効率よく
矛盾なく
データをデータベースに格納するための方法
正規化とは
データの重複がないようにデータベースの構造を作ること
一つの情報は一箇所に格納する。
2 箇所以上に重複格納すると
こらのデータがたまたま違っていると大変
変更の順序もきちんと決めないといろいろ不具合が
デッドロック
どのデータを見るかで結果が違ったり
正規化されていないデータベースも設計できる
故意にそうすることもある
性能の問題
テーブルが増えすぎて、結合演算が多くなるなど(正規化を進めるとテーブ ルの数が増える傾向になる)
正規化されていないところをきちんと意識してアプリケーションの設 計までおこなうことが重要
第一正規形 (the first normal form,
1NF)
データ型で規定される値だけが入っている 繰り返し項目がない
参考書の例では ...
第 1 正規形 (2)
参考書の例
入っているデータは基本データ型のみ → これは OK
伝票明細が繰り返されている → これが第一正規形に違反している!!
伝票明細の枚数が固定なら、「繰り返しではない」と言い張るのもできるが
上記では明細が何枚あるかわからない
第 1 正規形 (3)
どうやって第一正規形にするか?
繰り返し項目を別な表にする
上で作った新しい表にキーをつけて、これを
元の表の外部キーにする。参照制約をつけて
おくとよい。
第一正規形
繰り返し項 目を別なリ レーション にする 伝票番号を
外部キーに する
第二正規形
別な例で考える:仕入先情報を考える 住所・代表電話は
仕入先で決まる
内線番号は部署もわか らないと決まらない 主キー
第二正規形になっていないデータベース
の様子
同じデータのコピーが大 量にできてしまう
修正するときは全部一緒 に修正しないとデータに
矛盾が生じる 主キー
第二正規形
正規化前
正規化後
候補キー以外のカラムは 候補キーに従属している
住所は「部 署」で共通
代表番号は
「部署」で共 通
第二正規形にした場合のデータベースの
様子
主キーと外 部キーの関
係
データなし重複した 主キー
主キー
もう一つの第二正規形の例
担当者情報を抜き出してみる
確かに担当者番号は他のカラ ムの候補キーになっている
担当部署番号は担当部 署の候補キーになって この表を作ると同じ「担
当部署名」が何度も現れ
遷移従属性
データベースの様子
同じデータのコピーが大 量にできてしまう
修正するときは全部一緒 に修正しないとデータに
矛盾が生じる
担当者を第三正規形にすると
第 3 正規形にした後のデータベースの様
子
主キーと外 部キーの関
係
データなし重複した
正規化のゴール
まずは第三正規形を目指す
工程は
まず第一正規形に→繰り返し項目を別な表にする
次に第二正規形→第一正規形の候補キーを見つける
さらに第三正規形→第二正規形の中に別な従属性があったらこれも別な表にする
第二正規形 担当者情報
第三正規形 担当部署情報
正規化を行う際のポイント
一つのレコードには繰り返し項目は入れてはいけない
基本型のデータ項目だけで表を作ってみる
候補キーを捜してレコードを整理する
キー以外のデータが複数回現れないようにする
レコードの中に別な従属性はないかを調べてみる
キー以外のデータが複数回現れないようにする
第一正規形
第二正規形
第三正規形
正規化の背景 ( 復習 )
実際のデータをテーブルに展開するための方法
効率よく
矛盾なく
データをデータベースに格納するための方法
正規化とは
データの重複がないようにデータベースの構造を作ること
一つの情報は一箇所に格納する。
2 箇所以上に重複格納すると
こらのデータがたまたま違っていると大変
変更の順序もきちんと決めないといろいろ不具合が
デッドロック
どのデータを見るかで結果が違ったり
正規化されていないデータベースも設計できる
故意にそうすることもある
性能の問題
テーブルが増えすぎて、結合演算が多くなるなど(正規化を進めるとテーブ ルの数が増える傾向になる)