データベース設計
このノートの問いがそのまま復習カードになり、忘れかけたころに出題されます。
シラバス案 Ver.0.1 の小分類 4-17-2「データベース設計」(大分類 4:デジタル技術/中分類 17:データベース)。
2026-09-26 にシラバス本文と突合済み。
0. 何を押さえるか
どんな表を作り、どうつなぐかを決める話です。流れは 3 段です。
| 段階 | やること | 使う言葉 |
|---|---|---|
| ① 対象を捉える | 業務に出てくる「もの」と「つながり」を洗い出す | エンティティ・リレーションシップ(E-R 図) |
| ② 表にする | 1 行を特定する項目を決め、表どうしをつなぐ | 主キー・外部キー |
| ③ 整える | 重複をなくすよう表を分ける/速さのために調整する | 正規化・インデックス |
取り違えやすい分かれ目はこの 2 つです。
| 何のためか | |
|---|---|
| 主キー | 自分の表の中で行を 1 つに特定する(重複も空も不可) |
| 外部キー | 別の表の主キーを指して、表と表をつなぐ |
| 何をするか | ねらい | |
|---|---|---|
| 正規化 | 表を分ける | 重複と更新時の矛盾をなくす |
| 非正規化 | あえて表をまとめる | 結合を減らして検索を速くする |
1. データベースの設計
根拠: シラバス 4-17-2
エンティティとリレーションシップとは?
| 何か | 例 | |
|---|---|---|
| エンティティ(実体) | 管理したい「もの」や「こと」 | 顧客、商品、注文 |
| リレーションシップ(関連) | エンティティどうしのつながり | 顧客が注文する |
これを図に描いたものが E-R 図(Entity-Relationship 図)。
エンティティはやがて表になり、リレーションシップは外部キーとして表に現れる。
E-R 図で「1 対多」とは? 例は?
一方の 1 件に、他方の複数件が対応するつながり
| 関係 | 例 |
|---|---|
| 1 対 1 | 社員 と 社員証 |
| 1 対多 | 顧客 と 注文(1 人の顧客が何件も注文する) |
| 多対多 | 学生 と 講義(1 人が複数を受講し、1 講義に複数が出る) |
多対多はそのままでは表にしにくいので、
間に「履修」のようなつなぐ表を置いて 1 対多 2 つに分ける。
主キーとは? 満たすべき条件は?
表の中で、行を 1 つに特定できる項目(または項目の組)
- 重複しない(同じ値の行が 2 つあってはならない)
- 空(NULL)にできない
氏名は同姓同名がありうるので主キーに向かない。
顧客番号のように必ず異なる値を振る項目を用意して使う。
複数の項目を組み合わせて主キーにすることもある(複合キー)。
外部キーとは? 主キーとどう違うか?
別の表の主キーを参照する項目
| 見ているもの | 重複 | |
|---|---|---|
| 主キー | 自分の表 | 不可 |
| 外部キー | 相手の表の主キー | 可(1 人の顧客が何件も注文する) |
注文表の「顧客番号」が、顧客表の主キーを指す。
これにより存在しない顧客番号の注文は登録できない(参照整合性)。
2. 正規化とパフォーマンス設計
根拠: シラバス 4-17-2
正規化とは? 何のために行うか?
データの重複がなくなるように、表を分割して整理すること
注文表に顧客の住所まで毎回書くと、
- 同じ住所を何度も持つ(無駄)
- 住所変更で一部の行だけ直し漏れる(矛盾)
顧客の情報を顧客表に分け、注文表は顧客番号だけ持つようにすれば、
1 つの事実は 1 か所にだけ書かれる。これが正規化のねらい。
正規化の 3 段階(第 1〜第 3 正規形)はそれぞれ何をするか?
| 段階 | やること |
|---|---|
| 第 1 正規形 | 1 つの欄に複数の値を入れない(繰り返しをなくし、1 行 1 件にする) |
| 第 2 正規形 | 主キーの一部だけで決まる項目を、別の表に分ける |
| 第 3 正規形 | 主キー以外の項目で決まる項目を、別の表に分ける |
どの段階も「その項目を決めているのは何か」を見て、
決め手の違う項目を別の表へ出していく作業。
正規化を進めすぎると何が起きるか? どう手当てするか?
表が細かく分かれるほど、取り出すたびに結合が増え、検索が遅くなる。
そこで、よく一緒に読むデータをあえて 1 つの表にまとめることがある(非正規化)。
代わりに重複が生まれるので、更新の矛盾を防ぐ工夫が別に要る。
正しさのために分け、速さのために一部をまとめる——
正規化とパフォーマンスはトレードオフ。
インデックスとは? 何と引き換えに速くなるか?
目的の行を速く探すための索引
本の索引と同じで、全部の行を先頭から見なくても目的の行に辿り着ける。
引き換えに、
- 記憶領域を余分に使う
- 追加・更新・削除が遅くなる(索引も直す必要がある)
ので、検索条件によく使う項目に絞って作る。