データベース
第10回
正規化
1
2015年6⽉11⽇(⽊) 7・8時限
担当:奥 健太
これから学習する内容
2
 データベース設計について学ぶ
CREATE DATABASE
CREATE TABLE
データベース設計
エンドユーザ
結果
データベース
問合せ(クエリ)
データベース
アプリケーション
要求
応答
復習
データベース設計⼿順
3
現実の世界
概念データモデル
1. 概念設計
2. 論理設計
論理データモデル
3. 物理設計
物理データモデル
(1) 概念データモデルから
論理データモデルへの変換
(2) 正規化
データベース設計編での学習⽬標
4
 基礎となるデータモデルを理解する
 データベース設計の⽅法を理解する
データの冗⻑性と不整合問題の解消⽅法
を理解する
 データベースプログラミングの⽅法を理解する
データベース設計編
回 ⽇付 テーマ
8 5/28 関係データモデルと関係代数
9 6/4 データベース設計
10 6/11 正規化
11 6/18 データベースとプログラム
5
本⽇の講義で学ぶこと
6
1事実1箇所
1 fact in 1 place
7
正規化の⽬的
発注に関する表を正規化せよ!
8
ミッション
ミッションの対象表
9
伝票
番号
発注⽇ 発注先
コード
発注先名 商品
コード
商品名 単価 数量 ⾦額
1234 2014/6/1 1985 びわこ店 101 バナナ 200 10 2,000
102 りんご 400 3 1,200
1235 2014/6/2 2001 草津店 103 みかん 300 5 1,500
1236 2014/6/3 2003 ⾐笠店 104 ぶどう 100 8 800
1237 2014/6/4 1996 朱雀店 101 バナナ 200 5 1,000
1238 2014/6/5 1984 茨⽊店 103 みかん 300 4 1,200
104 ぶどう 100 10 1,000
発注伝票表
第⼀次正規化
⾮正規形から第⼀正規形へ
10
伝票
番号
発注⽇ 発注先
コード
発注先名 商品
コード
商品名 単価 数量 ⾦額
1234 2014/6/1 1985 びわこ店 101 バナナ 200 10 2,000
102 りんご 400 3 1,200
1235 2014/6/2 2001 草津店 103 みかん 300 5 1,500
1236 2014/6/3 2003 ⾐笠店 104 ぶどう 100 8 800
1237 2014/6/4 1996 朱雀店 101 バナナ 200 5 1,000
1238 2014/6/5 1984 茨⽊店 103 みかん 300 4 1,200
104 ぶどう 100 10 1,000
発注伝票表
ミッションの対象表
11
この表は関係とはいえない
関係といえる表はどれ?
12
1時限 2時限
⽉
英語 C501 OS F201
化学 C202 知識⼯学 C109
⽕
SW⼯学 R103 数理解析 C103
DB C202 HI C306
交戦勢⼒
東軍 ⻄軍
指導者・指揮官
徳川家康
徳川秀忠
結城秀康
⽑利輝元
⽯⽥三成
宇喜多秀家
上杉景勝
戦⼒
70,000~104,000 80,000以上
*(参考)http://ja.wikipedia.org/wiki/関ヶ原の戦い
著者 書籍タイトル 出版社 発⾏年
川越恭⼆ 楽しく学べるデータベース 共⽴出版 2014
北川博之 データベースシステム 昭晃堂 1996
増永良⽂ リレーショナルデータベース⼊⾨ サイエンス社 1991
復習
伝票
番号
発注⽇ 発注先
コード
発注先名 商品
コード
商品名 単価 数量 ⾦額
1234 2014/6/1 1985 びわこ店 101 バナナ 200 10 2,000
102 りんご 400 3 1,200
1235 2014/6/2 2001 草津店 103 みかん 300 5 1,500
1236 2014/6/3 2003 ⾐笠店 104 ぶどう 100 8 800
1237 2014/6/4 1996 朱雀店 101 バナナ 200 5 1,000
1238 2014/6/5 1984 茨⽊店 103 みかん 300 4 1,200
104 ぶどう 100 10 1,000
発注伝票表
ミッションの対象表
13
繰返しグループ
複数の事実が1箇所に
1事実1箇所
繰返しグループを分離せよ
14
発注伝票⾒出しと発注伝票明細
15
伝票
番号
発注⽇ 発注先
コード
発注先名
1234 2014/6/1 1985 びわこ店
1235 2014/6/2 2001 草津店
1236 2014/6/3 2003 ⾐笠店
1237 2014/6/4 1996 朱雀店
1238 2014/6/5 1984 茨⽊店
伝票
番号
商品
コード
商品名 単価 数量 ⾦額
1234 101 バナナ 200 10 2,000
1234 102 りんご 400 3 1,200
1235 103 みかん 300 5 1,500
1236 104 ぶどう 100 8 800
1237 101 バナナ 200 5 1,000
1238 103 みかん 300 4 1,200
1238 104 ぶどう 100 10 1,000
発注伝票⾒出し(I-①) 発注伝票明細(I-②)
発注伝票明細
伝票
番号
商品
コード
商品名 単価 数量 ⾦額
1234 101 バナナ 200 10 2,000
1234 102 りんご 400 3 1,200
1235 103 みかん 300 5 1,500
1236 104 ぶどう 100 8 800
1237 101 バナナ 200 5 1,000
1238 103 みかん 300 4 1,200
1238 104 ぶどう 100 10 1,000
発注伝票明細(I-②)
※導出属性:他の属性から計算などにより求められる属性
単価×数量から導出できる
導出属性を排除せよ
17
発注伝票⾒出しと発注伝票明細
18
伝票
番号
発注⽇ 発注先
コード
発注先名
1234 2014/6/1 1985 びわこ店
1235 2014/6/2 2001 草津店
1236 2014/6/3 2003 ⾐笠店
1237 2014/6/4 1996 朱雀店
1238 2014/6/5 1984 茨⽊店
伝票
番号
商品
コード
商品名 単価 数量
1234 101 バナナ 200 10
1234 102 りんご 400 3
1235 103 みかん 300 5
1236 104 ぶどう 100 8
1237 101 バナナ 200 5
1238 103 みかん 300 4
1238 104 ぶどう 100 10
発注伝票⾒出し(I-①) 発注伝票明細(I-②)
第⼀正規形
第⼀正規形と第⼀次正規化
19
⾮正規形
第⼀正規形
正規化されていない表
 繰返しグループがない
 導出属性がない
