コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB
RDB と NoSQL の違い
RDB と NoSQL の違い
このレッスンで分かること
- RDB と NoSQL の設計思想の根本的な違い
- NoSQL の 4 系統(KVS / ドキュメント / カラム指向 / グラフ)
- 自分のプロダクトでどちらを選ぶべきかの判断軸
RDB と NoSQL の違い とは
リレーショナルと非リレーショナルの設計思想・適用領域を比較する。本レッスンでは、RDB と NoSQL の違い の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。
RDB の世界観
RDB (Relational Database) は、データを 行と列の表 に分解して保存します。1976 年に E.F.Codd が提唱したリレーショナルモデルがベースで、MySQL、PostgreSQL、Oracle、SQL Server、TiDB などが代表格です。
中心となる発想は 正規化 です。ユーザーと注文を別テーブルに分け、FOREIGN KEY で結びつけます。データは一箇所にしか存在せず、変更は一箇所で済みます。検索時は JOIN で再結合します。整合性を最優先にした設計です。
NoSQL の世界観
NoSQL (Not Only SQL) は、RDB の制約を外して特定用途に最適化した DB の総称です。「JOIN しない代わりに高速」「スキーマレスで柔軟」「水平分散しやすい」といった特性を持ちます。
- KVS (Key-Value Store) — キーと値の単純なペア。
O(1)でアクセスでき、キャッシュやセッション管理に最適。 - ドキュメント型 —
JSON文書を 1 つの単位で保存。スキーマが柔軟で、ネストした構造をそのまま入れられる。 - カラム指向 — 行キーとカラムファミリーでデータを管理し、大量の書き込みと広い行への高速アクセスに強い。
Cassandra、HBaseなど。 - グラフ型 — ノードとエッジで関係を表現。SNS の友達関係や経路探索に向く。
比較表
| 観点 | RDB | NoSQL |
|---|---|---|
| データモデル | 行と列の表 | KVS / 文書 / カラム / グラフ |
| スキーマ | 厳格 | 柔軟(型もテーブルもなし) |
| JOIN | 得意 | 苦手(アプリ側で結合) |
| トランザクション | ACID | BASE が多い |
| 水平分散 | 難しい | 標準で対応 |
| 整合性 | 強い | 結果整合性が多い |
| 用途 | 業務系・会計 | キャッシュ・ログ・解析 |
具体例
ECサイトの注文を考えます。RDB なら次のようになります。
SQL クエリ
CREATE TABLE users (id INT PRIMARY KEY, name VARCHAR(50));
CREATE TABLE orders (
id INT PRIMARY KEY,
user_id INT REFERENCES users(id),
amount DECIMAL(10,2)
);
SELECT u.name, SUM(o.amount) FROM users u JOIN orders o ON o.user_id=u.id GROUP BY u.id;同じことを MongoDB のドキュメント型でやるとこうなります。
JavaScript
db.users.insertOne({
_id: 1, name: "Alice",
orders: [{ id: 10, amount: 5000 }, { id: 11, amount: 3000 }]
});
db.users.findOne({ _id: 1 }).orders.reduce((s, o) => s + o.amount, 0);RDB は 正規化 されたデータを JOIN で集約し、NoSQL は 埋め込み で取得を高速化します。
トレードオフ
NoSQL は速くてスケールしやすい反面、JOIN がなく、複雑な集計は弱いです。RDB は整合性と表現力が強い代わりに、水平分散が難しい。実務では「99% は RDB で十分」というのが定説です。NoSQL は「キャッシュ層」「ログ蓄積」「巨大な KVS が必要」など、明確な要件があるときだけ選びます。
「とりあえず MongoDB」で始めて、後から JOIN したくなって大幅リファクタする失敗パターンは非常に多い。
よくある誤解
- NoSQL は速い — そうとも限らない。インデックスが効かない検索は遅い。
- NoSQL はスキーマレス — 物理スキーマがないだけで、アプリ側に暗黙のスキーマが必ずある。
- NoSQL は ACID 非対応 —
MongoDB4.0 以降、複数ドキュメントトランザクションが使える。
やってみよう
MongoDBをインストールし、ユーザーとその注文を 1 ドキュメントに埋め込む形で保存する- 同じデータを
PostgreSQLで 2 テーブルに分けて保存し、JOINで取り出す - 「ユーザー名を変更する」操作が、どちらでどう違うか観察する
よくある質問
Q. RDB と NoSQL はどう使い分けますか?
A. 厳密な整合性と複雑な JOIN が必要なら RDB、スケーラビリティと柔軟なスキーマが必要なら NoSQL です。トランザクション処理(金融・予約)は RDB、ログ・SNS・タイムラインは NoSQL が向きます。MySQL/PostgreSQL は OLTP、MongoDB/DynamoDB は Web スケールの定番です。
Q. NoSQL のデメリットは?
A. JOIN が苦手で集計クエリも書きにくく、強整合性が保証されないことが多いです。データモデリングをアプリ側で工夫する必要があり、トランザクションの境界も自分で設計する必要があります。SQL の方が楽な場面が多いという認識は持っておきましょう。
Q. DB 選定で押さえるべき観点は?
A. 読み書き比率、整合性要件、データ量、レイテンシ要件、運用コスト、エンジニアの習熟度を見ます。多くのスタートアップは PostgreSQL から始めて、必要に応じて Redis / Elasticsearch を組み合わせる構成に落ち着きます。
次のレッスン
次は データベースの歴史 で、リレーショナルと非リレーショナルの設計思想・適用領域を比較する を学びます。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- RDB と NoSQL の違い の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. RDB と NoSQL の違い とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン