コース一覧
データベース内部構造:インデックス・トランザクション・分散DB
CAP 定理

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

CAP 定理

線が切れている 30 秒、どう答えるか

3 台でデータを持ち合っているシステムがあります。ネットワークの不調で、1 台だけが他の 2 台と通信できなくなりました。数十秒で復旧する見込みですが、その間もリクエストは来ます。

孤立した 1 台に「残高を見せて」と来たとき、返せる答えは 2 つしかありません。手元にある値をそのまま返すか、今は答えられないとエラーを返すかです。他の 2 台で更新が起きていれば手元の値は古いので、前者を選べば古い値を配ることになります。後者を選べば、その 1 台につながっている利用者は何もできません。

CAP 定理が言っているのは、この二択が原理的に避けられないということです。通信の分断 (Partition tolerance) が起きている間、どこから読んでも同じ値が返ること (Consistency) と、必ず応答が返ること (Availability) は両立しません。

「3 つのうち 2 つ」という言い方の落とし穴

CAP はよく「3 つのうち 2 つを選ぶ」と説明されます。この言い方は、分断を選ばないという選択肢があるように聞こえるのが問題です。

ネットワークは切れます。ケーブルも抜けますし、クラウドのゾーン間の通信も落ちます。複数台に分けて持つと決めた時点で、分断は起きるものとして扱うしかありません。選べるのは、分断が起きたときに古い値を返すか、エラーを返すか、それだけです。

分断は、線が物理的に切れることだけを指すわけでもありません。片方向だけパケットが落ちる、遅延が数十秒に伸びる、といった中途半端な状態も、相手から見れば「応答がない」ので同じ扱いになります。判定はタイムアウトで行うので、実際には切れていないのに切れたと見なされることもあります。

つまり CAP は、設計の初期に机上で 2 つ選ぶ話ではありません。障害の最中に自分のシステムがどちらの顔をするかを、事前に知っておく話です。知らないまま本番で分断に遭うと、開発チームは「なぜ古い値が出るのか」を障害対応の最中に調べ始めることになります。

答えは機能ごとに違う

システム全体でどちらかに決める必要はありません。むしろ機能ごとに分けた方が実態に合います。

決済の残高で古い値を返すのは論外です。エラーで待たせる方がましなので、応答を諦める側に倒します。記事の閲覧数や「いいね」の表示は、数秒古くても誰も困りません。エラーで真っ白になる方がよほど問題なので、古い値でも返す側に倒します。

分散データベースの多くは、この選択を 1 リクエスト単位で指定できるようにしています。「何台の応答が揃ったら成功とみなすか」という設定がそれで、要求する台数を上げれば古い値を返しにくくなり、そのぶん遅くなり、障害時に失敗しやすくなります。1 台の応答で済ませれば、その逆になります。

決めたら、その挙動を一度は確かめておきます。試験環境でノード間の通信を落とし、アプリに何が返るかを見る。ここを本番の障害で初めて知ることになると、対応がまるごと後手に回ります。

解説

ACID の C と CAP の C は別物です。前者は宣言した制約を破らないこと、後者は全ノードが同じ値を見せることを指します。

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

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

  • リクエストWeb 通信の基本単位、ブラウザの問い合わせとサーバーの返答
  • クラウドクラウドはインターネット経由でサーバーリソースを借りる形態。
  • 設計何をどう作るかを決める前工程
  • データベースデータを構造化して保存する仕組み
  • ACID原子性・一貫性・独立性・永続性の4特性
生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/27·更新 2026/08/26

関連レッスン

  • 結果整合性

    BASE と AP 系システムが選ぶ妥協と利点

  • NewSQL と分散 SQL

    TiDB / Spanner が実現する分散環境での ACID

  • シャーディング

    水平分割でデータを分散し書き込みを拡張する手法

  • レプリケーション

    Primary / Replica 構成での読み取り分散と整合性

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

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