第⼀次正規化
 繰返しグループを排除
 導出属性を排除
第⼆次正規化
第⼀正規形から第⼆正規形へ
20
第⼀正規形
21
伝票
番号
発注⽇ 発注先
コード
発注先名
1234 2014/6/1 1985 びわこ店
1235 2014/6/2 2001 草津店
1236 2014/6/3 2003 ⾐笠店
1237 2014/6/4 1996 朱雀店
1238 2014/6/5 1984 茨⽊店
伝票
番号
商品
コード
商品名 単価 数量
1234 101 バナナ 200 10
1234 102 りんご 400 3
1235 103 みかん 300 5
1236 104 ぶどう 100 8
1237 101 バナナ 200 5
1238 103 みかん 300 4
1238 104 ぶどう 100 10
発注伝票⾒出し(I-①) 発注伝票明細(I-②)
「いちご」を追加したい
問題1
22
まだ1個も発注されてい
ないため,追加できない
伝票
番号
商品
コード
商品名 単価 数量
1234 101 バナナ 200 10
1234 102 りんご 400 3
1235 103 みかん 300 5
1236 104 ぶどう 100 8
1237 101 バナナ 200 5
1238 103 みかん 300 4
1238 104 ぶどう 100 10
発注伝票明細(I-②)
挿⼊不整合
? 105 いちご 500 ?
伝票
番号
商品
コード
商品名 単価 数量
1234 101 バナナ 200 10
1234 102 りんご 400 3
1235 103 みかん 300 5
1236 104 ぶどう 100 8
1237 101 バナナ 200 5
1238 103 みかん 300 4
1238 104 ぶどう 100 10
発注伝票明細(I-②)
「みかん」の単価を変更したい
問題2
23
350
350
該当箇所を漏れなく変更
する必要があり,冗⻑
修正不整合
伝票
番号
商品
コード
商品名 単価 数量
1234 101 バナナ 200 10
1234 102 りんご 400 3
1235 103 みかん 300 5
1236 104 ぶどう 100 8
1237 101 バナナ 200 5
1238 103 みかん 300 4
1238 104 ぶどう 100 10
発注伝票明細(I-②)
伝票番号「1234」のデータを削除したい
問題3
24
「りんご」に関する情報
が失われてしまう
削除不整合
更新不整合問題
25
削除不整合
修正不整合
挿⼊不整合
伝票
番号
商品
コード
商品名 単価 数量
1234 101 バナナ 200 10
1234 102 りんご 400 3
1235 103 みかん 300 5
1236 104 ぶどう 100 8
1237 101 バナナ 200 5
1238 103 みかん 300 4
1238 104 ぶどう 100 10
発注伝票明細(I-②)
商品に関するデータと発
注に関するデータが混在
350
350
? 105 いちご 500 ?
1事実1箇所
商品に関する関係と
発注に関する関係に分割せよ
26
商品と発注伝票明細
商品
コード
商品名 単価
101 バナナ 200
102 りんご 400
103 みかん 300
104 ぶどう 100
商品(II-①)
伝票
番号
商品
コード
数量
1234 101 10
1234 102 3
1235 103 5
1236 104 8
1237 101 5
1238 103 4
1238 104 10
発注伝票明細(II-②)
主キーによって
他の列の値が決まる 第⼆正規形
完全関数従属性
i. 決定項の属性数が⼀つの場合
– X → Y の場合,Y は X に完全関数従属しているという
ii. 決定項の属性数が⼆つ以上の場合
– {X1, X2} → Y はあるが,X1 → Y, X2 → Y はない場合を,
Y は {X1, X2} に完全関数従属しているという
28
学⽣番号 学⽣名
学⽣番号 サークル番号 ⼊会⽇
部分関数従属性
i. 決定項の属性数が⼀つの場合
– 部分関数従属性はありえない
ii. 決定項の属性数が⼆つ以上の場合
– {X1, X2} → Y1があり,X1 → Y2, X2 → Y2 のどちらか⼀
つでも成り⽴つ場合を,Y2 は {X1, X2} に部分関数従属
しているという
29
学⽣番号 学⽣名 サークル番号 ⼊会⽇
部分関数従属
完全関数従属
第⼀正規形の関数従属性
30部分関数従属
完全関数従属
伝票
番号
商品
コード
商品名 単価 数量
1234 101 バナナ 200 10
1234 102 りんご 400 3
1235 103 みかん 300 5
1236 104 ぶどう 100 8
1237 101 バナナ 200 5
1238 103 みかん 300 4
1238 104 ぶどう 100 10
発注伝票明細(I-②)
第⼆正規形の関数従属性
商品
コード
商品名 単価
101 バナナ 200
102 りんご 400
103 みかん 300
104 ぶどう 100
商品(II-①)
伝票
番号
商品
コード
数量
1234 101 10
1234 102 3
1235 103 5
1236 104 8
1237 101 5
1238 103 4
1238 104 10
発注伝票明細(II-②)
第⼆正規形完全関数従属
完全関数従属
第⼀正規形から部
分関数従属性を取
り除いた関係
商品
コード
商品名 単価
101 バナナ 200
102 りんご 400
103 みかん 300
104 ぶどう 100
商品(II-①)
伝票
番号
商品
コード
数量
1234 101 10
1234 102 3
1235 103 5
1236 104 8
1237 101 5
1238 103 4
1238 104 10
更新不整合問題の解消
105 いちご 500
削除不整合修正不整合挿⼊不整合
発注伝票明細(II-②)
商品
コード
商品名 単価
101 バナナ 200
102 りんご 400
103 みかん 300
104 ぶどう 100
商品(II-①)
伝票
番号
商品
コード
数量
1234 101 10
1234 102 3
1235 103 5
1236 104 8
1237 101 5
1238 103 4
1238 104 10
更新不整合問題の解消
350
削除不整合修正不整合挿⼊不整合
105 いちご 500
発注伝票明細(II-②)
商品
コード
商品名 単価
101 バナナ 200
102 りんご 400
103 みかん 300
104 ぶどう 100
商品(II-①)
伝票
番号
商品
コード
数量
1234 101 10
1234 102 3
1235 103 5
1236 104 8
1237 101 5
1238 103 4
1238 104 10
発注伝票明細(II-②)
更新不整合問題の解消
削除不整合修正不整合挿⼊不整合
105 いちご 500
350
第⼆正規形と第⼆次正規化
35
第⼀正規形
第⼆正規形
 第⼀正規形から部分関数従属性を
