正規化の深掘り

luagate/normalization-intro正規化入門23データベース・SQL

上から下へ、全 23 枚そのまま並べています。

発表モードで開く

正規化入門

正規化の深掘り

重複をなくす設計 〜きれいなテーブル〜

1
1

目次

今日の流れ

1. 重複データの問題

2. 正規化とは何か

3. 第1〜第3正規形

4. やりすぎと非正規化

5. まとめと振り返り

2
2
正規化入門 - イントロ

今日のゴール

この時間で身につけてほしいことです。

  • 重複データがなぜ問題なのかが分かる
  • 正規化が「重複をなくす設計」だと分かる
  • 第1〜第3正規形の手順をイメージできる
  • やりすぎると逆に使いにくくなると気づける
  • あえて崩す非正規化という選択を知る
10
3
正規化入門 - イントロ

リレーショナルDB のおさらい

以前学んだリレーショナルデータベースを思い出すところから始めます。

リレーショナルデータベース

データを複数のテーブルに分けて持ち、共通のIDなどで関連づけて管理するデータベース。表どうしの関係を使って、ばらばらの情報を必要なときにつなぎ合わせる。

データを複数の表に分けて持つ

共通のIDで表どうしを関連づける

JOINで必要なときに合体できる

正規化はこの表の分け方を整える作業

11
4
正規化入門 - イントロ

重複データの問題

同じ情報を何度も書くと、ムダが増え、食い違いが生まれます。

重複(データの冗長性)

同じ情報が複数の行や列に繰り返し書かれている状態。容量のムダになるだけでなく、片方だけ直して食い違う、消し忘れて矛盾するといったトラブルの温床になる。

同じ情報を何度も書いてムダが増える

片方だけ直すと食い違いが起きる

消すべき情報が他の行に残ってしまう

住所変更のたびに何行も直す手間

12
5
正規化入門 - イントロ

重複が招く3つの事故

重複したテーブルでは、更新・追加・削除のそれぞれで不具合が起きやすくなります。

更新の食い違い
  • 一部だけ直して矛盾する
  • どれが正しいか分からない
追加できない
  • 他の情報がないと登録できない
  • 無理に空欄を埋めてしまう
消すと巻き添え
  • 1行消すと別の情報も消える
  • 残すべき情報まで失う
13
6

正規化入門 - 考え方

2

第2部 正規化とは

重複をなくす整理のルール

20
7
正規化入門 - 考え方

正規化 とは

重複をなくし、1つの事実を1か所だけに置くようにテーブルを分けていく作業です。

正規化(Normalization)

重複や矛盾が起きないように、テーブルを段階的に分割して整える設計手法。1つの事実は1か所だけに書く、という原則に近づけていく。第1から第3正規形まで順に進める。

重複をなくすようにテーブルを分ける

1つの事実は1か所だけに置く

段階を踏んで少しずつ整える

食い違いや消し忘れを防ぐ

21
8
正規化入門 - 考え方

きれいなテーブル設計

情報を意味ごとに別々の表へ分け、共通のIDでつなぐと、重複のない設計になります。

  • 意味ごとに別の表へデータを分ける
  • 利用者の表と注文の表のように役割で分割
  • 共通のIDで表どうしをつなぐ
  • 同じ情報は1か所だけに書く
  • 変更があってもそこ1か所を直せば済む
22
9
正規化入門 - 考え方

非正規形 と 正規化後

1つの表に何でも詰め込んだ状態から、意味ごとに分けた状態へ整えます。

非正規形(詰め込み)

  • 1つの表に何でも入れる
  • 商品名や顧客住所が繰り返し並ぶ
  • 同じ情報が何行も重複する
  • 直すときにあちこち直す

正規化後(分割)

  • 意味ごとに表を分ける
  • 顧客・商品・注文を別の表に
  • 共通のIDでつなぐ
  • 直すのは1か所だけで済む
23
10

正規化入門 - 正規形

3

第3部 第1〜第3正規形

段階を踏んで整える

30
11
正規化入門 - 正規形

正規化の3ステップ

正規化は、第1から第3まで順番に進めるのが基本です。

第1正規形 繰り返しをなくす
第2正規形 主キーの一部だけに依存する列を分ける
第3正規形 主キー以外に依存する列を分ける
重複のない、きれいなテーブルに整う
31
12
正規化入門 - 正規形

第1〜第3正規形の中身

