コース一覧
データベース内部構造:インデックス・トランザクション・分散DB
正規化とは何か

データベース内部構造:インデックス・トランザクション・分散DB

SQLの書き方ではなく、DBMSの内側を学ぶコースです。RDBとNoSQL、正規化、B-tree、トランザクションとMVCC、クエリプランナ、レプリケーションと分散SQLを通して、性能と整合性の判断根拠を身につけます。

1
データベースの基礎
0. データベースとは8分
1. RDB と NoSQL の違い8分
2. データベースの歴史8分
3. エンティティ関係モデル (ER)8分
4. 主キー・外部キー・候補キー8分
2
正規化
0. 正規化とは何か8分
1. 第1正規形8分
2. 第2正規形8分
3. 第3正規形8分
4. 非正規化のトレードオフ8分
3
インデックスと B-tree
0. インデックスの役割8分
1. B-tree の仕組み8分
2. B+tree(実際の DB 実装)8分
3. ハッシュインデックス8分
4. カバリングインデックス8分
4
トランザクションと ACID
0. トランザクションとは8分
1. ACID 特性8分
2. 分離レベル8分
3. MVCC(マルチバージョン同時実行制御)8分
4. デッドロックと回避8分
5
クエリ最適化
0. クエリプランナの役割8分
1. EXPLAIN の読み方8分
2. Nested Loop / Hash / Merge Join8分
3. インデックスチューニング8分
4. 統計情報とカーディナリティ8分
6
スケーリング
0. レプリケーション8分
1. シャーディング8分
2. CAP 定理8分
3. 結果整合性8分
4. NewSQL と分散 SQL8分

データベース内部構造:インデックス・トランザクション・分散DB

01データベースとは
02RDB と NoSQL の違い
03データベースの歴史
04エンティティ関係モデル (ER)
05主キー・外部キー・候補キー
06正規化とは何か
07第1正規形
08第2正規形
09第3正規形
10非正規化のトレードオフ
11インデックスの役割
12B-tree の仕組み
13B+tree(実際の DB 実装)
14ハッシュインデックス
15カバリングインデックス
16トランザクションとは
17ACID 特性
18分離レベル
19MVCC(マルチバージョン同時実行制御)
20デッドロックと回避
21クエリプランナの役割
22EXPLAIN の読み方
23Nested Loop / Hash / Merge Join
24インデックスチューニング
25統計情報とカーディナリティ
26レプリケーション
27シャーディング
28CAP 定理
29結果整合性
30NewSQL と分散 SQL

データベース内部構造:インデックス・トランザクション・分散DB

正規化とは何か

社名が変わって、198 行だけ直した

取引先の会社名を、請求データの各行にそのまま書いている表があるとします。同じ会社名が 200 行に散らばっています。

その会社が社名を変えました。担当者は古い社名を条件にして一括更新をかけ、198 行が書き換わります。残った 2 行は、入力したときに空白が 1 つ多く入っていたせいで条件から漏れました。エラーは出ていません。半年後、その 2 件だけ古い社名の請求書が出て、先方から連絡が来ます。

請求 ID会社名担当者金額
1山田商事佐藤50,000
2山田商事佐藤30,000
3鈴木物産田中80,000

同じ事実が 200 か所に書き写されているとき、それを正しく保つ責任は書く側のコードにあります。1 か所でも取りこぼせば、どれが本当の社名なのか誰にも分からなくなります。

厄介なのは、食い違ったまま入っていても DB が何も言わないことです。同じ会社の行に違う社名が書いてあっても、表の上ではただの文字列が 2 種類あるだけで、矛盾としては扱われません。

まだ取引していない会社は、登録すらできない

同じ表からは、別の困りごとも出てきます。

新しく取引先を登録したいのに、その会社の請求はまだ 1 件もありません。会社を入れる場所が請求の行しかないので、金額も担当者も空のままの行を作るしかない。逆に、鈴木物産の唯一の請求を取り消すと、その行と一緒に会社の情報まで消えます。

会社の情報を置く場所がない、というのが根っこの原因です。書き換えのときに起きるのが更新の異常、追加のときに起きるのが挿入の異常、削除のときに起きるのが削除の異常で、3 つとも同じ 1 つの表から出ています。

気づきにくいのは、この 3 つが別々の不具合に見えることです。取りこぼしはコードの書き方の問題に見え、空の行を作る話は運用の都合に見え、消えた会社はうっかりに見える。担当者も時期も違うので、同じ原因だと誰も気づかないまま、それぞれに小手先の対処が入っていきます。

「決まれば、決まる」を矢印で書き出す

どこが冗長なのかは、感覚ではなく機械的に見つけられます。列と列の間に「これが決まれば、これも決まる」という関係を書き出すのです。

プレーンテキスト

会社 ID --> 会社名
会社 ID --> 会社の住所
請求 ID --> 金額

会社 ID が決まれば会社名は 1 つに決まります。ところが表の上では、同じ会社 ID の行に違う会社名を書き込めてしまう。決まるはずのものが、書く場所の数だけ自由になっている。これが冗長の正体で、先ほどの 3 つの異常はすべてここから出ています。

先ほどの表なら、直し方はこうなります。会社の表を別に立てて、社名と住所はそこに 1 行だけ置く。請求の表からは社名を消し、会社 ID だけを残す。社名の変更は 1 行の書き換えで終わり、取りこぼす行がそもそも存在しなくなります。まだ請求のない会社も登録でき、最後の請求を消しても会社は残ります。3 つの異常が同時に消えるのは、原因が 1 つだったからです。

この矢印に沿って表を分け、決まる側の値を 1 か所だけに置き直す手続きが正規化です。分け方には段階があり、1 つのセルに複数の値を詰めない、主キーの一部だけで決まる列を切り出す、主キー以外の列で決まる列を切り出す、と順に進みます。その先にもボイスコッド正規形や第 4 正規形といった段階がありますが、実務で手を動かすのは 3 段目までです。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • 正規化データの重複を減らし整合性を保つ設計手法
  • 外部キーテーブル同士を結びつける鍵
  • 主キーレコードを一意に特定する列
生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/27·更新 2026/08/26

関連レッスン

  • 第1正規形

    繰り返し項目を排除し原子値だけで構成する

  • 第2正規形

    部分関数従属を排除し複合キーの依存を整理する

  • 第3正規形

    推移関数従属を排除し非キー属性の独立性を確保する

  • 非正規化のトレードオフ

    読み取り性能のために冗長を許容する判断基準を学ぶ

分からないところは Tap (AI先生) に質問できます

24 時間いつでも、あなたのレベルに合わせて日本語で答えます。