ABCDEFGHIJKLMNOPQRSTUVWXYZAAABACADAEAFAGAHAIAJAKALAMANAOAPAQAR
1
2025-03-19(水) 正規化とER図
2
3
とある「予備校」をモデル化したデータベースのテーブル設計を考えてみる。
4
5
6
7
非正規形
8
一つのセルに複数の値が入っている状態のテーブルを指す。
9
10
学生科目テーブル
11
学生ID学年番号組番号出席番号組名学生名科目
12
S-2020-0001111花組アリス英語, 数学, 国語
13
S-2020-0002112花組ボブ英語, 数学
14
S-2020-0003121月組キャロル英語
15
16
上記では値をカンマ区切りにしているが、見方を変えれば「セル結合」を使っているテーブルとも言える。
17
18
学生科目テーブル
19
学生ID学年番号組番号出席番号組名学生名科目
20
S-2020-0001111花組アリス英語
21
数学
22
国語
23
S-2020-0002112花組ボブ英語
24
数学
25
S-2020-0003121月組キャロル英語
26
27
セル結合は、「データ利用(表示)時」には見やすくなる利点があるが、「データ管理時」には変更容易性が失われるため、編集を想定している表では使ってはいけない。
28
データ管理をする非正規形の表を作る場合には、セル結合をするよりもカンマ区切りのような一つのセル内に複数の値を入れる方式の方が望ましい。
29
30
正規化とは何かというと、「データの管理(編集)」をしていくにあたって、どのような構造になっていたら管理上の都合が良いかを研究したものである。
31
データを編集する予定がなければ(例えばログデータや過去の学生情報など)、非正規形でデータを保持しておいても何の問題もない。
32
「データの利用(表示)」をするにあたっては、テーブルは低次正規形の方が扱いやすい(一つのテーブルに全ての情報がまとまっている方が参照しやすい)。
33
「データの管理(編集)」をするにあたっては、テーブルは高次正規形の方が扱いやすい(冗長性を排除することで整合性を保ち、一箇所を編集するだけで関係する他の全てのデータとの関係性を正しく表現できる)。
34
35
非正規形
36
⬇️ 分割⬆️ 結合
37
第1正規形
38
⬇️ 分割⬆️ 結合
39
第2正規形
40
⬇️ 分割⬆️ 結合
41
第3正規形
42
⬇️ 分割⬆️ 結合
43
ボイスコッド正規形
44
⬇️ 分割⬆️ 結合
45
第4正規形
46
⬇️ 分割⬆️ 結合
47
第5正規形
48
49
高次正規化をすると、表示時に利用しやすいテーブルを生成するのに結合コストが高くなる。
50
高度なテクニックとして、高次正規化のデメリット(データ表示時のための低次正規形を生成するのにコストがかかる)を回避するため、意図的に高次正規化をしない手法がある。
51
ただし、意図的に高次正規化をしない場合は、データ管理時のメリットが失われても問題がないことを前提とする必要がある。
52
53
54
55
第1正規形単一データ原則
56
一つのセルには一つの値しか含まれないテーブルを指す。
57
58
学生科目テーブル
59
学生ID学年番号組番号出席番号組名学生名科目1科目2科目3
60
S-2020-0001111花組アリス英語数学国語
61
S-2020-0001111花組アリス英語数学
62
S-2020-0001111花組アリス英語
63
64
上記は第1正規形と言えるが、科目1, 2, 3 はそれぞれ可換なはずなので、列を分割するのは適切なモデルではない。
65
もしも、この学校に科目が定数個しかなく科目が廃止されることもないのであれば、次のようなテーブルをつくることもできる。
66
67
学生科目テーブル
68
学生ID学年番号組番号出席番号組名学生名科目:英語科目:数学科目:国語
69
S-2020-0001111花組アリスTRUETRUETRUE
70
S-2020-0001111花組アリスTRUETRUEFALSE
71
S-2020-0001111花組アリスTRUEFALSEFALSE
72
73
上記のようなテーブル設計は、拡張性が低く、列名に関連するデータを扱うことができない(科目の担当教員を表すデータを表現できない)。
74
表示時に利用しやすいように上記のようなテーブルを用意する目的があるのであれば、管理用のテーブルではなく、利用時用のビューまたはキャッシュテーブルとして用意する手法がある。
75
拡張性を確保したテーブル設計は次の通り。
76
77
学生科目テーブル
78
学生ID学年番号組番号出席番号組名学生名科目
79
S-2020-0001111花組アリス英語
80
S-2020-0001111花組アリス数学
81
S-2020-0001111花組アリス国語
82
S-2020-0002112花組ボブ英語
83
S-2020-0002112花組ボブ数学
84
S-2020-0003121月組キャロル英語
85
86
こうすると科目ごとの情報も表現できるようになる。
87
主キーは、{学生ID, 科目ID} である。
88
※主キーは {学年番号, 組番号, 出席番号, 科目名} と考えることもできるが、それより上記のほうが都合がよいのでここでは上記を主キーと考えている。
89
※主キーの候補となる列の組み合わせのことを「候補キー」と呼ぶ。主キーはいくつかの候補キーの中から選ばれたもののことを言う。
90
91
学生科目テーブル
92
学生ID学年番号組番号出席番号組名学生名科目ID科目名教員ID教員名
93
S-2020-0001111花組アリスF-01英語T-0001アルファ
94
S-2020-0001111花組アリスF-02数学T-0002ベータ
95
S-2020-0001111花組アリスF-03国語T-0003ガンマ
96
S-2020-0002112花組ボブF-01英語T-0001アルファ
97
S-2020-0002112花組ボブF-02数学T-0002ベータ
98
S-2020-0003121月組キャロルF-01英語T-0004デルタ
99
100