ストーリー
「ユーザーのセッション情報をRDBに入れてるのか? 毎秒数千回のRead/Writeでデッドロックが頻発するのは当然だ」
高橋アーキテクトが状況を見て言う。
「すべてのデータをRDBに入れる必要はない。NoSQLはRDBの代替ではなく、補完だ。データの特性に合わせてストレージを選ぶ。それがポリグロットパーシステンスだよ」
NoSQLとは
NoSQL(Not Only SQL)は、RDB以外のデータストアの総称。スキーマレス、水平スケーラビリティ、特定のデータモデルへの最適化が特徴。
4つの主要カテゴリ
NoSQL
├── Key-Value Store(KVS)
├── Document Store
├── Column-Family Store
└── Graph Database
Key-Value Store(KVS)
キーと値のペアで格納。最もシンプルで高速。
Key: "session:abc123" → Value: {"userId": 1, "cart": [...]}
Key: "cache:user:1" → Value: {"name": "田中", "email": "..."}
代表的なKVS
| プロダクト | 特徴 | 用途 |
|---|---|---|
| Redis | インメモリ、データ構造豊富 | キャッシュ、セッション、キュー |
| Memcached | インメモリ、シンプル | 純粋なキャッシュ |
| DynamoDB | マネージド、スケーラブル | サーバーレスアプリ |
TypeScript での使用例
import Redis from 'ioredis';
const redis = new Redis();
// セッション管理
await redis.set('session:abc123', JSON.stringify({
userId: 1,
loginAt: new Date().toISOString(),
}), 'EX', 3600); // 1時間で期限切れ
const session = JSON.parse(await redis.get('session:abc123') ?? '{}');
Document Store
JSONライクなドキュメントで格納。柔軟なスキーマ、ネストした構造を自然に表現。
{
"_id": "user_001",
"name": "田中太郎",
"addresses": [
{ "type": "home", "city": "東京", "zip": "100-0001" },
{ "type": "work", "city": "横浜", "zip": "220-0001" }
],
"preferences": {
"language": "ja",
"notifications": true
}
}
代表的なDocument Store
| プロダクト | 特徴 | 用途 |
|---|---|---|
| MongoDB | 最も普及、豊富なクエリ | 汎用アプリ、CMS |
| Firestore | リアルタイム同期 | モバイルアプリ |
| CouchDB | オフライン同期 | 分散環境 |
Column-Family Store
列指向でデータを格納。大量データの集計・分析に最適。
Row Key: "user_001"
Column Family: "profile"
name: "田中太郎"
email: "tanaka@example.com"
Column Family: "activity"
last_login: "2024-03-15"
login_count: 142
代表的なColumn-Family Store
| プロダクト | 特徴 | 用途 |
|---|---|---|
| Cassandra | 高可用性、線形スケール | IoT、時系列データ |
| HBase | Hadoop連携 | 大規模分析 |
| ScyllaDB | Cassandra互換、高性能 | リアルタイム分析 |
Graph Database
ノード(頂点)とエッジ(辺)でデータを格納。関係性の探索に特化。
(田中)--[FOLLOWS]-->(佐藤)
(田中)--[LIKES]-->(記事A)
(佐藤)--[WROTE]-->(記事A)
代表的なGraph Database
| プロダクト | 特徴 | 用途 |
|---|---|---|
| Neo4j | 最も普及、Cypher言語 | ソーシャルグラフ、推薦 |
| Amazon Neptune | マネージド | ナレッジグラフ |
| ArangoDB | マルチモデル | 柔軟なグラフ処理 |
データ特性による選択ガイド
| データ特性 | 推奨ストア | 理由 |
|---|---|---|
| 構造化データ、複雑なJOIN | RDB | ACID、制約、SQL |
| セッション、キャッシュ | KVS(Redis) | 高速Read/Write、TTL |
| 柔軟なスキーマ、ネスト構造 | Document(MongoDB) | スキーマレス |
| 大量の時系列データ | Column-Family | 書き込み性能、集計 |
| 関係性の探索 | Graph(Neo4j) | 多段の関連トラバーサル |
ポリグロットパーシステンス
1つのシステムで複数のデータストアを組み合わせる設計思想。
ECサイトの例:
├── 商品カタログ → MongoDB(柔軟な属性)
├── 注文・決済 → PostgreSQL(トランザクション)
├── セッション・カート → Redis(高速アクセス)
├── 商品推薦 → Neo4j(関係性の探索)
├── アクセスログ → Cassandra(大量書き込み)
└── 全文検索 → Elasticsearch(検索エンジン)
まとめ
| カテゴリ | データモデル | 強み | 代表例 |
|---|---|---|---|
| KVS | キー-値 | 超高速、シンプル | Redis |
| Document | JSON文書 | 柔軟なスキーマ | MongoDB |
| Column-Family | 列指向 | 大量データ集計 | Cassandra |
| Graph | ノード-エッジ | 関係性の探索 | Neo4j |
理解度チェックリスト
- NoSQLの4カテゴリをそれぞれ説明できる
- データ特性に応じた適切なストアを選択できる
- ポリグロットパーシステンスの概念を理解している
次のステップ
次のレッスンでは、Document Storeの代表格MongoDBのデータモデリングを深く学ぶ。RDBとは異なるモデリング手法を身につけよう。
推定読了時間: 25分