リレーショナルデータベース(RDB)の根幹となる「テーブル・主キー・外部キー・リレーション」を一つずつ確認します。
リレーショナルデータベース(RDB)は、データを表(テーブル)の集まりで管理するデータベースです。テーブル同士を「キー」で関連付けることでデータの構造化を実現します。
身近な例えだと、「Excel のシートを複数並べた状態」に近いです。ただし RDB には Excel にない強力な機能があります:
・制約:主キーの一意性などをデータベース側が自動チェック
・SQL:複雑な検索・集計を1行のコマンドで
・トランザクション:失敗時の整合性保証
代表的な RDBMS:Oracle / MySQL / PostgreSQL / SQL Server / SQLite。Web サービス、業務システム、家計簿アプリまで、構造化されたデータを扱うあらゆる場面で使われています。
テーブルは縦横の表で、「行」と「列」から成ります。それぞれ専門用語が複数あって混乱しやすいので整理しましょう。
・行(Row) = レコード = タプル:1 件のデータ
・列(Column) = フィールド = 属性:1 つのデータ項目(名前、年齢など)
・セル:行と列の交点。1 つの値
・スキーマ:テーブルの構造定義(どの列があり、何型か)
「タプル=行」「属性=列」のような用語対応は混同しやすいので、英語・日本語・別名(タプル/属性)の3パターンを整理して覚えておきましょう。
主キーは、テーブル内の各行を一意に識別する列です。学生 ID、注文番号、社員番号などが典型的な主キー。
主キーの 2 つの制約:
・一意性制約:同じ値が 2 つ存在してはいけない
・NOT NULL 制約:必ず値が入っていなければならない
この 2 つをデータベース自身が自動チェックしてくれるのが RDB の強み。アプリ側がうっかり同じ ID で 2 件登録しようとしても、DB が「重複してます」とエラーで弾いてくれます。上のツール「主キー」シナリオのステップ 3 でこの制約違反の例を確認できます。
主キーが複数列の組み合わせの場合は複合主キーと呼びます(例:履修テーブルの「学生 ID + 科目 ID」)。
外部キーは、他のテーブルの主キーを参照する列です。これにより 2 つのテーブルが関連付けられます。
たとえば「成績テーブル」に「学生 ID」列を作って「学生テーブル」の主キーを指せば、各成績がどの学生のものか分かります。学生の名前を成績テーブルにコピーする必要がないので、データが冗長になりません。
外部キーには参照整合性制約という重要な性質があります:
・存在しない学生 ID を成績テーブルに書くと、DB が拒否
・成績が紐付いている学生を削除しようとすると、DB が拒否(または成績ごと連鎖削除)
これによって「存在しない人の成績」のようなデータの矛盾を構造的に防ぐことができます。上のツール「外部キー」シナリオで矢印が学生テーブルへ向かう様子を確認できます。
| 多重度 | 意味 | 例 |
|---|---|---|
| 1:1 | 1 件に対して 1 件だけ | ユーザーとプロフィール、社員と社員カード |
| 1:N | 1 件が複数件と関連 | 顧客と注文、学生と成績、ユーザーと投稿 |
| M:N | 双方向で複数件と関連(中間テーブルで分解) | 学生と科目(履修)、商品とタグ |
テーブル同士の関係を多重度(カーディナリティ)と呼びます。1:N が最も一般的で、世の中の大半の関係はこれ。
M:N の関係は直接表現できないので、「履修テーブル」のような中間テーブルを作って 1:N + 1:N に分解します。
| 項目 | RDB | NoSQL |
|---|---|---|
| データモデル | テーブル(行×列) | 柔軟(ドキュメント、KV、グラフ等) |
| スキーマ | 事前に厳密に定義 | スキーマレスまたは柔軟 |
| 一貫性 | ACID(強い) | BASE / 結果整合性 |
| スケーリング | 主にスケールアップ | スケールアウト得意 |
| 言語 | SQL | 製品ごとに異なる |
| 代表製品 | PostgreSQL, MySQL, Oracle | MongoDB, Redis, DynamoDB |
RDB の対抗として登場したのがNoSQL(Not Only SQL)です。データ構造の柔軟性と分散環境での性能を重視する設計で、Web の大規模サービスで広く使われています。
使い分けの目安:
・RDB が向く:データ構造が安定、整合性最優先(銀行、業務システム)
・NoSQL が向く:データ構造が変わりやすい、巨大な読み書き量(SNS、ログ収集、キャッシュ)
両者を対比すると、「RDB は行と列、NoSQL はキー・バリューやドキュメント形式」「RDB は ACID、NoSQL は結果整合性」という違いが要点です。