NoSQL
リレーショナルモデル以外のデータベースの総称で、スケーラビリティと柔軟性を重視する
データベースアーキテクチャ
NoSQL とは
NoSQL (Not Only SQL) は、リレーショナルモデル (テーブル + SQL) 以外のデータベースの総称で、水平スケーラビリティ、柔軟なスキーマ、高スループットを重視する。DynamoDB、MongoDB、Redis、Cassandra が代表例。
NoSQL の種類
| 種類 | データモデル | AWS サービス | 用途 |
|---|---|---|---|
| キーバリュー | キー → 値 | DynamoDB | セッション、キャッシュ |
| ドキュメント | JSON ドキュメント | DocumentDB | CMS、カタログ |
| カラムファミリー | 列指向 | Keyspaces (Cassandra) | 時系列、ログ |
| グラフ | ノード + エッジ | Neptune | SNS、不正検知 |
RDB vs NoSQL
| 観点 | RDB (RDS) | NoSQL (DynamoDB) |
|---|---|---|
| スキーマ | 固定 (事前定義) | 柔軟 (スキーマレス) |
| スケーリング | 垂直 (スケールアップ) | 水平 (スケールアウト) |
| JOIN | ✅ | ❌ (非正規化で対応) |
| トランザクション | ACID | 限定的 (DynamoDB Transactions) |
| 一貫性 | 強い整合性 | 結果整合性 (強い整合性もオプション) |
| 用途 | 複雑なリレーション | 高スループット、大規模データ |
DynamoDB の特徴
// スキーマレス: アイテムごとに異なる属性を持てる
await db.put({ TableName: 'items', Item: { id: '1', name: 'Alice', age: 30 } });
await db.put({ TableName: 'items', Item: { id: '2', name: 'Bob', tags: ['admin'] } });
// age がないアイテム、tags があるアイテムが共存
選択基準
複雑なリレーションや JOIN が必要なら RDB (RDS, Aurora)、高スループット・低レイテンシなら DynamoDB、柔軟なスキーマなら DynamoDB や DocumentDB、グラフ構造 (SNS、推薦) なら Neptune、キャッシュやセッションなら ElastiCache (Redis)、全文検索なら OpenSearch が適している。
CAP 定理
分散システムは Consistency (全ノードが同じデータ)、Availability (全リクエストに応答)、Partition Tolerance (ネットワーク分断に耐える) の 3 つを同時に満たせない。
DynamoDB は AP (Availability + Partition Tolerance) を選択し、結果整合性をデフォルトとする。ConsistentRead: true で強い整合性も可能。
DynamoDB の基本操作
// 書き込み (スキーマレス)
await db.put({ TableName: 'items', Item: { id: '1', name: 'Alice', tags: ['admin'] } });
// 読み取り
const item = await db.get({ TableName: 'items', Key: { id: '1' } });
NoSQL の理解を深めるには関連書籍が参考になる。