コース一覧
データベース内部構造:インデックス・トランザクション・分散DB
RDB と NoSQL の違い

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

RDB と NoSQL の違い

「あとで結合したい」と言い出したときには遅い

EC サイトを MongoDB で作ったとします。利用者の文書の中に、その人の注文をそのまま配列で埋め込んでおく。マイページの表示は文書を 1 つ読むだけで終わり、当然速い。ここまでは気持ちよく進みます。

半年後、「商品ごとの売上を出したい」と言われます。売上は各利用者の文書の奥にばらばらに埋まっているので、全利用者を読み、注文を取り出し、商品ごとに足し上げるしかありません。最初に決めた「1 人分をひとかたまりで持つ」という形が、新しい問い合わせ方をそのまま拒んでいます。

作り直すのは持ち方だけではありません。すでに入っている数百万件の文書を、新しい形へ全部書き換える移行も必要になります。

分けて持つか、まとめて持つか

RDB は逆の選択をしています。利用者と注文と商品を別々の表に分け、同じ事実は 1 か所にだけ置く。読むときに結合して組み立て直します。取り出し方を先に決めなくてよい代わりに、1 回の読み取りで複数の表を触ります。

NoSQL は、取り出す形のまま保存します。読み方が 1 通りに決まっているなら圧勝ですが、読み方が増えると持ち方から作り直すことになります。

どちらが正しいという話ではありません。決めているのは「同じ事実を何か所に置くか」の一点です。1 か所に置けば書き換えは 1 回で済み、読むたびに集める手間がかかる。使う場所ごとに置けば読むのは一瞬で、書き換えは置いた数だけ発生する。それだけのことです。

観点RDBNoSQL
持ち方表に分けて、読むときに結合読む形のまま 1 かたまりで保存
事実の置き場所1 か所だけ使う場所ごとに複製されやすい
想定外の集計後から書ける全件読み直しになりやすい
台数を増やす手間がかかる前提として設計されている

NoSQL と一口に言っても中身は別物です。キーと値だけの単純な倉庫、JSON 文書をそのまま入れるもの、書き込み量に振り切ったもの、関係そのものを辿るもの。共通しているのは「RDB の何かを捨てて、代わりに何かを得た」という点だけです。選ぶときに見るべきなのは名前ではなく、その製品が何を捨てたかです。

速いから NoSQL、ではない

「NoSQL は速い」はよくある誤解です。速いのは、そのデータの持ち方に合った読み方をしたときだけで、合わない読み方をすれば結局は全件を読みます。

「スキーマがない」も正確ではありません。DB の側に定義がないだけで、アプリのコードの中には必ず暗黙の形があります。定義が DB に書いていない分、形が少しずつずれた文書が混ざっても誰も止めてくれません。3 年前に入れた文書だけ項目名が違う、という事故はこうして起きます。

「トランザクションが使えない」も古い認識で、複数の文書にまたがる操作を扱える製品は増えています。ただし、分散した状態でそれを使うと速さの利点を自分で削ることになります。結局のところ、何を諦めた製品なのかを知らずに選ぶと痛い目を見ます。

解説

「とりあえず NoSQL」で始めて、結合したくなって作り直す失敗は本当に多いです。

現実的な線引きはこうなります。整合性が要る業務データは RDB。セッションやキャッシュのように、読み方が 1 通りで消えても作り直せるものはキーと値の倉庫。ログや解析のように、書き込みが膨大で 1 台に収まらないものは、そこだけ別の DB を足す。多くのサービスは RDB 1 本で始めて、必要になった部分だけを外に出す形に落ち着きます。

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

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

  • 配列サイズ固定の同型データの集まり
  • 設計何をどう作るかを決める前工程
  • applicationJSON 本文を送るときの Content-Type
  • スキーマDB やデータ構造の設計図
  • トランザクション「全部成功 or 全部なかったことに」をまとめる単位
  • セッションブラウザごとに紐づくサーバー側の保管箱
  • キャッシュ一度取得したデータを再利用するための一時保存
生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/27·更新 2026/08/26

関連レッスン

  • データベースの歴史

    階層型・ネットワーク型から RDB、NoSQL、NewSQL までの流れを辿る

  • エンティティ関係モデル (ER)

    実体・関係・属性で現実世界をモデル化する手法を学ぶ

  • 主キー・外部キー・候補キー

    識別子としてのキーの種類と役割を整理する

  • 正規化とは何か

    なぜ正規化が必要なのか、更新異常の概念を理解する

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

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