取り除いた関係
第⼆次正規化
 部分関数従属性を排除
削除不整合修正不整合挿⼊不整合
発注伝票⾒出し(I-①)は…
36
完全関数従属
実は既に…
伝票
番号
発注⽇ 発注先
コード
発注先名
1234 2014/6/1 1985 びわこ店
1235 2014/6/2 2001 草津店
1236 2014/6/3 2003 ⾐笠店
1237 2014/6/4 1996 朱雀店
1238 2014/6/5 1984 茨⽊店
発注伝票⾒出し(I-①=II-③)
第⼆正規形
第三次正規化
第⼆正規形から第三正規形へ
37
発注伝票⾒出し(II-③)
「梅⽥店」を追加したい
問題
38
伝票
番号
発注⽇ 発注先
コード
発注先名
1234 2014/6/1 1985 びわこ店
1235 2014/6/2 2001 草津店
1236 2014/6/3 2003 ⾐笠店
1237 2014/6/4 1996 朱雀店
1238 2014/6/5 1984 茨⽊店
? ? 2007 梅⽥店
まだ1個も発注していない
「梅⽥店」は追加できない
挿⼊不整合
さらなる更新不整合問題
39
挿⼊不整合
発注に関するデータと発注
先に関するデータが混在
発注伝票⾒出し(II-③)
伝票
番号
発注⽇ 発注先
コード
発注先名
1234 2014/6/1 1985 びわこ店
1235 2014/6/2 2001 草津店
1236 2014/6/3 2003 ⾐笠店
1237 2014/6/4 1996 朱雀店
1238 2014/6/5 1984 茨⽊店
削除不整合
修正不整合
1事実1箇所
発注に関する関係と
発注先に関する関係に分割せよ
40
伝票
番号
発注⽇ 発注先
コード
1234 2014/6/1 1985
1235 2014/6/2 2001
1236 2014/6/3 2003
1237 2014/6/4 1996
1238 2014/6/5 1984
発注伝票⾒出しと発注先
発注伝票⾒出し(III-①) 発注先(II-②)
発注先
コード
発注先名
1985 びわこ店
2001 草津店
2003 ⾐笠店
1996 朱雀店
1984 茨⽊店
第三正規形
発注伝票⾒出し(II-③)は…
42
発注伝票⾒出し(II-③)
伝票
番号
発注⽇ 発注先
コード
発注先名
1234 2014/6/1 1985 びわこ店
1235 2014/6/2 2001 草津店
1236 2014/6/3 2003 ⾐笠店
1237 2014/6/4 1996 朱雀店
1238 2014/6/5 1984 茨⽊店
「伝票番号」がきまれば,
「発注先コード」が決まって,
それによって,間接的に「発
注先名」が決まっていた
実は…
推移関数従属性
– X → Y かつ Y → Z であり,かつ Y → X がない
場合,Z は X に推移関数従属しているという
43
学⽣番号 研究室番号 研究室名
推移関数従属
第⼆正規形の推移関数従属性
44
発注伝票⾒出し(II-③)
伝票
番号
発注⽇ 発注先
コード
発注先名
1234 2014/6/1 1985 びわこ店
1235 2014/6/2 2001 草津店
1236 2014/6/3 2003 ⾐笠店
1237 2014/6/4 1996 朱雀店
1238 2014/6/5 1984 茨⽊店
推移関数従属
伝票
番号
発注⽇ 発注先
コード
1234 2014/6/1 1985
1235 2014/6/2 2001
1236 2014/6/3 2003
1237 2014/6/4 1996
1238 2014/6/5 1984
第三正規形の関数従属性
発注伝票⾒出し(III-①) 発注先(II-②)
第三正規形
発注先
コード
発注先名
1985 びわこ店
2001 草津店
2003 ⾐笠店
1996 朱雀店
1984 茨⽊店
完全関数従属
完全関数従属
推移関数従属はない
第⼆正規形から推
移関数従属性を取
り除いた関係
伝票
番号
発注⽇ 発注先
コード
1234 2014/6/1 1985
1235 2014/6/2 2001
1236 2014/6/3 2003
1237 2014/6/4 1996
1238 2014/6/5 1984
第三正規形の関数従属性
発注伝票⾒出し(III-①) 発注先(II-②)
発注先
コード
発注先名
1985 びわこ店
2001 草津店
2003 ⾐笠店
1996 朱雀店
1984 茨⽊店
46
2007 梅⽥店
挿⼊不整合 削除不整合修正不整合
第三正規形と第三次正規化
47
第⼆正規形
第三正規形
 第⼆正規形から推移関数従属性を
