🎯 STEP 16: NoSQL基礎と選択基準
RDBMSとNoSQLの違いを理解し、適切なデータベースを選択できるようになろう
- RDBMSとNoSQLの違いと特徴
- いつNoSQLを選ぶべきか
- NoSQLの4つのタイプ(ドキュメント型、キーバリュー型、カラム指向型、グラフ型)
- 各タイプの使い分け
- ハイブリッド構成の考え方
学習時間の目安: 2時間 | 前提知識: RDBMSの基本、正規化を理解していること
🎯 1. RDBMSとNoSQLの違い
STEP 15からの続き:RDBMSを超えて
STEP 15までで、RDBMSを使ったデータウェアハウス設計を学びました。しかし、現代のシステムではRDBMSだけでは対応が難しいケースも増えています。このSTEP 16では、NoSQLデータベースの基礎を学び、RDBMSとの使い分けができるようになりましょう。
RDBMSとは
関係データベース管理システム。データをテーブル(表)で管理し、SQLで操作します。
- 📋 代表例:MySQL、PostgreSQL、Oracle、SQL Server
- 🔑 特徴:ACID特性、トランザクション、JOINによる複雑なクエリ
- ✅ 得意:データの整合性が重要な業務システム
NoSQLとは
「SQLだけではない」という意味。RDBMSとは異なる方式でデータを管理するデータベースの総称です。
- 📋 代表例:MongoDB、Redis、Cassandra、Neo4j
- 🔑 特徴:スキーマレス、水平スケーラブル、高速
- ✅ 得意:大量データ、高速アクセス、柔軟なデータ構造
RDBMSとNoSQLの比較
| 項目 | RDBMS | NoSQL |
|---|---|---|
| データ構造 | テーブル(行と列)、固定スキーマ | 多様(ドキュメント、キーバリューなど)、柔軟なスキーマ |
| スケーラビリティ | 垂直スケール(サーバー強化) | 水平スケール(サーバー追加) |
| ACID特性 | 完全にサポート | 部分的サポート(結果整合性) |
| JOIN | 得意(複雑な関係も表現) | 苦手(基本的にJOINなし) |
| パフォーマンス | 複雑なクエリに対応、大量データでは遅くなる場合も | シンプルなクエリは超高速、大量データに強い |
| 用途 | 業務システム、金融、会計、EC | リアルタイム分析、SNS、ログ、キャッシュ |
| 学習コスト | SQLを学べばOK、標準化されている | 製品ごとに異なる、独自の操作方法 |
NoSQLは「RDBMSの代替」ではなく「補完」です。
RDBMSとNoSQLはそれぞれ得意分野が違うため、両方を適材適所で使い分けることが重要です。
「RDBMSかNoSQLか」ではなく、「どちらも使う」という考え方が現代的です。
🤔 2. いつNoSQLを選ぶべきか?
NoSQLが適しているケース
- 大量のデータを高速に処理したい
例:SNSのタイムライン、アクセスログ分析 - データ構造が頻繁に変わる
例:プロトタイプ開発、スタートアップのMVP - 水平スケーリングが必要
例:急激にユーザーが増えるサービス - リアルタイム性が重要
例:キャッシュ、セッション管理、リアルタイムチャット - 階層的・ネストしたデータを扱う
例:JSON形式のAPI、ユーザープロファイル
RDBMSが適しているケース
- データの整合性が最重要
例:金融システム、会計システム、在庫管理 - 複雑な関係性を持つデータ
例:ERPシステム、CRMシステム - 複雑なクエリが必要
例:多次元分析、レポート作成 - トランザクション処理が必要
例:ECサイトの注文処理、銀行のATM - 標準化されたSQLを使いたい
例:既存のSQLスキルを活かしたい、ツールとの連携
判断フローチャート
📦 3. NoSQLの4つのタイプ
NoSQLは、データの保存方式によって4つのタイプに分類されます。
タイプ1:ドキュメント型(Document Store)
データをJSON/BSON形式のドキュメントとして保存します。
- 🗄️ 代表例:MongoDB、Couchbase、Amazon DocumentDB
- 📊 データ形式:JSON/BSON(ネストした構造も保存可能)
- ✅ 得意:柔軟なスキーマ、階層的データ、プロトタイピング
例:MongoDBでのユーザープロファイル
タイプ2:キーバリュー型(Key-Value Store)
キー(鍵)に対して値(バリュー)を保存する、最もシンプルな形式です。
- 🗄️ 代表例:Redis、Memcached、Amazon DynamoDB
- 📊 データ形式:キー → 値(文字列、数値、リストなど)
- ✅ 得意:超高速アクセス、キャッシュ、セッション管理
例:Redisでのセッション管理
タイプ3:カラム指向型(Column-Family Store)
データを列(カラム)単位で保存します。大量データの集計に強いです。
- 🗄️ 代表例:Apache Cassandra、HBase、Google Bigtable
- 📊 データ形式:行キー + カラムファミリー + カラム
- ✅ 得意:大量データの書き込み、時系列データ、ログ分析
例:Cassandraでのログデータ
タイプ4:グラフ型(Graph Database)
データをノード(点)とエッジ(線)で表現します。関係性の分析に強いです。
- 🗄️ 代表例:Neo4j、Amazon Neptune、ArangoDB
- 📊 データ形式:ノード(エンティティ) + エッジ(関係)
- ✅ 得意:SNS、推薦システム、ネットワーク分析
例:Neo4jでのSNSの友達関係
4タイプの比較
| タイプ | 代表例 | 得意分野 | 典型的な用途 |
|---|---|---|---|
| ドキュメント型 | MongoDB | 柔軟なスキーマ、階層データ | CMS、ユーザープロファイル、カタログ |
| キーバリュー型 | Redis | 超高速アクセス、シンプルな操作 | キャッシュ、セッション管理、ランキング |
| カラム指向型 | Cassandra | 大量データ書き込み、時系列データ | ログ分析、IoTデータ、監視 |
| グラフ型 | Neo4j | 関係性の分析、ネットワーク探索 | SNS、推薦システム、不正検知 |
🔄 4. ハイブリッド構成の考え方
現代のシステムでは、RDBMSとNoSQLを組み合わせて使うのが一般的です。
ハイブリッド構成の例
データの流れ
ハイブリッド構成のメリット・デメリット
- 適材適所:各データベースの強みを最大限活用
- パフォーマンス向上:キャッシュ層でRDBMSの負荷を軽減
- 可用性向上:一部のDBが停止しても、他が稼働
- 柔軟性:新しい要件に対して最適なDBを選択可能
- 複雑性が増す(運用・管理コストが上がる)
- データの同期が必要(整合性の維持)
- 複数のスキルが必要(学習コスト)
- トラブルシューティングが難しくなる
🎯 5. 実務での選択ガイド
シナリオ別の推奨データベース
| 用途・シナリオ | 推奨データベース | 理由 |
|---|---|---|
| ECサイト注文管理 | MySQL / PostgreSQL | トランザクション、整合性が重要 |
| セッション管理 | Redis | 超高速、TTL(自動削除)機能 |
| ユーザープロファイル | MongoDB | 柔軟なスキーマ、ネスト構造 |
| リアルタイムチャット | Redis + MongoDB | Redis(リアルタイム)、MongoDB(履歴保存) |
| アクセスログ分析 | Cassandra / MongoDB | 大量書き込み、時系列データ |
| SNS(友達関係) | Neo4j | グラフ探索、推薦アルゴリズム |
| 商品検索 | Elasticsearch | 全文検索、ファセット検索 |
| IoTセンサーデータ | Cassandra / InfluxDB | 時系列データ、大量書き込み |
📝 6. NoSQL基礎のまとめ
- RDBMSとNoSQLの違い:スキーマ、スケーラビリティ、ACID特性など
- NoSQLを選ぶべき場合:大量データ、柔軟なスキーマ、水平スケーリング
- NoSQLの4タイプ:ドキュメント型、キーバリュー型、カラム指向型、グラフ型
- 各タイプの使い分け:用途に応じて最適なタイプを選択
- ハイブリッド構成:RDBMSとNoSQLを組み合わせて使う
「RDBMSかNoSQLか」ではなく「どちらも使う」という発想が重要です。
✅ 業務の核心部分はRDBMS(整合性・トランザクション)
✅ パフォーマンスが必要な部分はNoSQL(キャッシュ・高速アクセス)
✅ 新しい要件には最適なDBを追加(柔軟に対応)
次のSTEP 17では、MongoDBを実際に使ってみましょう!
📝 練習問題
RDBMSとNoSQLの違いを3つ以上挙げて説明してください。
- データ構造:RDBMSは固定スキーマのテーブル形式、NoSQLは柔軟なスキーマ(ドキュメント、キーバリューなど)
- スケーラビリティ:RDBMSは垂直スケール(サーバー強化)、NoSQLは水平スケール(サーバー追加)
- ACID特性:RDBMSは完全サポート、NoSQLは部分的サポート(結果整合性)
- JOIN:RDBMSは得意(複雑な関係表現)、NoSQLは苦手(基本的にJOINなし)
- 用途:RDBMSは整合性重視の業務システム、NoSQLは大量データ・高速アクセス
NoSQLの4つのタイプの名前と、それぞれの代表的なデータベース製品を1つずつ挙げてください。
- ドキュメント型:MongoDB(他:Couchbase、Amazon DocumentDB)
- キーバリュー型:Redis(他:Memcached、Amazon DynamoDB)
- カラム指向型:Apache Cassandra(他:HBase、Google Bigtable)
- グラフ型:Neo4j(他:Amazon Neptune、ArangoDB)
以下のシナリオに最適なデータベースタイプを選び、理由を説明してください。
- ECサイトのユーザーセッション管理(ログイン状態の保持)
- SNSの「友達の友達」を探す機能
- 商品カタログ(商品ごとに属性が大きく異なる)
- 銀行の口座振替処理
- キーバリュー型(Redis):超高速アクセスが必要、TTL(自動削除)でセッション期限管理が容易、シンプルなキー検索のみ
- グラフ型(Neo4j):関係性の探索が得意、「友達の友達の友達…」のようなグラフ探索クエリが高速
- ドキュメント型(MongoDB):柔軟なスキーマで商品ごとに異なる属性を保存可能、ネスト構造も扱いやすい
- RDBMS(MySQL/PostgreSQL):ACID特性が必須、トランザクションで整合性を保証、金融データは厳密な整合性が最重要
以下のデータをMongoDBのドキュメント形式(JSON)で表現してください。
ブログ記事:タイトル「MongoDB入門」、著者「山田太郎」、公開日「2025-01-15」、
タグ:「データベース」「NoSQL」「MongoDB」、
コメント2件:(佐藤花子「勉強になりました」1/16)、(鈴木一郎「分かりやすい」1/17)
ポイント:タグや配列、コメントのような階層データを自然に表現できるのがドキュメント型の強み
オンラインゲームのシステムで、以下のデータを管理するためのハイブリッド構成を設計してください。どのデータベースを使い、なぜそれを選ぶかを説明してください。
- ユーザーアカウント情報(課金情報含む)
- リアルタイムのプレイヤー位置情報
- ゲームログ(全プレイヤーの行動履歴)
- フレンド関係とギルド所属
- プレイヤーの装備・インベントリ
- リアルタイムランキング
ポイント:各データの特性(整合性要件、アクセスパターン、データ量)に応じて最適なDBを選択
「スタートアップでは最初からハイブリッド構成を採用すべきか?」について、メリット・デメリットを踏まえてあなたの意見を述べてください。
結論:最初はシンプルに始め、必要に応じて拡張すべき
最初からハイブリッド構成を採用しない理由:
- 運用コスト:複数DBの管理、監視、バックアップが必要
- 学習コスト:チームが複数のDBを習得する必要
- 複雑性:データ同期、障害対応が複雑化
- オーバーエンジニアリング:小規模段階では不要な機能
推奨アプローチ:
- Phase 1:RDBMSのみでスタート(PostgreSQL推奨)
- Phase 2:パフォーマンス問題が出たらRedisをキャッシュとして追加
- Phase 3:スキーマの柔軟性が必要ならMongoDBを検討
- Phase 4:特殊な要件(グラフ探索等)が出たら専用DBを追加
例外:最初から明確にNoSQLが必要な場合(大量のリアルタイムデータ、複雑な関係性分析など)は、早期に導入を検討
❓ よくある質問
Q1: NoSQLを使えば、RDBMSは不要になりますか?
いいえ、両方必要です。NoSQLとRDBMSは補完関係にあり、どちらか一方で全てを解決することはできません。RDBMSが必須な場面(金融取引、在庫管理、複雑な集計レポートなど)とNoSQLが有利な場面(大量のログデータ、リアルタイムキャッシュ、柔軟に変化するデータ構造など)があり、実務では両方を適材適所で使い分けます。
Q2: NoSQLは本当にスキーマレスですか?設計は不要?
スキーマレスですが、設計は必要です。NoSQLは「スキーマを強制しない」という意味で、「設計しなくて良い」わけではありません。むしろ、自由度が高い分、アクセスパターンを考慮した設計が重要です。どのように検索するか、どう集計するか、埋め込み vs 参照の判断など、適切な設計なしにNoSQLを使うとパフォーマンスが出ない問題が発生します。
Q3: MongoDBとRedis、どちらを選ぶべきか迷っています。
用途が全く違います。MongoDBは複雑なデータ構造(ネスト、配列)、柔軟なスキーマ、永続化が必要な場合(ユーザープロファイル、商品カタログなど)に選びます。Redisは超高速アクセスが必須、シンプルなデータ構造、一時的なデータの場合(セッション管理、キャッシュ、リアルタイムランキングなど)に選びます。多くの場合、RedisをキャッシュとしてMongoDBの前に置くという両方を使う構成が一般的です。
Q4: ハイブリッド構成にすると、データの同期はどうしますか?
いくつかのアプローチがあります。アプリケーション層で同期(データ書き込み時に両方のDBに書き込む)、Change Data Capture(RDBMSの変更を検知してNoSQLに反映)、バッチ処理(定期的にRDBMSからNoSQLにデータをコピー)、イベント駆動(メッセージキューを経由して同期)などがあります。推奨は重要なデータはRDBMSをマスターとし、NoSQLはキャッシュや読み取り専用レプリカとして使う方法です。
Q5: NoSQLを学ぶ順番は?全部学ぶ必要がありますか?
全部学ぶ必要はありません。用途に応じて選択的に学びましょう。推奨学習順序は、まずRDBMS(MySQL/PostgreSQL)をマスター(必須)、次にRedis(キャッシュとして使える、実務で頻出)、MongoDBでドキュメント型を理解、その他は必要に応じて学びます。まずはRDBMSを完璧にし、その上で必要に応じてNoSQLを追加していくのが効率的です。
Q6: 小規模なプロジェクトでもNoSQLを使うべきですか?
必ずしも必要ではありません。小規模プロジェクトの場合、RDBMSだけで十分な場合が多く、複数のDBを管理する運用コストが高くつきます。NoSQLを検討すべきなのは、急激な成長が見込まれる場合(スケーラビリティ)、プロトタイプを素早く作りたい場合(柔軟なスキーマ)、リアルタイム性が重要な場合(Redis等)です。推奨はRDBMSから始めて、必要に応じてNoSQLを追加するアプローチです。
学習メモ
データベース設計・データモデリング - Step 16