それぞれの段階で「何をどこへ分けるか」が違います。

第1正規形

1つのマスに値を1つだけにし、繰り返しの列や複数値をなくす

第2正規形

主キーの一部だけで決まる項目を、別の表へ切り出す

第3正規形

主キー以外の列で決まる項目を、さらに別の表へ切り出す

仕上がり

どの項目も主キー全体だけに依存する、重複のない形になる

32
13
正規化入門 - 正規形

3つの正規形のねらい

段階ごとに「なくしたい重複」と「身近なたとえ」を並べます。

なくすもの
身近なたとえ

第1正規形

1マスに複数の値や繰り返し列

1マスに住所を3つ書かない

第2正規形

キーの一部だけで決まる重複

注文表に商品名を毎回書かない

第3正規形

キー以外で決まる重複

顧客表に郵便番号と住所を二重に持たない

33
14
正規化入門 - 正規形

正規化による重複の減り方(イメージ)

段階を進めるほど、同じ情報の繰り返しが減っていきます。あくまでイメージです。

100 相対的な重複の量806040200
100相対的な重複の量
70相対的な重複の量
45相対的な重複の量
25相対的な重複の量
非正規形
第1正規形
第2正規形
第3正規形

出典: 正規化の段階と重複量の傾向を示す概念図(概算)

34
15

正規化入門 - バランス

4

第4部 やりすぎと非正規化

分けすぎず、ちょうどよく

40
16
正規化入門 - バランス

やりすぎ問題

きれいに分けすぎると、毎回たくさんの表をつなぐ必要が出て、かえって遅く・複雑になります。

正規化のやりすぎ

重複をなくそうとして細かく分けすぎた結果、データを取り出すたびに多くの表を結合しなければならず、処理が重くなったり読み解きにくくなったりする状態。

分けすぎると結合の回数が増える

取り出しが重く・遅くなる

クエリが長く読みにくくなる

きれいさと使いやすさの綱引きになる

41
17
正規化入門 - バランス

非正規化という選択

あえて重複を許して、よく使う情報を一緒に持たせ、速さを優先する判断もあります。

非正規化(Denormalization)

正規化で分けたテーブルを、あえて一部まとめ直すこと。重複を許す代わりに、結合を減らして取り出しを速くする。読み取りが多く速さが重要な場面で選ばれる。

あえて重複を許してまとめ直す

結合を減らして取り出しを速くする

読み取りが多い場面で効く

食い違いの管理という代償を負う

42
18
正規化入門 - バランス

正規化と非正規化の使い分け

どちらが正しいというより、何を優先するかで選びます。

正規化を重視

  • 更新や追加が多い
  • 食い違いを絶対に避けたい
  • データの正しさが最優先
  • 業務システムの記録など

非正規化を許す

  • 読み取りがとても多い
  • 表示の速さが重要
  • 集計やダッシュボード
  • 食い違いを管理できる前提
43
19
正規化入門 - まとめ
クイズ

振り返りクイズ

今日の内容を確認しましょう。

正規化の主な目的として最も適切なものはどれ?

A
データを暗号化して守る
B
重複をなくし矛盾を防ぐ
C
取り出しを必ず速くする
D
テーブルの数を減らす
50
20
正規化入門 - まとめ
答え

振り返りクイズ 解答

正規化の主な目的として最も適切なものはどれ?

A
データを暗号化して守る
B
重複をなくし矛盾を防ぐ
C
取り出しを必ず速くする
D
テーブルの数を減らす

正規化の目的は、重複をなくして1つの事実を1か所に置き、更新の食い違いや消し忘れによる矛盾を防ぐことです。暗号化は別の話で、取り出しはむしろ結合が増えて遅くなることもあり、表の数は逆に増える傾向があります。

51
21
正規化入門 - まとめ

質疑・次回予告

今日のまとめと、次に学ぶテーマです。質問があればここで受け付けます。

今日のおさらい
  • 正規化は重複をなくす設計
  • 第1〜第3正規形で段階的に整える
  • やりすぎず非正規化も選択肢にする
次回予告
  • トランザクションとACID 〜矛盾なく処理する〜
  • 全部か無かで安全に処理するしくみ
52
22
"

正規化は「1つの事実を1か所だけに」置くための整理術。重複をなくせば矛盾は減るが、分けすぎれば遅くなる。きれいさと使いやすさの綱引きを、目的に合わせて見極めるのが設計の腕です。

正規化入門

53
23