目次
- なぜこの2つを理解すべきか
- RDBMSとは?超シンプルに理解する
- NoSQLとは?超シンプルに理解する
- 決定的な3つの違い
- 現場での使い分け:実践パターン5選
- よくある失敗と正解
- 明日から使える判断基準
- まとめ
1. なぜこの2つを理解すべきか
スタートアップでは、最初のDB選択ミスが後で致命傷になる。
- 間違った選択→後で全部作り直し→数ヶ月の遅延
- 正しい選択→スムーズな開発→素早いリリース
この判断ができるエンジニアは、チームで重宝される。
2. RDBMSとは?超シンプルに理解する
一言で言うと
Excelの表みたいにデータを管理するDB
具体例
PostgreSQL、MySQL、SQLiteなど
イメージ図(頭の中で描いて)
ユーザーテーブル
+----+----------+------------------+
| ID | 名前 | メールアドレス |
+----+----------+------------------+
| 1 | 田中太郎 | tanaka@example.com |
| 2 | 鈴木花子 | suzuki@example.com |
+----+----------+------------------+
注文テーブル
+----+---------+----------+--------+
| ID | ユーザID | 商品名 | 金額 |
+----+---------+----------+--------+
| 1 | 1 | ノートPC | 120000 |
| 2 | 1 | マウス | 3000 |
| 3 | 2 | キーボード| 8000 |
+----+---------+----------+--------+
特徴
- 表形式:行と列でデータを整理
- 関係性:表同士がIDで繋がる(田中太郎の注文が分かる)
- SQL:データを取り出す専用言語を使う
いつ使う?
データに"正確さ"と"関係性"が必要な時
例:
- ECサイトの注文管理(金額は1円もズレちゃダメ)
- 会員管理システム(ユーザーと購入履歴の紐付け)
- 在庫管理(数が合わないと大問題)
3. NoSQLとは?超シンプルに理解する
一言で言うと
自由な形でデータを保存できるDB(表じゃない)
具体例
MongoDB、Redis、DynamoDB、Firestoreなど
イメージ図(頭の中で描いて)
// MongoDBのドキュメント例
{
"id": "user_001",
"name": "田中太郎",
"email": "tanaka@example.com",
"orders": [
{ "product": "ノートPC", "price": 120000 },
{ "product": "マウス", "price": 3000 }
],
"tags": ["VIP", "リピーター"],
"preferences": {
"newsletter": true,
"category": "電子機器"
}
}
特徴
- 柔軟な形:表じゃなくて、JSONみたいな形で保存
- まとめて保存:関連データを1箇所にドカンと入れる
- スキーマレス:データ構造を後から変えやすい
NoSQLの4タイプ(ざっくり)
- ドキュメント型(MongoDB):JSON形式で保存
- Key-Value型(Redis):「名前→値」のペア(超高速)
- カラム型(Cassandra):大量データ向け
- グラフ型(Neo4j):SNSのつながり向け
スタートアップで使うのは主に1と2。
いつ使う?
スピードと柔軟性が必要な時
例:
- ユーザーの行動ログ(とにかく大量に記録)
- リアルタイムチャット(秒単位の速さ)
- セッション管理(Redisで超高速)
- プロフィール情報(項目が人によって違う)
4. 決定的な3つの違い
違い1:データの構造
| RDBMS | NoSQL |
|---|---|
| 表形式(固定) | 自由形式(柔軟) |
| 事前に列を決める | 後から項目追加OK |
| 正規化(データ分散) | 非正規化(まとめて保存) |
実例:ユーザー情報の保存
RDBMS:
-- テーブル1: ユーザー基本情報
users: id, name, email
-- テーブル2: 住所
addresses: id, user_id, postal_code, address
-- テーブル3: 趣味
hobbies: id, user_id, hobby_name
NoSQL:
{
"id": "user_001",
"name": "田中太郎",
"email": "tanaka@example.com",
"address": {
"postal_code": "123-4567",
"address": "東京都..."
},
"hobbies": ["読書", "旅行", "プログラミング"]
}
違い2:整合性とスピード
| RDBMS | NoSQL |
|---|---|
| ACID保証(厳密) | BASE(ゆるめ) |
| データは常に正確 | 一時的に不整合あり |
| 銀行システム向き | SNS・ログ向き |
| やや遅い | 超高速 |
ACID保証って?
銀行のATMで1万円引き出すとき:
- 口座残高が減る
- ATMから現金が出る
この2つが必ず同時に成功する(どちらか片方だけはNG)
BASEって?
Twitterで「いいね」するとき:
- 一瞬、カウントがズレてもOK
- 数秒後に正しい数に落ち着けばOK
違い3:スケール(拡張性)
| RDBMS | NoSQL |
|---|---|
| 垂直スケール | 水平スケール |
| サーバーを強化 | サーバーを増やす |
| コスト高 | コスト安 |
| 限界あり | ほぼ無限 |
垂直スケール:
1台のサーバーのCPU・メモリを増強(限界がある)
水平スケール:
サーバーを2台→10台→100台と増やす(無限に拡張可能)
5. 現場での使い分け:実践パターン5選
パターン1:ECサイト
注文・決済 → RDBMS(PostgreSQL)
- 理由:金額は1円も間違えられない
- 在庫数も正確に管理
商品レビュー・閲覧履歴 → NoSQL(MongoDB)
- 理由:ユーザーごとに柔軟、大量データOK
- 多少のズレは許容範囲
パターン2:SNSアプリ
ユーザープロフィール → NoSQL(MongoDB)
- 理由:ユーザーごとに持ってる情報が違う
- スキーマレスで柔軟に対応
フォロー関係 → NoSQL(グラフDB or MongoDB)
- 理由:複雑なつながりを高速処理
セッション管理 → NoSQL(Redis)
- 理由:ログイン状態を超高速で確認
パターン3:SaaSの管理画面
アカウント・権限管理 → RDBMS
- 理由:正確な権限管理が必須
ログデータ → NoSQL(MongoDB or Elasticsearch)
- 理由:とにかく大量、検索速度優先
パターン4:リアルタイムチャット
メッセージ保存 → NoSQL(Firestore or MongoDB)
- 理由:秒単位でデータ増加、高速書き込み必須
既読管理 → NoSQL(Redis)
- 理由:キャッシュとして超高速アクセス
パターン5:分析ダッシュボード
マスターデータ → RDBMS
- 理由:正確なデータ集計が必要
集計結果キャッシュ → NoSQL(Redis)
- 理由:同じ集計を何度も計算しない
6. よくある失敗と正解
失敗1:全部RDBMSで作った
状況:
SNSアプリで、全てPostgreSQL使用
→ユーザー増加でレスポンス激遅
原因:
- ログデータが膨大(毎秒数千件)
- RDBMSは大量書き込みが苦手
正解:
- ログ → MongoDB(書き込み速度10倍)
- ユーザー基本情報 → PostgreSQL(正確性重視)
失敗2:全部NoSQLで作った
状況:
ECサイトで、全てMongoDBで構築
→在庫数がズレて二重販売発生
原因:
- NoSQLは厳密な整合性保証なし
- 在庫管理には向かない
正解:
- 注文・在庫 → PostgreSQL(ACID保証)
- 商品カタログ → MongoDB(柔軟性)
失敗3:最初から複雑にした
状況:
初期から5種類のDB導入
→運用コストで開発が止まる
原因:
- 管理が複雑すぎ
- スタートアップは人手不足
正解:
- 最初は1〜2種類で十分
- 必要になってから追加
7. 明日から使える判断基準
質問1:お金や在庫など、絶対ズレちゃダメ?
YES → RDBMS
NO → NoSQL
質問2:1秒で何千件も書き込む?
YES → NoSQL
NO → RDBMS
質問3:データ構造が後から変わりそう?
YES → NoSQL
NO → RDBMS
質問4:複数テーブルをまたいだ複雑な集計が必要?
YES → RDBMS
NO → NoSQL
質問5:とにかくスピード最優先?
YES → NoSQL(特にRedis)
NO → RDBMS
スタートアップ的ベストプラクティス
フェーズ1:MVP(最初の3ヶ月)
シンプルに1つだけ使う
- Webアプリ → PostgreSQL(オールマイティ)
- API・モバイル → Firebase/Firestore(速い)
理由:複雑にすると開発が遅れる
フェーズ2:成長期(ユーザー1万人〜)
適材適所で2〜3種類
例:
- メインDB → PostgreSQL
- キャッシュ → Redis
- ログ → MongoDB
フェーズ3:拡大期(ユーザー10万人〜)
専門的に最適化
- 用途別に5〜6種類
- 専任のインフラエンジニア配置
実際のコード例
RDBMSの例(PostgreSQL + SQL)
-- ユーザーの注文履歴を取得
SELECT
u.name,
o.product_name,
o.amount,
o.created_at
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE u.id = 1
ORDER BY o.created_at DESC;
NoSQLの例(MongoDB)
// ユーザーの注文履歴を取得
db.users.findOne(
{ _id: "user_001" },
{
name: 1,
orders: 1
}
)
// 結果(全部1箇所に入ってる)
{
"name": "田中太郎",
"orders": [
{ "product": "ノートPC", "amount": 120000, "date": "2024-12-01" },
{ "product": "マウス", "amount": 3000, "date": "2024-12-05" }
]
}
チームで決めるときのコツ
1. 要件を明確に
「このデータ、1円でもズレたらマズい?」
「1日何件くらい増える?」
2. 小さく始める
最初から完璧を目指さない
3. 実測する
実際にデータ入れて速度測定
4. チームのスキルセットも考慮
- PostgreSQL経験者が多い → まずはRDBMS
- Firebase使ったことある → Firestoreも選択肢
まとめ
RDBMSを選ぶべき時
✅ お金・在庫など正確性が命
✅ 複雑な集計・レポートが必要
✅ データ同士の関係が重要
✅ トランザクションが必須
代表例:PostgreSQL、MySQL
NoSQLを選ぶべき時
✅ 大量の読み書きが発生
✅ データ構造が柔軟に変わる
✅ リアルタイム性が重要
✅ 水平スケールしたい
代表例:MongoDB、Redis、Firestore
実践の鉄則
- 最初はシンプルに(1種類で十分)
- 問題が出たら追加(段階的に)
- 適材適所(全部RDBMSも全部NoSQLもNG)
- チームで共有(判断基準を明文化)
最後に
スタートアップでは、完璧なDB設計より、素早く動くシステムが大事。
- 最初は多少の無駄があってもOK
- ユーザーが増えてから最適化
- そのための判断基準を持つ
この記事の知識があれば、「なぜこのDB使ってるの?」と聞かれた時に、ちゃんと理由を説明できる。それだけでチームから一目置かれる。
明日から、自信を持ってDB選択しよう!