取り除いた関係
第三次正規化
 推移関数従属性を排除
削除不整合修正不整合挿⼊不整合
48
伝票
番号
発注⽇ 発注先
コード
1234 2014/6/1 1985
1235 2014/6/2 2001
1236 2014/6/3 2003
1237 2014/6/4 1996
1238 2014/6/5 1984
発注伝票⾒出し
発注先
コード
発注先名
1985 びわこ店
2001 草津店
2003 ⾐笠店
1996 朱雀店
1984 茨⽊店
発注先
商品
コード
商品名 単価
101 バナナ 200
102 りんご 400
103 みかん 300
104 ぶどう 100
商品
伝票
番号
商品
コード
数量
1234 101 10
1234 102 3
1235 103 5
1236 104 8
1237 101 5
1238 103 4
1238 104 10
発注伝票明細
※外部キーで関係
同⼠を関連付ける
第三正規形まで分けた関係
参照整合性制約とは
49
player
_no
name home
birth
_date
G18 杉内俊哉 福岡 1980-10-30
G19 菅野智之 神奈川 1989-10-11
T14 能⾒篤史 兵庫 1979-5-28
T19 藤浪晋太郎 ⼤阪 1994-4-12
C15 ⿊⽥博樹 ⼤阪 1975-2-10
C18 前⽥健太 ⼤阪 1988-4-11
player
team
_id
name rank
G 巨⼈ 1
T 阪神 2
C 広島 3
team
player
_no
team
_id
year
G18 G 2012
G19 G 2013
T14 T 2005
T19 T 2013
C15 C 2015
C18 C 2007
affiliation
player_no CHAR(3)
REFERENCES player(player_no)
FOREIGN KEY(team_id)
REFERENCES team(team_id))
参照
参照
外部キー外部キー
 参照先のカラムにない値を設定
