SQLとNoSQLの違い - データベース選択の指針

15分 で読める | 2025.12.07

データベースの種類

データベースは大きく分けて、SQL(リレーショナル)とNoSQL(非リレーショナル)の2種類があります。どちらが優れているというわけではなく、用途に応じた選択が重要です。

SQL(リレーショナルデータベース)

特徴

  • テーブル(行と列)でデータを格納
  • スキーマ(データ構造)を事前に定義
  • SQLによる標準化されたクエリ言語
  • ACID特性によるトランザクション保証
-- テーブル定義
CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  name VARCHAR(100) NOT NULL,
  email VARCHAR(255) UNIQUE NOT NULL,
  created_at TIMESTAMP DEFAULT NOW()
);

CREATE TABLE orders (
  id SERIAL PRIMARY KEY,
  user_id INTEGER REFERENCES users(id),
  total DECIMAL(10, 2),
  status VARCHAR(20)
);

-- リレーションを使ったクエリ
SELECT u.name, o.total
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE o.status = 'completed';

ACID特性

特性説明
Atomicity(原子性)トランザクションは全て成功か全て失敗
Consistency(一貫性)データは常に整合性のとれた状態
Isolation(独立性)トランザクション間は互いに影響しない
Durability(永続性)コミットされたデータは失われない

代表的なデータベース

データベース特徴
PostgreSQL高機能、拡張性が高い
MySQL広く普及、Web開発で人気
SQLite軽量、組み込み用途
Oracleエンタープライズ向け

NoSQL

種類と特徴

1. ドキュメント型

JSONライクなドキュメントでデータを格納します。

// MongoDB の例
{
  "_id": "user_123",
  "name": "Alice",
  "email": "alice@example.com",
  "orders": [
    { "id": "ord_1", "total": 5000, "items": [...] },
    { "id": "ord_2", "total": 3000, "items": [...] }
  ],
  "preferences": {
    "theme": "dark",
    "language": "ja"
  }
}

代表例: MongoDB, CouchDB, Firestore

2. キーバリュー型

シンプルなキーと値のペアでデータを格納します。

user:123:name → "Alice"
user:123:email → "alice@example.com"
session:abc123 → { "userId": 123, "expires": "..." }

代表例: Redis, Amazon DynamoDB, etcd

3. カラム指向型

行ではなく列単位でデータを格納します。大量データの集計に適しています。

flowchart TB
    subgraph RowBased["行ベース格納"]
        R1["user_1 | Alice | alice@ex.com"]
        R2["user_2 | Bob | bob@ex.com"]
    end

    subgraph ColumnBased["列単位で格納"]
        C1["name → Alice, Bob, ..."]
        C2["email → alice@ex.com, bob@ex.com, ..."]
    end

    RowBased --> ColumnBased

代表例: Apache Cassandra, HBase, ClickHouse

4. グラフ型

ノードとエッジの関係でデータを格納します。

(Alice)--[FOLLOWS]-->(Bob)
(Alice)--[LIKES]-->(Post1)
(Bob)--[WROTE]-->(Post1)

代表例: Neo4j, Amazon Neptune, ArangoDB

CAP定理

分散システムでは、以下の3つの特性のうち2つまでしか同時に満たせないという定理です。

flowchart TB
    subgraph CAP["CAP定理"]
        C["Consistency<br/>(一貫性)"]
        A["Availability<br/>(可用性)"]
        P["Partition Tolerance<br/>(分断耐性)"]

        CP["CP: MongoDB, Redis Cluster"]
        AP["AP: Cassandra, CouchDB"]
        CA["CA: 単一ノードRDBMS"]

        C --- CP
        P --- CP
        A --- AP
        P --- AP
        C --- CA
        A --- CA
    end
特性説明
Consistencyすべてのノードが同じデータを返す
Availabilityリクエストは必ずレスポンスを返す
Partition Toleranceネットワーク分断時も動作を継続

分類例

  • CP: MongoDB, Redis Cluster
  • AP: Cassandra, CouchDB
  • CA: 単一ノードのRDBMS(分散環境では実現困難)

比較表

観点SQLNoSQL
スキーマ厳密(事前定義)柔軟(スキーマレス)
スケーリング垂直(スケールアップ)水平(スケールアウト)
クエリ複雑なJOINが得意シンプルなクエリが得意
整合性強い整合性結果整合性が多い
トランザクション複雑なトランザクション対応限定的なトランザクション

ユースケース別の選択

SQLが適しているケース

✓ 複雑な関係を持つデータ(EC、CRM)
✓ 強いデータ整合性が必要(金融、在庫管理)
✓ 複雑なクエリ・集計が多い
✓ スキーマが安定している

NoSQLが適しているケース

✓ 大量の読み書きが必要(SNS、IoT)
✓ スキーマが頻繁に変わる
✓ 水平スケーリングが必要
✓ 地理的に分散したデータ

具体例

ユースケース推奨
ECサイトの注文管理PostgreSQL, MySQL
ユーザーセッション管理Redis
SNSのタイムラインCassandra, MongoDB
リアルタイム分析ClickHouse
レコメンデーションNeo4j
CMS、ブログMongoDB
IoTセンサーデータTimescaleDB, InfluxDB

ポリグロット永続化

1つのアプリケーションで複数のデータベースを使い分けるアプローチです。

flowchart LR
    App["ECアプリケーション"]
    App --> PG["PostgreSQL<br/>商品、注文、顧客"]
    App --> Redis["Redis<br/>セッション、キャッシュ"]
    App --> ES["Elasticsearch<br/>商品検索"]
    App --> Mongo["MongoDB<br/>商品レビュー、コンテンツ"]

まとめ

データベースの選択は、データの特性、スケーラビリティ要件、整合性要件に基づいて行います。SQLとNoSQLはトレードオフの関係にあり、どちらが優れているということはありません。適材適所で使い分け、必要に応じて複数のデータベースを組み合わせることで、最適なアーキテクチャを実現できます。

← 一覧に戻る