コース一覧
データベース内部構造:インデックス・トランザクション・分散DB
第3正規形

データベース内部構造:インデックス・トランザクション・分散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

第3正規形

部署が引っ越して、社員 40 人分の行を直す

社員の表に、所属部署の ID だけでなく、部署名と所在地まで書いてある設計を考えます。画面に出すときに結合しなくて済むので、最初は快適です。

社員 ID氏名部署 ID部署名所在地
1佐藤10開発部東京
2鈴木10開発部東京
3田中20営業部大阪

開発部が横浜に移転しました。直すべきは開発部の所在地 1 か所のはずなのに、実際に書き換える行は開発部に所属する 40 人分あります。休職中の社員の行を 1 つ見落とせば、同じ開発部に東京と横浜が並ぶことになります。

この 40 行の書き換えは、業務としては 1 つの出来事です。1 つの出来事に対して 40 回の書き込みが必要なら、そのどこかが失敗する確率も 40 倍になります。

新設した部署を登録できないのも、同じ原因です。まだ 1 人も配属されていない部署には、名前を書く行がありません。

主キーを経由しないで決まる列がある

前の段階との違いは、主キーの形にあります。この表の主キーは社員 ID 1 列だけで、組にはなっていません。それでも冗長が残っています。

矢印を書くとこうなります。

diagram (will load when visible)

部署名は社員 ID から直接決まっているのではなく、部署 ID を経由して決まっています。決めているのは主キーではなく、主キー以外の列です。主キーの一部が犯人だった前の段階と違い、ここでは主キーとまったく関係のない列同士が結びついています。

見つけ方は簡単です。主キー以外の列の中から、他の列を決めてしまう列を探します。部署 ID がそれです。部署 ID とそれが決める列をまとめて部署の表へ移し、社員の表には部署 ID だけを残します。これで移転は 1 行の書き換えになり、配属者ゼロの部署も作れます。

実務で見かける形は、たいてい地味です。注文の表に郵便番号と都道府県が並んでいる。社員の表に役職コードと役職名が並んでいる。商品の表に分類コードと分類名が並んでいる。どれも前の列が後ろの列を決めています。コードと名前が隣り合っていたら、まず疑ってよい形です。

真実は 1 か所にだけ置く

やっていることは、コードを書くときの「同じことを 2 度書かない」とまったく同じです。同じ事実の置き場所が 2 か所あれば、いつか必ず食い違います。食い違ってからでは、どちらが正しいのか誰にも分かりません。

主キー以外の列同士に、こうした決定の関係が残っていない状態が第 3 正規形です。この先にはボイスコッド正規形や第 4 正規形といった段階もありますが、名前を知っていれば十分です。第 3 正規形まで進めておけば、書き換えのときに起きる食い違いはほぼ防げます。

分けたあとに困るのは、画面に部署名を出したいときです。結合が 1 つ増えます。それでも、部署が 100 件、社員が 100 万人という規模なら、部署 ID に索引が貼ってあるかぎり実用上の差は出ません。間違った部署名が出るより、1 回の結合を足すほうが安い。結合を怖がって分けないほうが、あとで高くつきます。

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

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

  • 設計何をどう作るかを決める前工程
  • 外部キーテーブル同士を結びつける鍵
  • 主キーレコードを一意に特定する列
  • 分類カテゴリを当てる教師ありタスク
生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/27·更新 2026/08/26

関連レッスン

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

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

  • インデックスの役割

    全件走査と索引参照の違いを計算量から把握する

  • トランザクションとは

    BEGIN / COMMIT / ROLLBACK の意味と必要性を学ぶ

  • クエリプランナの役割

    SQL から実行計画が生成される過程を追う

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

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