しようとするとエラーになる.
復習
正規化された関係を⾃然結合すると…
50
伝票
番号
発注⽇ 発注先
コード
発注先名 商品
コード
商品名 単価 数量
1234 2014/6/1 1985 びわこ店 101 バナナ 200 10
1234 2014/6/1 1985 びわこ店 102 りんご 400 3
1235 2014/6/2 2001 草津店 103 みかん 300 5
1236 2014/6/3 2003 ⾐笠店 104 ぶどう 100 8
1237 2014/6/4 1996 朱雀店 101 バナナ 200 5
1238 2014/6/5 1984 茨⽊店 103 みかん 300 4
1238 2014/6/5 1984 茨⽊店 104 ぶどう 100 10
発注伝票⾒出し 発注先 商品発注伝票明細
元の関係に復元される
⼆つの関係の共通属性Cで結びつける
⾃然結合演算(Natural Join)
51
P 番号 ⼭名 標⾼
54槍ヶ岳 3,180
64⼋ヶ岳 2,899
72富⼠⼭ 3,776
※⽐較対象の属性がθ
⽐較可能であること
Q 番号 都道府県
54⻑野県
54岐⾩県
64⻑野県
64⼭梨県
72⼭梨県
72静岡県
番号 ⼭名 標⾼ 都道府県
54槍ヶ岳 3,180⻑野県
54槍ヶ岳 3,180岐⾩県
64⼋ヶ岳 2,899⻑野県
64⼋ヶ岳 2,899⼭梨県
72富⼠⼭ 3,776⼭梨県
72富⼠⼭ 3,776静岡県
P Q
復習
まとめ
52
まとめ
53
第⼀正規形
第⼀次正規化
 繰返しグループを排除
 導出属性を排除
