NoSQL

RDB 以外の DB の総称。「Not Only SQL」。Document / Key-Value / Column / Graph / Time Series / Vector など、 用途特化のデータベース群。

NoSQL が生まれた背景

CAP 定理

分散 DB は次の 3 つのうち2 つしか同時に保証できない:

実用ではネット分断は不可避なので「CP か AP か」の選択になる。

BASE

ACID の対極にある NoSQL の哲学:

分類別の代表例

1. Document DB

用途

例(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 の代表的なデータ構造

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

用途

4. Graph DB

用途

例(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

用途

6. Vector DB

用途

7. Search Engine

用途

8. Object Storage(番外)

9. Multi-Model

NoSQL の代表的トレードオフ

項目RDBNoSQL
スキーマ固定柔軟(型崩れリスク)
結合SQL の JOIN で柔軟原則無し(事前に埋め込む)
トランザクション強い限定的(分散だと特に)
スケール垂直 + シャーディング水平に強い
整合性強整合結果整合(多くは)
クエリSQL 標準独自 API / 言語

「NoSQL を選ぶ前に」考えること

  1. 本当にスキーマレスが必要か(JSONB で済まないか)
  2. 水平スケール無しでRDB の Read Replica で済まないか
  3. 結合が要らない設計に本当にできる
  4. トランザクションを諦めても良いか

多くのプロダクトはPostgres + Redisの 2 つで足りる。

典型的な組み合わせ

分散 SQL DB(NewSQL)

SQL を保ったまま水平スケールを目指す系統。NoSQL の弱点とされた領域に RDB が戻ってきた

失敗しやすいパターン

症状原因
MongoDB で JOIN ができないそもそも結合前提では使わない
Redis でデータが消えた永続化設定 / メモリ枯渇 / TTL
DynamoDB で巨額請求キーレイアウト誤り、フルスキャン
Cassandra で速度出ないパーティションキー設計ミス
Elasticsearch で OOMクエリ + ヒープ設計、shard 数
原則

「Postgres でできることは Postgres でやる」を出発点に。 それでも辛くなったら用途別の NoSQLを 1 つだけ追加する。 複数の NoSQL を並走させる時点で運用コストが跳ね上がる。