| A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | AA | AB | AC | AD | AE | AF | AG | AH | AI | AJ | AK | AL | AM | AN | AO | AP | AQ | AR | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 2025-03-19(水) 正規化とER図 | |||||||||||||||||||||||||||||||||||||||||||
2 | ||||||||||||||||||||||||||||||||||||||||||||
3 | とある「予備校」をモデル化したデータベースのテーブル設計を考えてみる。 | |||||||||||||||||||||||||||||||||||||||||||
4 | ||||||||||||||||||||||||||||||||||||||||||||
5 | ||||||||||||||||||||||||||||||||||||||||||||
6 | ||||||||||||||||||||||||||||||||||||||||||||
7 | 非正規形 | |||||||||||||||||||||||||||||||||||||||||||
8 | 一つのセルに複数の値が入っている状態のテーブルを指す。 | |||||||||||||||||||||||||||||||||||||||||||
9 | ||||||||||||||||||||||||||||||||||||||||||||
10 | 学生科目テーブル | |||||||||||||||||||||||||||||||||||||||||||
11 | 学生ID | 学年番号 | 組番号 | 出席番号 | 組名 | 学生名 | 科目 | |||||||||||||||||||||||||||||||||||||
12 | S-2020-0001 | 1 | 1 | 1 | 花組 | アリス | 英語, 数学, 国語 | |||||||||||||||||||||||||||||||||||||
13 | S-2020-0002 | 1 | 1 | 2 | 花組 | ボブ | 英語, 数学 | |||||||||||||||||||||||||||||||||||||
14 | S-2020-0003 | 1 | 2 | 1 | 月組 | キャロル | 英語 | |||||||||||||||||||||||||||||||||||||
15 | ||||||||||||||||||||||||||||||||||||||||||||
16 | 上記では値をカンマ区切りにしているが、見方を変えれば「セル結合」を使っているテーブルとも言える。 | |||||||||||||||||||||||||||||||||||||||||||
17 | ||||||||||||||||||||||||||||||||||||||||||||
18 | 学生科目テーブル | |||||||||||||||||||||||||||||||||||||||||||
19 | 学生ID | 学年番号 | 組番号 | 出席番号 | 組名 | 学生名 | 科目 | |||||||||||||||||||||||||||||||||||||
20 | S-2020-0001 | 1 | 1 | 1 | 花組 | アリス | 英語 | |||||||||||||||||||||||||||||||||||||
21 | 数学 | |||||||||||||||||||||||||||||||||||||||||||
22 | 国語 | |||||||||||||||||||||||||||||||||||||||||||
23 | S-2020-0002 | 1 | 1 | 2 | 花組 | ボブ | 英語 | |||||||||||||||||||||||||||||||||||||
24 | 数学 | |||||||||||||||||||||||||||||||||||||||||||
25 | S-2020-0003 | 1 | 2 | 1 | 月組 | キャロル | 英語 | |||||||||||||||||||||||||||||||||||||
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-0001 | 1 | 1 | 1 | 花組 | アリス | 英語 | 数学 | 国語 | |||||||||||||||||||||||||||||||||||
61 | S-2020-0001 | 1 | 1 | 1 | 花組 | アリス | 英語 | 数学 | ||||||||||||||||||||||||||||||||||||
62 | S-2020-0001 | 1 | 1 | 1 | 花組 | アリス | 英語 | |||||||||||||||||||||||||||||||||||||
63 | ||||||||||||||||||||||||||||||||||||||||||||
64 | 上記は第1正規形と言えるが、科目1, 2, 3 はそれぞれ可換なはずなので、列を分割するのは適切なモデルではない。 | |||||||||||||||||||||||||||||||||||||||||||
65 | もしも、この学校に科目が定数個しかなく科目が廃止されることもないのであれば、次のようなテーブルをつくることもできる。 | |||||||||||||||||||||||||||||||||||||||||||
66 | ||||||||||||||||||||||||||||||||||||||||||||
67 | 学生科目テーブル | |||||||||||||||||||||||||||||||||||||||||||
68 | 学生ID | 学年番号 | 組番号 | 出席番号 | 組名 | 学生名 | 科目:英語 | 科目:数学 | 科目:国語 | |||||||||||||||||||||||||||||||||||
69 | S-2020-0001 | 1 | 1 | 1 | 花組 | アリス | TRUE | TRUE | TRUE | |||||||||||||||||||||||||||||||||||
70 | S-2020-0001 | 1 | 1 | 1 | 花組 | アリス | TRUE | TRUE | FALSE | |||||||||||||||||||||||||||||||||||
71 | S-2020-0001 | 1 | 1 | 1 | 花組 | アリス | TRUE | FALSE | FALSE | |||||||||||||||||||||||||||||||||||
72 | ||||||||||||||||||||||||||||||||||||||||||||
73 | 上記のようなテーブル設計は、拡張性が低く、列名に関連するデータを扱うことができない(科目の担当教員を表すデータを表現できない)。 | |||||||||||||||||||||||||||||||||||||||||||
74 | 表示時に利用しやすいように上記のようなテーブルを用意する目的があるのであれば、管理用のテーブルではなく、利用時用のビューまたはキャッシュテーブルとして用意する手法がある。 | |||||||||||||||||||||||||||||||||||||||||||
75 | 拡張性を確保したテーブル設計は次の通り。 | |||||||||||||||||||||||||||||||||||||||||||
76 | ||||||||||||||||||||||||||||||||||||||||||||
77 | 学生科目テーブル | |||||||||||||||||||||||||||||||||||||||||||
78 | 学生ID | 学年番号 | 組番号 | 出席番号 | 組名 | 学生名 | 科目 | |||||||||||||||||||||||||||||||||||||
79 | S-2020-0001 | 1 | 1 | 1 | 花組 | アリス | 英語 | |||||||||||||||||||||||||||||||||||||
80 | S-2020-0001 | 1 | 1 | 1 | 花組 | アリス | 数学 | |||||||||||||||||||||||||||||||||||||
81 | S-2020-0001 | 1 | 1 | 1 | 花組 | アリス | 国語 | |||||||||||||||||||||||||||||||||||||
82 | S-2020-0002 | 1 | 1 | 2 | 花組 | ボブ | 英語 | |||||||||||||||||||||||||||||||||||||
83 | S-2020-0002 | 1 | 1 | 2 | 花組 | ボブ | 数学 | |||||||||||||||||||||||||||||||||||||
84 | S-2020-0003 | 1 | 2 | 1 | 月組 | キャロル | 英語 | |||||||||||||||||||||||||||||||||||||
85 | ||||||||||||||||||||||||||||||||||||||||||||
86 | こうすると科目ごとの情報も表現できるようになる。 | |||||||||||||||||||||||||||||||||||||||||||
87 | 主キーは、{学生ID, 科目ID} である。 | |||||||||||||||||||||||||||||||||||||||||||
88 | ※主キーは {学年番号, 組番号, 出席番号, 科目名} と考えることもできるが、それより上記のほうが都合がよいのでここでは上記を主キーと考えている。 | |||||||||||||||||||||||||||||||||||||||||||
89 | ※主キーの候補となる列の組み合わせのことを「候補キー」と呼ぶ。主キーはいくつかの候補キーの中から選ばれたもののことを言う。 | |||||||||||||||||||||||||||||||||||||||||||
90 | ||||||||||||||||||||||||||||||||||||||||||||
91 | 学生科目テーブル | |||||||||||||||||||||||||||||||||||||||||||
92 | 学生ID | 学年番号 | 組番号 | 出席番号 | 組名 | 学生名 | 科目ID | 科目名 | 教員ID | 教員名 | ||||||||||||||||||||||||||||||||||
93 | S-2020-0001 | 1 | 1 | 1 | 花組 | アリス | F-01 | 英語 | T-0001 | アルファ | ||||||||||||||||||||||||||||||||||
94 | S-2020-0001 | 1 | 1 | 1 | 花組 | アリス | F-02 | 数学 | T-0002 | ベータ | ||||||||||||||||||||||||||||||||||
95 | S-2020-0001 | 1 | 1 | 1 | 花組 | アリス | F-03 | 国語 | T-0003 | ガンマ | ||||||||||||||||||||||||||||||||||
96 | S-2020-0002 | 1 | 1 | 2 | 花組 | ボブ | F-01 | 英語 | T-0001 | アルファ | ||||||||||||||||||||||||||||||||||
97 | S-2020-0002 | 1 | 1 | 2 | 花組 | ボブ | F-02 | 数学 | T-0002 | ベータ | ||||||||||||||||||||||||||||||||||
98 | S-2020-0003 | 1 | 2 | 1 | 月組 | キャロル | F-01 | 英語 | T-0004 | デルタ | ||||||||||||||||||||||||||||||||||
99 | ||||||||||||||||||||||||||||||||||||||||||||
100 | ||||||||||||||||||||||||||||||||||||||||||||