サイトアイコンmaita tomoya dev io

データベース比較

comparison

データベース比較(PostgreSQL vs MySQL vs MongoDB vs DynamoDB vs Redis)

はじめに

データベースはアプリケーションの基盤であり、その選択はシステムのパフォーマンス、スケーラビリティ、開発体験に大きく影響する。本ページでは、RDB(PostgreSQL, MySQL)ドキュメントDB(MongoDB)マネージドNoSQL(DynamoDB)インメモリKVS(Redis) の5つを比較する。

データベースの分類

graph TB DB[データベース] --> RDB[リレーショナルDB<br/>RDB] DB --> NoSQL[NoSQL] RDB --> PG[PostgreSQL] RDB --> MY[MySQL] NoSQL --> Document[ドキュメントDB] NoSQL --> KVS[キーバリューストア] NoSQL --> WideColumn[ワイドカラム] NoSQL --> Graph[グラフDB] Document --> Mongo[MongoDB] KVS --> Redis_node[Redis] KVS --> Dynamo[DynamoDB] WideColumn --> Cassandra[Cassandra] Graph --> Neo4j[Neo4j]

各データベースの誕生背景

DB登場年開発元誕生の背景
PostgreSQL1996年PostgreSQL Global Dev GroupIngresプロジェクトの後継。学術的に正しいRDBの実現
MySQL1995年MySQL AB → Oracle高速で手軽なRDB。Web開発のデファクト
MongoDB2009年MongoDB Inc.スキーマレスで柔軟なドキュメント指向DB。アジャイル開発向け
DynamoDB2012年AWSAmazon社内のDynamoペーパーに基づくフルマネージドNoSQL
Redis2009年Salvatore Sanfilippo超高速インメモリデータストア。キャッシュ・セッション管理

RDB vs NoSQL

基本概念

項目RDB (PostgreSQL / MySQL)NoSQL (MongoDB / DynamoDB / Redis)
データモデルテーブル(行と列)ドキュメント / キーバリュー / グラフ 等
スキーマ固定(事前定義が必要)柔軟(スキーマレス or スキーマオンリード)
クエリ言語SQL独自API / クエリ言語
トランザクションACID完全サポート製品により異なる(BASEモデルが多い)
スケーリング垂直スケーリングが基本水平スケーリングが得意
結合(JOIN)得意苦手(非推奨のことが多い)

ACID vs BASE

特性ACID(RDB)BASE(NoSQL)
AAtomicity(原子性)Basically Available(基本的に利用可能)
CConsistency(一貫性)Soft state(柔軟な状態)
IIsolation(分離性)Eventual consistency(結果整合性)
DDurability(永続性)

CAP定理

分散システムにおいて、以下の3つのうち同時に2つまでしか保証できないという定理。

graph TB subgraph CAP定理 C[Consistency<br/>一貫性<br/>全ノードが同じデータを返す] A[Availability<br/>可用性<br/>常に応答を返す] P[Partition Tolerance<br/>分断耐性<br/>ネットワーク分断でも動作] end C --- CA[CA<br/>単一ノードRDB<br/>PostgreSQL / MySQL<br/>分断耐性なし] C --- CP[CP<br/>MongoDB<br/>分断時に一部利用不可] A --- CA A --- AP[AP<br/>DynamoDB / Cassandra<br/>結果整合性を許容] P --- CP P --- AP

実際にはネットワーク分断は不可避なため、CP か AP の選択となることが多い。

各データベースの詳細

PostgreSQL

「世界で最も先進的なオープンソースRDB」

-- PostgreSQLの特徴的な機能
-- JSONB型:RDB内でNoSQL的なデータ保持
CREATE TABLE products (
  id SERIAL PRIMARY KEY,
  name VARCHAR(100),
  attributes JSONB  -- 柔軟な属性をJSONで保持
);

-- JSONB検索
SELECT * FROM products
WHERE attributes->>'color' = 'red';

-- 全文検索
SELECT * FROM products
WHERE to_tsvector('japanese', name) @@ to_tsquery('japanese', 'スマホ');
項目内容
強み高度なSQL準拠、JSONB、全文検索、拡張性(PostGIS等)、MVCC
弱みMySQL比で設定が複雑、レプリケーション設定がやや煩雑
最大データ量理論上無制限(テーブル32TB)
マネージドサービスAmazon RDS / Aurora、Google Cloud SQL、Supabase

MySQL

「世界で最も普及しているオープンソースRDB」

