コース一覧
データベース内部構造:インデックス・トランザクション・分散DB
エンティティ関係モデル (ER)

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

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

作り始めてから、テーブルが 1 つ足りないと気づく

注文機能を作ることになりました。注文の表と商品の表を用意して、さてこの 2 つをどうつなぐかと考えます。

注文の表に商品の ID を持たせると、1 件の注文に商品を 1 つしか入れられません。逆に商品の表に注文の ID を持たせると、その商品は 1 件の注文にしか使えなくなります。どちらに置いても足りません。1 件の注文に複数の商品が入り、1 つの商品が複数の注文に登場するからです。

必要なのは 3 つ目の表で、「どの注文に、どの商品が、いくつ」だけを持ちます。これは実装を始めてから気づくことではなく、机の上で先に分かることです。そのための書き方が ER モデルです。

何対何かを、実装の前に決める

ER モデルは 1976 年に Peter Chen が提唱した設計の記法で、世界を 3 つの部品で切り取ります。エンティティは「もの」で、のちの表になります。属性はそのものが持つ性質で、のちの列になります。関係はもの同士のつながりです。

大事なのは、関係に付ける「何対何か」です。

  • 1 対 1 — 利用者と本人確認情報のような関係。どちらかに相手の ID を持たせるか、そもそも 1 つの表にまとめる
  • 1 対多 — 利用者と注文のような、いちばん多い関係。「多」の側に相手の ID を持たせる
  • 多対多 — 注文と商品の関係。どちらにも置けないので、間に表を 1 つ立てる

多対多で立てた表には、もう 1 つ役割があります。「その関係だけが持つ性質」の置き場所になることです。注文と商品の関係には個数が付きますが、これは注文の性質でも商品の性質でもありません。関係の側にしか置けない属性で、間の表があって初めて置き場所ができます。

そして、この表は単独では意味を持ちません。注文が消えれば一緒に消える存在です。従属した表を先に見つけられるかどうかが、設計の分かれ目になります。

diagram (will load when visible)

図が読めないと、設計を人に渡せない

記法には Chen 式と IE 式があり、実務で見るのはほぼ IE 式のほうです。線の端が三本に割れていれば「多」、縦棒 1 本なら「1」を表します。上の図の ||--o{ はそれを文字で書いたもので、「利用者 1 人につき注文は 0 件以上」と読みます。

手順そのものは難しくありません。まず会話に出てくる名詞を書き出してエンティティの候補にする。次に「〜が〜を持つ」「〜が〜する」でつなぐ。それぞれに何対何かを付ける。最後に属性を割り当てる。ここまでで多対多が残っていたら、間の表を必ず 1 つ足します。

属性の置き場所にも 1 つ決まりごとがあります。他の属性から計算できるものは持たない、というものです。生年月日があれば年齢は出せるので、年齢の列は作りません。作ってしまうと、誕生日が来るたびに書き換える仕事が発生します。

最初から完璧を目指すと図が迷宮になります。粗く書いて、実装しながら直すほうが早く終わります。ただし多対多だけは、後から気づくと表が 1 つ増え、そこに載る列も、それを使う画面も全部やり直しになります。ここだけは先に確かめておきます。

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

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

  • テーブルDB の表 (Excel のシートみたいなもの)
  • 設計何をどう作るかを決める前工程
  • エンティティDB の 1 行 = アプリの 1 オブジェクト
  • 属性インスタンス属性=各インスタンス固有の値(self.name)。
  • 多対多双方が複数紐づく関係。中間テーブルで表現
生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/27·更新 2026/08/26

関連レッスン

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

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

  • 正規化とは何か

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

  • インデックスの役割

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

  • トランザクションとは

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

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

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