9. データベース設計の実践
正規化の目的と手順、種々の正規形、
SQLを用いた正規化
1
URL: https://www.kkaneko.jp/de/ds/index.html
金子邦彦
謝辞:この資料では「いらすとや」のイラストを使用しています
9. データベース設計の実践
正規化の目的と手順、種々の正規形、
SQLを用いた正規化
2
URL: https://www.kkaneko.jp/de/ds/index.html
金子邦彦
謝辞:この資料では「いらすとや」のイラストを使用しています
理論と実践の両立
データベース設計の重要性の理解
データベース運用能力の向上
3
アウトライン
1. イントロダクション
2. データベース設計の概要
3. 正規化
4. 問い合わせ結果からのテーブル生
5. SQL を用いた正規化
6. 正規形のバリエーション
4
SQLFiddle のサイトにアクセス
Webブラザを使用
1. ェブブラザを開く
2. アドレスバーにSQLFiddleURLを入力
http://sqlfiddle.com/
URLが分からないときは、Googleなどの検索エンジンを利
用。「SQLFiddle」と検索し、表示された結果から
SQLFiddleェブサイトをクリック。
5
SQLFiddle の画面
6
右側のパネル: SQL問い合わせ
SELECT などを入力。
左側のパネル: テーブル定義、デー
タの追加など。SQLCREATE TABLE
INSERT INTO などを入力。
実行ボタン
結果ィンド
実行ボタン
SQLFiddle でのデータベース管理システムの選択
(高度な機能)
7
データベース管理システムの選択
(この授業では MySQL を使用)
理論と実践の両立
データベース設計の重要性の理解
データベース運用能力の向上
8
アウトライン
1. イントロダクション
2. データベース設計の概要
3. 正規化
4. 問い合わせ結果からのテーブル生
5. SQL を用いた正規化
6. 正規形のバリエーション
9
SQLFiddle のサイトにアクセス
Webブラザを使用
1. ェブブラザを開く
2. アドレスバーにSQLFiddleURLを入力
http://sqlfiddle.com/
URLが分からないときは、Googleなどの検索エンジンを利
用。「SQLFiddle」と検索し、表示された結果から
SQLFiddleェブサイトをクリック。
10
SQLFiddle の画面
11
右側のパネル: SQL問い合わせ
SELECT などを入力。
左側のパネル: テーブル定義、デー
タの追加など。SQLCREATE TABLE
INSERT INTO などを入力。
実行ボタン
結果ィンド
実行ボタン
SQLFiddle でのデータベース管理システムの選択
(高度な機能)
12
データベース管理システムの選択
(この授業では MySQL を使用)
9-1. イントロダクション
13
リレーショナルデータベースの仕組み
データをテーブルと呼ばれる表形式で保存
テーブル間関連で結ばれる。複雑な構造を持ったデータ
を効率的に管理することを可能に。
14
関連
商品
ID
商品名
単価
1
みかん
50
2
りんご
100
3
メロン
500
購入者
商品番号
X
1
X
3
Y
2
購入
商品テーブルと購入テーブ
15
関連
商品
ID
商品名
単価
1
みかん
50
2
りんご
100
3
メロン
500
購入者
商品番号
X
1
X
3
Y
2
購入
Xさんは、1みかんと,
3 メロンを買った
Yさんは、 2 りんごを買った
商品テーブルの情報
購入テーブルの情報
結合の例
商品テーブルと購入テーブルを
して、購入者がどの商品を購
入したかのデータを取得。
結合条件は、商品テーブルのID
属性と購入テーブルの商品番号
属性が等しい場合に結合
16
関連
商品
ID
商品名
単価
1
みかん
50
2
りんご
100
3
メロン
500
購入者
商品番号
X
1
X
3
Y
2
購入
SELECT * FROM 商品
JOIN 購入
ON 商品.ID = 購入.商品番号;
ID 商品名 単価
商品番号
1
みかん
50
1
3
メロン
500
3
2
りんご
100
2
結合の例
17
SQLの実行により
新しく生成される
テーブル
ID 商品名 単価
商品番号
1
みかん
50
1
3
メロン
500
3
2
りんご
100
2
SELECT * FROM 商品
JOIN 購入
ON 商品.ID = 購入.商品番号;結合条件
結合のためのSQL
関連
商品
ID
商品名
単価
1
みかん
50
2
りんご
100
3
メロン
500
購入者
商品番号
X
1
X
3
Y
2
購入
結合条件の指定
商品テーブルの「ID」と購入テーブルの「商品
号」属性が等しいとい結合条件
等しい値を持つ」とい結合件の表し方
18
SELECT * FROM 商品
JOIN 購入
ON 商品.ID = 購入.商品番号;結合条件
結合のためのSQL
商品.ID = 購入.商品番号
テーブル1.属性3 = テーブル2.属性4
リレーショナルデータベースの重要性
1. データの整合性: リレーショナルデータベースは、デー
タの整合性を保持するための機能を有する。これにより、
誤ったデータや矛盾したデータが保存されるのを防ぐこ
とができる。
2. 柔軟な問い合わせ(クエリ)能力: リレーショナルデー
タベースのSQLStructured Query Language)の使用に
より、複雑な検索やデータの抽出が可能になる。
3. トランザクションの機能: 一連の操作全体を一つの単位
として取り扱ことができる機能。これにより、データ
の一貫性と信頼性が向上する。
4. セキュリティ: アクセス権限の設定などにより、セキュ
リティを確保。
データの安全な保管、効率的なデータ検索・操作、ビジネス
や研究の意思決定をサポート。 19
リレーショナルデータベースの設計における
考慮事項
次のことを考慮して設計を行
データの冗長性を排除する正規化
データの整合性を保証する制約
例:関連するテーブル間の参照に関する制約
例:同じ値が2度現れないとい制約
20
正規化とその重要性
正規は、リレーショナルデータベースのテー
ルを適切な形に再構成することで、ータの冗長
性を排除し、データの整合性を向上させるプロセ
ス。
正規化は、データベース設計において欠かせない
21
正規化の例
22
正規化前 正規化後
名前
昼食
料金
A
そば
250
B
カレーライス
400
C
カレーライス
400
D
うどん
250
名前
昼食
A
そば
B
カレーライス
C
カレーライス
D
うどん
昼食
料金
そば
250
カレーライス
400
うどん
250
正規化により、元のテーブルにあった冗長性を排除
冗長なデータがある
冗長なデータがない
名前
昼食
料金
A
そば
250
B
カレーライス
400
C
カレーライス
400
D
うどん
250
正規化前の問題
23
更新
350
カレーライスが
400円か 350に値下
昼食の値段が1つのはずなのに、
350, 400 の違った値段の記録が
あり、不整合がある
400」をすべて「350」に変更
する必要があるが、変更を間
違ったとする
昼食
値段
カレーライス
400
どん
250
名前
昼食
A
カレーライス
B
どん
C
カレーライス
350
正規化による問題解消
24
更新 カレーライスが
400円か 350に値下
400」をすべて「350」に変更
するのは1か所で済む。
間違いが起きにくい。
正規化の例
25
生徒名
クラス
教科
成績
田中
3
A
数学
85
田中
3
A
英語
90
佐藤
3
B
数学
88
佐藤
3
B
英語
92
生徒
ID
生徒名
クラス
1
田中
3
A
2
佐藤
3
B
生徒ID
教科
成績
1
数学
85
1
英語
90
2
数学
88
2
英語
92
正規化
正規化により、元のテーブルにあった冗長性を排除
SQL によるテーブル定義
テーブル名T
属性名名前、昼食、料金
属性のデータ型テキスト、テキスト、数値
データの整合性を保つための制約なし
26
CREATE TABLE T (
名前 TEXT,
昼食 TEXT,
料金 INTEGER);
演習のため、正規化前のテーブルを作成
データ追加のSQL
27
INSERT INTO T VALUES('A', 'そば', 250);
INSERT INTO T VALUES('B', 'カレーライス', 400);
INSERT INTO T VALUES('C', 'カレーライス', 400);
INSERT INTO T VALUES('D', 'うどん', 250);
演習のため、正規化前のテーブルを作成
名前
昼食
料金
A
そば
250
B
カレーライス
400
C
カレーライス
400
D
うどん
250
DISTINCT は重複行の除去
28
SELECT 昼食 FROM T; SELECT DISTINCT 昼食 FROM T
昼食
そば
カレーライス
カレーライス
うどん
結果 結果
昼食
そば
カレーライス
うどん
演習1.テーブル定義と
データの追加
トピックス
1. SQL によるテーブル定義
2. SQL によるデータの追加
3. 問い合わせ(クエリ)による
確認
29
Webブラザを使用
アドレスバーにSQLFiddleURLを入力
http://sqlfiddle.com/
URLが分からないときは、Googleなどの検索エンジンを利
用。「SQLFiddle」と検索し、表示された結果から
SQLFiddleェブサイトをクリック。
30
左側のパネルに、テーブル定義データの追加を行
SQL を入れる。
31
CREATE TABLE T (
名前 TEXT,
昼食 TEXT,
料金 INTEGER);
INSERT INTO T VALUES('A', 'そば', 250);
INSERT INTO T VALUES('B', 'カレーライス', 400);
INSERT INTO T VALUES('C', 'カレーライス', 400);
INSERT INTO T VALUES('D', 'うどん', 250);
Build Schema」をクリック
32
右側のパネルに、問い合わせ(クエリ)を行SQL を入
れる。
Run SQL」をクリック
SQL 文が実行され、結果が表示される。
下側のインドで、結果を確認
33
SELECT * FROM T;
右側のパネルに、問い合わせ(クエリ)を行SQL を入
れる。
Run SQL」をクリック
SQL 文が実行され、結果が表示される。
下側のインドで、結果を確認
34
SELECT 昼食 FROM T;
SELECT DISTINCT 昼食 FROM T;
自習1.データの追
目的: 新しい行をテーブルに追加
テーブルTに新しいである「E ラーメン 500」を
追加する SQL 文を解答してください
35
自習2.データの選
目的: 基本的なSELECTを復習する
料金が「300」よも大きい行を選択す SQL文を
解答してください
36
解答例
自習1
INSERT INTO T VALUES('E', 'ラーメン', 500);
自習2
SELECT * FROM T WHERE 料金 > 300;
37
9-2. ータベース設計の概要
38
データベース設計
データベース設計は、データベースの構造を定めるプロセス
テーブル名、属性、データ型、制約、索引
テーブル間の関係性
考慮事項
データの冗長性の減少正規化
データの整合性の保証制約
例:関連するテーブル間の参照に関する制約
例:同じ値が2度現れないとい制約
データの検索や操作の効率化索引、データベースの構造
の簡素化
39
データベース設計の重要性
冗長性の減少と異状の防止
整合性の保証
性能の確保
拡張性(将来のデータベース拡張への対応)
SQL が単純になるよな簡素なデータベースの構造
セキュリティ
40
まとめ
データベース設計は、冗長性の減少と異状の防止整合性
の保証性能の確保など、さまざまな面から重要
正規化によりデータの冗長性を排除することは、データ
ベース設計において重要
41
9-3. 正規化
42
正規化
目的
データベースの構造を最適化
効率的なデータベース管理を実現
方針
テーブルの数を減らすことよりも、データの冗長性(重複)
を減らすことを行
43
正規化のメリット
データの冗長性の減少 データの重複を減らす
異状の防止:更新、削除、挿入時の異状を防ぐ
効率の向上:データベース全体のサイズが縮小すると、ス
トレージの効率化とデータベース操作の高速化が期待でき
信頼性の確保:異状の防止により、データの信頼性の向上。
管理の容易化:データベースの管理が容易になる
44
正規化と情報無損失
情報無損失の原則
正規化においては、元のデータベースの情報が失われたり
余計な情報が追加されたりしないことが重要
情報無損失の確認方法
正規化を施した後のテーブル群から、正規化する前のテー
ブルを正確に復元できるかかを検証
正規化が、データを損なわないことを保証
45
正規化と情報無損失
46
テーブル
テーブル テーブル
結合
正規化前
テーブル
正規化後
正規化後の
テーブル群を使い
正規化する前の
テーブル復元可能
テーブル分割のバリエーション
47
名前
昼食
料金
A
そば
250
B
カレーライス
400
C
カレーライス
400
D
うどん
250
名前
昼食
A
そば
B
カレーライス
C
カレーライス
D
うどん
昼食
料金
そば
250
カレーライス
400
うどん
250
名前
料金
A
250
B
400
C
400
D
250
テーブルをどのに分割するについては、様々考えられるが、
情報無損失で、データの冗長性が減少していることが重要
分割① 分割② 分割③
名前
昼食
A
そば
B
カレーライス
C
カレーライス
D
うどん
昼食
料金
そば
250
カレーライス
400
うどん
250
名前
料金
A
250
B
400
C
400
D
250
分割
48
名前
昼食
料金
A
そば
250
B
カレーライス
400
C
カレーライス
400
D
うどん
250
名前
昼食
A
そば
B
カレーライス
C
カレーライス
D
うどん
分割①
昼食
料金
そば
250
カレーライス
400
うどん
250
情報無損失である:OK
データの冗長性が減少している:OK
テーブル名: X とする
テーブル名: Y とする
SELECT X.名前, X.昼食, Y.料金
FROM X JOIN Y ON X.昼食 = Y.昼食;
結合のコマンド
名前
昼食
料金
A
そば
250
B
カレーライス
400
C
カレーライス
400
D
うどん
250
このコマンドの実行により
元に戻る
分割
49
名前
昼食
料金
A
そば
250
B
カレーライス
400
C
カレーライス
400
D
うどん
250
分割②
名前
昼食
A
そば
B
カレーライス
C
カレーライス
D
うどん
名前
料金
A
250
B
400
C
400
D
250
名前
料金
A
250
B
400
C
400
D
250
更新のとき、複数個所
書き換え必要な場合
あり
350
350
情報無損失である:OK
データの冗長性が減少していないNG
データの
冗長性
分割
50
名前
昼食
料金
A
そば
250
B
カレーライス
400
C
カレーライス
400
D
うどん
250
分割③
昼食
料金
そば
250
カレーライス
400
うどん
250
名前
料金
A
250
B
400
C
400
D
250
情報無損失でないNG
データの冗長性が減少している:OK
正規化のまとめ
正規化は、データベースの構造を最適化効率的なデータ
ベース管理を実現
テーブルの数を減らすことよりも、データの冗長性(重
複)を減らすことを行
メリット:データの冗長性の減少、異状の防止、効率の向
上、信頼性の確保、管理の容易化
正規化では、情報無損失で、データの冗長性が減少するよ
に、テーブルを分割する
51
9-4. 問い合わせ結果からの
テーブル生成
52
問い合わせ結果からのテーブル生成
CREATE TABLE … AS
CREATE TABLE … AS は、SQL SELECT文の結
に基づいて新しいテーブルを作成
53
名前
昼食
料金
A
そば
250
B
カレーライス
400
C
カレーライス
400
D
うどん
250
テーブル T
CREATE TABLE X AS
SELECT DISTINCT 名前, 昼食
FROM T;
昼食
料金
そば
250
カレーライス
400
うどん
250
テーブル X
SQLFiddle での実行画面
単純な問い合わせ
54
SQLFiddle での実行画面
CREATE TABLE … AS の使用
55
SQLFiddle では CREATE TABLE … AS
左側のパネル
9-5. SQL を用いた正規化
56
SQL を用いたデータベースの正規化
SQLを使用して、データベース内のテーブルを正規化
情報無損失で、データの冗長性が減少するよテーブルを
分割する
57
テーブル
テーブル
正規化前
テーブル
正規化後
SQL を用いたデータベースの正規化
58
名前
昼食
料金
A
そば
250
B
カレーライス
400
C
カレーライス
400
D
うどん
250
名前
昼食
A
そば
B
カレーライス
C
カレーライス
D
うどん
昼食
料金
そば
250
カレーライス
400
うどん
250
正規化前
正規化後
CREATE TABLE X AS SELECT
DISTINCT 名前, 昼食 FROM T;
CREATE TABLE Y AS SELECT
DISTINCT 昼食, 料金 FROM T;
演習2で行こと
59
正規化前 正規化後
名前
昼食
料金
A
そば
250
B
カレーライス
400
C
カレーライス
400
D
うどん
250
名前
昼食
A
そば
B
カレーライス
C
カレーライス
D
うどん
昼食
料金
そば
250
カレーライス
400
うどん
250
正規化により、元のテーブルにあった冗長性を排除
冗長なデータがある
冗長なデータがない
演習2.テーブルの分割に
よる正規化
トピックス
1. テーブルの分割
2. 正規化
3. DISTINCT による重複除去
4. CREATE TABLE … AS による
テーブル生成
60
Webブラザを使用
アドレスバーにSQLFiddleURLを入力
http://sqlfiddle.com/
URLが分からないときは、Googleなどの検索エンジンを利
用。「SQLFiddle」と検索し、表示された結果から
SQLFiddleェブサイトをクリック。
61
左側のパネルに、テーブル定義データの追加を行
SQL を入れる。(演習1から、末尾の2行が増えている
で注意)
62
CREATE TABLE T (
名前 TEXT,
昼食 TEXT,
料金 INTEGER);
INSERT INTO T VALUES('A', 'そば', 250);
INSERT INTO T VALUES('B', 'カレーライス', 400);
INSERT INTO T VALUES('C', 'カレーライス', 400);
INSERT INTO T VALUES('D', 'うどん', 250);
CREATE TABLE X AS SELECT DISTINCT 名前, 昼食 FROM T;
CREATE TABLE Y AS SELECT DISTINCT 昼食, 料金 FROM T;
Build Schema」をクリック
63
右側のパネルに、問い合わせ(クエリ)を行SQL を入
れる。
Run SQL」をクリック
SQL 文が実行され、結果が表示される。
下側のインドで、結果を確認
64
SELECT * FROM X;
SELECT * FROM Y;
演習3.正規化における情
報無損失
トピックス
1. 正規化
2. 結合
65
Webブラザを使用
アドレスバーにSQLFiddleURLを入力
http://sqlfiddle.com/
URLが分からないときは、Googleなどの検索エンジンを利
用。「SQLFiddle」と検索し、表示された結果から
SQLFiddleェブサイトをクリック。
66
左側のパネルに、テーブル定義データの追加を行
SQL を入れる。(演習2と同じ)
67
CREATE TABLE T (
名前 TEXT,
昼食 TEXT,
料金 INTEGER);
INSERT INTO T VALUES('A', 'そば', 250);
INSERT INTO T VALUES('B', 'カレーライス', 400);
INSERT INTO T VALUES('C', 'カレーライス', 400);
INSERT INTO T VALUES('D', 'うどん', 250);
CREATE TABLE X AS SELECT DISTINCT 名前, 昼食 FROM T;
CREATE TABLE Y AS SELECT DISTINCT 昼食, 料金 FROM T;
Build Schema」をクリック
68
右側のパネルに、問い合わせ(クエリ)を行SQL を入
れる。
Run SQL」をクリック
SQL 文が実行され、結果が表示される。
下側のインドで、結果を確認
69
SELECT X.名前, X.昼食, Y.料金 FROM X JOIN Y ON X.昼食 = Y.昼食;
自習3.学生情報のためのテーブル作成
目的: 学生とその受講情報を格納するテーブルを作成
次の SQL を実行することにより、S テーブルを作成。「SELECT * FROM S;
により確認。
CREATE TABLE S (
StudentID INTEGER,
StudentName TEXT,
Course TEXT
);
INSERT INTO S VALUES (1, 'Alice', 'Math');
INSERT INTO S VALUES (1, 'Alice', 'Science');
INSERT INTO S VALUES (2, 'Bob', 'History');
INSERT INTO S VALUES (3, 'Charlie', 'Math');
INSERT INTO S VALUES (3, 'Charlie', 'History');
INSERT INTO S VALUES (3, 'Charlie', 'Science');
SELECT * FROM S; 70
自習4.冗長なデータの確認
目的: 学生について ID と名前のデータが冗長になっ
ていることを確認
自習3に続いて、次の SQL の実行結果を確認
SELECT StudentID, StudentName FROM S;
71
自習5.重複なしの学生情報抽出
目的: DISTINCT キーワードを用いて重複を除去す
る。
自習4に続いて、次の SQL の実行結果を確認
SELECT DISTINCT StudentID, StudentName
FROM S;
72
自習6.正規化
目的: DISTINCT キーワードを用いて重複を除去す
る。
自習4に続いて、次の SQL の実行結果を確認
CREATE TABLE U AS SELECT DISTINCT
StudentID, StudentName FROM S;
CREATE TABLE V AS SELECT DISTINCT
StudentID, Course FROM S;
SELECT * FROM U;
SELECT * FROM V;
73
74
自習3
75
自習4
76
自習5
77
自習6
9-6. 規形のバリエーション
78
正規化と正規形
正規形は、データベースの正規化におけるさまざまなレベル
より高度な正規化レベルへ進むにつれて、データの冗長性を
より減少させることを目指す
79
第一正規形
第二正規形
第三正規形
ボイスコッド正規形(
3.5
正規形ともい
第四正規形
第五正規形
ただし、「レベルが高いほど良い」と決まってはいない。レ
ベルが高いほど、データ更新時の性能低下の可能性、制約の
記述不可能の可能性
第三正規形への変換例
第一正規形や第二正規形のテーブルを、第三正規形に変換
80
名前
昼食
料金
A
そば
250
B
カレーライス
400
C
カレーライス
400
D
うどん
250
名前
昼食
A
そば
B
カレーライス
C
カレーライス
D
うどん
昼食
料金
そば
250
カレーライス
400
うどん
250
冗長なデータが原因で、
第三正規形ではない
両方とも、第三正規形
である
第三正規形への変換例
第一正規形や第二正規形のテーブルを、第三正規形に変換
81
冗長なデータが原因で、
第三正規形ではない
両方とも、第三正規形
である
正規形のレベル
第一正規
テーブルのセルには,1つの値を入れる.セルの合併はしない.
第二正規
候補キーに含まれない属性は、すべて候補キーに従属する.そし
て,候補キーの部分集合には従属しない.
第三正規
主キー以外の属性は,すべて主キーにのみ直接,従属する
ボイスコッド正規形(
3.5
正規形ともい
すべての従属関係
XY
について、それは自明であるか、
X
が超
キーである.
第四正規
すべての多値従属関
XY
について、それは自明であるか
X
候補キーであるか、
X
がその超集合である.
第五正規
すべての結合従属性について、それは自明であるか、候補キーに
より含意され
82
全体まとめ
データベース設計
データベース設計は、データベースの構造を定めるプロセス
テーブル名、属性、データ型、制約、索引、テーブル間の関係性などを定める
データベース設計での考慮事項
データの冗長性の減少:正規化
データの整合性の保証:制約
データの検索や操作の効率化:索引、データベースの構造の簡素化
データベース設計の重要性
冗長性の減少と異状の防止
整合性と性能の確保
拡張性とセキュリティの確保
83
全体まとめ
正規化の目的
データベースの構造最適化。効率的なデータベース管理を実現
正規化のメリット
データの冗長性の減少
異状の防止
効率の向上
信頼性の確保
管理の容易化
情報無損失の原則
正規化においては、元のデータベースの情報が失われたり余計な情報が追加
されたりしないことが重要
SQLを用いた正規化
情報無損失で、データの冗長性が減少するよテーブルを分割
CREATE TABLE ... AS コマンドを用いて新しいテーブルを作成
84
理論と実践の両立
正規化の目的は、データベースの構造を最適化し、効果的な
管理を実現することです。SQLを用いた正規化では、
CREATE TABLE ... AS」のよSQLコマンドを使用し
て、正規化を実行できます。
データベース設計の重要性の理解
データベース設計は、テーブル名、属性、データ型、制約、
索引を定めるプロセスであり、データベース全体の構造を決
定します。正規化を行ことで、データの冗長性を減少させ、
良いデータベース設計を達成できます。データベース設計は、
冗長性の減少、異常の防止、整合性と性能の確保など、さま
ざまな観点から重要です。
データベース運用能力の向上
正規化により、効率的なデータベース設計が可能になり、
データベース運用がより簡単になり、性能の向上も期待でき
ます。正規化においては、情報無損失原則に基づくテーブル
分割を行います。正規化を理解することは、データベース運
用能力の向上に寄与します。 85