-- MySQLの特徴
-- InnoDBストレージエンジン(デフォルト)
CREATE TABLE users (
  id BIGINT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(100) NOT NULL,
  email VARCHAR(255) UNIQUE,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;
項目内容
強み高速な読み取り、シンプルな設定、豊富な情報、レプリケーション容易
弱みPostgreSQL比でSQL準拠度が低い、JSONB相当機能が弱い
最大データ量InnoDB: 64TB
マネージドサービスAmazon RDS / Aurora MySQL、Google Cloud SQL、PlanetScale

MongoDB

「最も人気のあるドキュメント指向NoSQL」

// MongoDBのドキュメント
db.users.insertOne({
  name: "田中太郎",
  email: "tanaka@example.com",
  address: {
    city: "東京",
    zip: "100-0001"
  },
  tags: ["developer", "nodejs"],
  createdAt: new Date()
});

// 柔軟なクエリ
db.users.find({
  "address.city": "東京",
  tags: { $in: ["developer"] }
});

// Aggregation Pipeline
db.orders.aggregate([
  { $match: { status: "completed" } },
  { $group: { _id: "$userId", total: { $sum: "$amount" } } },
  { $sort: { total: -1 } }
]);
項目内容
強みスキーマレス、水平スケーリング、Aggregation Pipeline、柔軟なデータモデル
弱みJOINが苦手($lookup)、トランザクションサポートが限定的、メモリ消費大
最大データ量ドキュメント16MB、コレクション無制限
マネージドサービスMongoDB Atlas、Amazon DocumentDB

DynamoDB

「AWSのフルマネージド NoSQL」

# DynamoDB操作例(boto3)
import boto3

dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('Users')

# 書き込み
table.put_item(Item={
    'userId': 'user-123',
    'name': '田中太郎',
    'email': 'tanaka@example.com'
})

# 読み取り(キー指定)
response = table.get_item(Key={'userId': 'user-123'})

# クエリ(GSI使用)
response = table.query(
    IndexName='email-index',
    KeyConditionExpression=Key('email').eq('tanaka@example.com')
)
項目内容
強みフルマネージド、自動スケーリング、単桁ミリ秒レイテンシ、サーバーレス連携
弱みクエリの柔軟性が低い、アクセスパターン事前設計必須、コスト予測困難
料金モデルオンデマンド or プロビジョンドキャパシティ
統合サービスLambda, API Gateway, AppSync との統合が容易

Redis

「世界で最も速いインメモリデータストア」

# Redis操作例
# 文字列
SET user:123:name "田中太郎"
GET user:123:name

# ハッシュ
HSET user:123 name "田中太郎" email "tanaka@example.com"
HGETALL user:123

# ソート済みセット(ランキング)
ZADD leaderboard 100 "user:123"
ZADD leaderboard 200 "user:456"
ZREVRANGE leaderboard 0 9 WITHSCORES

# Pub/Sub
PUBLISH chat:room1 "Hello!"

# TTL(有効期限)
SET session:abc123 "user-data" EX 3600  # 1時間で自動削除
項目内容
強み超低レイテンシ(サブミリ秒)、豊富なデータ構造、Pub/Sub、Lua スクリプト
弱みメモリ制約、永続化に注意が必要、複雑なクエリ不可
主な用途キャッシュ、セッション管理、ランキング、リアルタイムカウンター、メッセージキュー
マネージドサービスAmazon ElastiCache、Redis Cloud、Upstash

総合比較表

項目PostgreSQLMySQLMongoDBDynamoDBRedis
カテゴリRDBRDBドキュメントDBKVS/ドキュメントインメモリKVS
データモデルテーブルテーブルドキュメント(JSON)KV/ドキュメントKV/複合データ構造
スキーマ固定固定柔軟柔軟スキーマなし
トランザクション完全ACID完全ACIDマルチドキュメント対応制限あり制限あり
スケーリング垂直+論理レプリカ垂直+レプリカ水平シャーディング自動水平クラスタリング
レイテンシミリ秒ミリ秒ミリ秒単桁ミリ秒サブミリ秒
学習コスト低〜中
運用コスト低〜中低(マネージド)低〜中
ライセンスPostgreSQL LicenseGPL v2SSPLプロプライエタリBSD/SSPL

ユースケース別の推奨

ユースケース推奨DB理由
一般的なWebアプリPostgreSQL / MySQLACID、SQL、実績豊富
コンテンツ管理(CMS)MongoDB / PostgreSQL柔軟なスキーマ or JSONB
ECサイトPostgreSQL複雑なクエリ、トランザクション
IoTデータ収集DynamoDB大量書き込み、自動スケーリング
セッション/キャッシュRedisサブミリ秒のレイテンシ
リアルタイムランキングRedisソート済みセット
サーバーレスアプリDynamoDBLambda統合、マネージド
地理空間データPostgreSQL (PostGIS)高度なGIS機能
ログ分析MongoDB / Elasticsearchスキーマレス、集約処理

選定フローチャート

flowchart TD A[データベースを選ぶ] --> B{データの整合性が最重要?} B -->|はい| C{複雑なJOIN/集計が必要?} C -->|はい| D[PostgreSQL] C -->|シンプルなCRUD| E[MySQL] B -->|いいえ| F{サブミリ秒のレイテンシが必要?} F -->|はい| G[Redis<br/>キャッシュ/セッション] F -->|いいえ| H{AWSサーバーレス構成?} H -->|はい| I[DynamoDB] H -->|いいえ| J{スキーマが頻繁に変わる?} J -->|はい| K[MongoDB] J -->|いいえ| L[PostgreSQL]

組み合わせパターン

実際のシステムでは、複数のデータベースを組み合わせて使うことが一般的(Polyglot Persistence)。

パターン構成用途
RDB + RedisPostgreSQL + RedisメインDB + キャッシュ層
RDB + MongoDBPostgreSQL + MongoDBトランザクション + ログ/メタデータ
DynamoDB + RedisDynamoDB + ElastiCacheサーバーレス + ホットデータキャッシュ
RDB + ElasticsearchPostgreSQL + ESメインDB + 全文検索

マイグレーション時の注意点

  1. RDB → NoSQL: JOINをどう解決するか。データの非正規化が必要
  2. NoSQL → RDB: スキーマの設計。既存データの変換
  3. MySQL → PostgreSQL: データ型の違い、AUTO_INCREMENT → SERIAL/IDENTITY
  4. オンプレ → マネージド: 接続方式、バックアップ戦略、料金モデルの検討

まとめ

  • PostgreSQL: 最も汎用的。迷ったらPostgreSQL
  • MySQL: シンプルで高速。WordPress/LAMP構成の定番
  • MongoDB: スキーマが流動的なアプリケーションに最適
  • DynamoDB: AWSサーバーレス構成のベストパートナー
  • Redis: キャッシュ・セッション管理の第一選択肢

多くの場合、「メインDB(RDB) + キャッシュ(Redis)」の組み合わせが基本構成となる。

参考文献