NoSQL
RDB 以外の DB の総称。「Not Only SQL」。Document / Key-Value / Column / Graph / Time Series / Vector など、 用途特化のデータベース群。
NoSQL が生まれた背景
- 2000 年代後半、Web の急成長で水平スケールが必要に
- RDB の固定スキーマ + JOINは分散と相性が悪い
- 大規模 SNS / EC が独自に DB を作った(Google BigTable / Amazon Dynamo / Facebook Cassandra)
- 「用途別に DB を選ぶ」流派の登場
CAP 定理
分散 DB は次の 3 つのうち2 つしか同時に保証できない:
- Consistency(一貫性)— どのノードも同じデータを返す
- Availability(可用性)— ノード障害時も応答する
- Partition tolerance(分断耐性)— ネットワーク分断でも動く
実用ではネット分断は不可避なので「CP か AP か」の選択になる。
BASE
ACID の対極にある NoSQL の哲学:
- Basically Available — 基本的に動く
- Soft state — 状態は変わりうる
- Eventual consistency — 最終的に整合する
分類別の代表例
1. Document DB
- MongoDB — 最有名、JSON 風 (BSON) ドキュメント
- Firestore — Firebase の 1 つ、リアルタイム同期
- Couchbase
- Amazon DocumentDB
用途
- スキーマがゆるい / 進化する
- 階層が深い JSON データ
- カタログ / プロフィール / コンテンツ管理
例(MongoDB)
db.users.insertOne({
email: "alice@ex.com",
profile: {
name: "Alice",
address: { city: "Tokyo", zip: "100-0001" },
tags: ["js", "react"]
}
})
db.users.find({ "profile.tags": "js" })
2. Key-Value
- Redis — 超高速、in-memory、データ構造豊富
- Memcached — シンプルなキャッシュ
- DynamoDB — フルマネージド、リクエスト課金
- Cloudflare KV / Workers KV — エッジで動く
- Vercel KV / Upstash — Serverless Redis
用途
- セッション / キャッシュ
- レート制限
- リーダーボード
- Pub/Sub(Redis)
- カウンタ / カウントダウン
Redis の代表的なデータ構造
- String: 普通のキー値 + TTL
- List: 双方向キュー (LPUSH / RPOP)
- Hash: フィールド付き
- Set / Sorted Set: ランキング
- Stream: イベント追加 / 消費
- Geo: 緯度経度
- Bitmap / HyperLogLog: ユーザ数ざっくり集計
SET session:abc123 "{userId: 42}" EX 3600
INCR counter:visits
ZADD leaderboard 100 alice 80 bob
ZREVRANGE leaderboard 0 9 WITHSCORES # トップ 10
3. Column-Family / Wide-Column
- Apache Cassandra — 水平スケールの定番
- ScyllaDB — Cassandra の Rust/C++ 高速版
- HBase — Hadoop エコシステム
- BigTable — Google マネージド
用途
- 超巨大トラフィック(Twitter / Discord などの級)
- 書き込みが極端に多い
- 時系列ログ
4. Graph DB
- Neo4j — 最有名、Cypher 言語
- DGraph
- ArangoDB(マルチモデル)
用途
- SNS のフレンド関係
- レコメンド(似た嗜好の人)
- 経路探索 / 知識グラフ
- 不正検知(マネロンの流れ)
例(Cypher)
MATCH (u:User {name: "Alice"})-[:FOLLOWS]->(f)-[:FOLLOWS]->(fof)
WHERE NOT (u)-[:FOLLOWS]->(fof) AND fof <> u
RETURN fof.name, count(*) AS mutual
ORDER BY mutual DESC LIMIT 10
5. Time Series
- InfluxDB — 時系列特化
- TimescaleDB — Postgres 拡張で時系列対応
- Prometheus — メトリクス(短期)
- QuestDB
用途
- サーバメトリクス / 監視
- IoT センサーデータ
- 金融時系列
- イベントストリーム
6. Vector DB
- pgvector — Postgres 拡張、最も普及
- Pinecone — マネージド SaaS
- Qdrant — Rust 製、OSS
- Weaviate
- Chroma
- Cloudflare Vectorize
- Turbopuffer
用途
- 埋め込みベクトル検索
- RAG(→ AI Agent: RAG)
- 類似画像 / レコメンド
7. Search Engine
- Elasticsearch / OpenSearch — 老舗
- Meilisearch — 軽量・速い
- Typesense — シンプル
- Algolia — SaaS
用途
- 全文検索(曖昧 / 複数言語)
- ファセット検索(フィルタ)
- サジェスト / オートコンプリート
- ログ検索(Elastic Stack)
8. Object Storage(番外)
- S3 / R2 / GCS / Azure Blob
- 画像・動画・PDF などの巨大バイナリ
- 「DB に Blob を入れない」原則
9. Multi-Model
- FaunaDB — グローバル分散
- SurrealDB — Document + Graph + KV
- ArangoDB — Document + Graph
- EdgeDB / Gel — グラフ風 RDB
NoSQL の代表的トレードオフ
| 項目 | RDB | NoSQL |
|---|---|---|
| スキーマ | 固定 | 柔軟(型崩れリスク) |
| 結合 | SQL の JOIN で柔軟 | 原則無し(事前に埋め込む) |
| トランザクション | 強い | 限定的(分散だと特に) |
| スケール | 垂直 + シャーディング | 水平に強い |
| 整合性 | 強整合 | 結果整合(多くは) |
| クエリ | SQL 標準 | 独自 API / 言語 |
「NoSQL を選ぶ前に」考えること
- 本当にスキーマレスが必要か(JSONB で済まないか)
- 水平スケール無しでRDB の Read Replica で済まないか
- 結合が要らない設計に本当にできるか
- トランザクションを諦めても良いか
多くのプロダクトはPostgres + Redisの 2 つで足りる。
典型的な組み合わせ
- Postgres + Redis: 一般的 SaaS
- Postgres + Elasticsearch: 全文検索が肝
- Postgres + S3: ファイルあり
- Postgres + pgvector + Redis: AI / RAG
- DynamoDB + S3: AWS Serverless
- MongoDB + Redis: スキーマレス + キャッシュ
- Postgres + ClickHouse: トランザクション + 分析
分散 SQL DB(NewSQL)
SQL を保ったまま水平スケールを目指す系統。NoSQL の弱点とされた領域に RDB が戻ってきた。
- CockroachDB — Postgres 互換、強整合 + 水平スケール
- TiDB — MySQL 互換、HTAP
- Spanner — Google、グローバル一貫性
- YugabyteDB
- Citus — Postgres 拡張で分散
失敗しやすいパターン
| 症状 | 原因 |
|---|---|
| MongoDB で JOIN ができない | そもそも結合前提では使わない |
| Redis でデータが消えた | 永続化設定 / メモリ枯渇 / TTL |
| DynamoDB で巨額請求 | キーレイアウト誤り、フルスキャン |
| Cassandra で速度出ない | パーティションキー設計ミス |
| Elasticsearch で OOM | クエリ + ヒープ設計、shard 数 |
原則
「Postgres でできることは Postgres でやる」を出発点に。 それでも辛くなったら用途別の NoSQLを 1 つだけ追加する。 複数の NoSQL を並走させる時点で運用コストが跳ね上がる。