⾮正規形
第⼆正規形
第三正規形
第⼆次正規化  部分関数従属性を排除
第三次正規化  推移関数従属性を排除
1事実1箇所の原則
さらなる正規化
54
第四正規形ボイスコッド
正規形
第五正規形
本⽇学習したキーワード
〜データベース設計編〜
55
1事実1箇所 繰返しグループ 第三正規形
3層スキーマモデル 更新不整合問題 第⼆次正規化
ER図 削除不整合 第⼆正規形
E-Rモデル 差集合演算 タプル(組)
JDBC θ結合演算 直積演算
インスタンス θ⽐較可能 等結合演算
カーディナリティ 次数 導出属性
概念スキーマ ⾃然結合演算 ドメイン(定義域)
概念設計 実体 内部スキーマ
概念データモデル 射影演算 濃度
外部スキーマ 修正不整合 ⾮正規形
関係(リレーション) 商演算 物理設計
関係スキーマ 推移関数従属性 物理的データ独⽴性
関係代数 選択演算 部分関数従属性
関係データベース(RDB) 挿⼊不整合 論理設計
関係(リレーショナル)
データモデル
属性(アトリビュート) 論理データモデル
関係名 属性値 論理的データ独⽴性
完全関数従属性 第⼀次正規化 和集合演算
関連 第⼀正規形 和両⽴
共通(積)集合演算 第三次正規化
これまでに学習したキーワード
〜データベース設計編〜
56
1事実1箇所 繰返しグループ 第三正規形
3層スキーマモデル 更新不整合問題 第⼆次正規化
ER図 削除不整合 第⼆正規形
E-Rモデル 差集合演算 タプル(組)
JDBC θ結合演算 直積演算
インスタンス θ⽐較可能 等結合演算
カーディナリティ 次数 導出属性
概念スキーマ ⾃然結合演算 ドメイン(定義域)
概念設計 実体 内部スキーマ
概念データモデル 射影演算 濃度
外部スキーマ 修正不整合 ⾮正規形
関係(リレーション) 商演算 物理設計
関係スキーマ 推移関数従属性 物理的データ独⽴性
関係代数 選択演算 部分関数従属性
関係データベース(RDB) 挿⼊不整合 論理設計
関係(リレーショナル)
データモデル
属性(アトリビュート) 論理データモデル
関係名 属性値 論理的データ独⽴性
完全関数従属性 第⼀次正規化 和集合演算
関連 第⼀正規形 和両⽴
共通(積)集合演算 第三次正規化

データベース10 - 正規化