データベース
アプリの根幹。データを永続化して効率よく取り出す仕組み。 RDB(リレーショナル)と NoSQL の使い分け、設計、インデックス、トランザクション、分散の話まで。
そもそもデータベースとは
- データを永続化(プロセスが死んでも残る)
- 同時アクセスを整合性ある形で捌く
- クエリで柔軟に取り出す
- トランザクションで全部成功 or 全部失敗
- バックアップ / リカバリでデータを失わない
大分類
| 種類 | 例 | 得意 |
|---|---|---|
| RDB(リレーショナル) | PostgreSQL / MySQL / SQLite / SQL Server / Oracle | トランザクション、結合、整合性 |
| Document | MongoDB / Firestore / DynamoDB | 柔軟なスキーマ、JSON |
| Key-Value | Redis / Memcached / DynamoDB | 超高速 GET/SET、キャッシュ |
| Column | Cassandra / ScyllaDB / BigQuery | 巨大データの分析 |
| Graph | Neo4j / DGraph | 関係性のクエリ |
| Time Series | InfluxDB / TimescaleDB | 時系列メトリクス |
| Vector | pgvector / Pinecone / Qdrant | 埋め込み検索 / RAG |
| Search | Elasticsearch / Meilisearch / Typesense | 全文検索 |
| Wide-Column | HBase / BigTable | 超大規模 OLTP |
OLTP vs OLAP
- OLTP(On-Line Transaction Processing)— 短い読み書き、ユーザ操作。RDB / Redis / DynamoDB
- OLAP(On-Line Analytical Processing)— 集計分析、ダッシュボード。BigQuery / Snowflake / DuckDB / ClickHouse
- 両方を 1 つで賄うのは厳しい → 分けて運用するのが定石
選び方の指針
- 迷ったら PostgreSQL。SQL + JSON + 全文検索 + ベクトル + 拡張で大半をこなす
- キャッシュ / セッション / レート制限 → Redis
- 分析・大規模集計 → BigQuery / DuckDB
- 全文検索が肝 → Elasticsearch / Meilisearch
- 固定スキーマが取れない / 階層深い JSON → MongoDB
- 関係性そのもの(友達・経路)→ Graph DB
このノートの範囲
- 主軸はRDB(PostgreSQL を念頭に)
- NoSQL の代表的な使い分け
- 設計・インデックス・トランザクションの基礎
- レプリケーション、分散の現代的な選択肢
- パフォーマンス計測と運用
関連セクション
本セクションの読み方
- リレーショナル DB — テーブル / 主キー / 外部キー
- NoSQL — 種類と使いどころ
- 設計と正規化 — ER 図、正規形、命名
- インデックス — B-tree / Hash / GIN / 部分
- トランザクション — ACID、Isolation、ロック
- レプリケーション・分散 — Primary-Replica、シャーディング
- パフォーマンス — EXPLAIN、計画、キャッシュ
- 運用と注意点
2026 年のスナップショット
- PostgreSQL 17: パフォーマンス向上、論理レプリケーション強化
- マネージド Postgres 戦国時代: Supabase / Neon / Render / Vercel Postgres / Prisma Postgres
- SQLite が再評価: Turso / Cloudflare D1 / LiteFS でエッジ対応
- DuckDB: ローカル分析の人気が爆上がり
- pgvector: AI / RAG で標準
- HTAP(OLTP + OLAP 同時): TiDB / CockroachDB / Singlestore
最初の 1 つ
SQLite を手元で触り始めるのが最短。sqlite3 test.db で1 ファイルがそのまま DB になる。
ここで SQL を書けるようになってから、PostgreSQL に進むのが効率的。