STEP 16:NoSQL基礎と選択基準

🎯 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とは

📊 RDBMS(Relational Database Management System)

関係データベース管理システム。データをテーブル(表)で管理し、SQLで操作します。

  • 📋 代表例:MySQL、PostgreSQL、Oracle、SQL Server
  • 🔑 特徴:ACID特性、トランザクション、JOINによる複雑なクエリ
  • 得意:データの整合性が重要な業務システム

NoSQLとは

🌐 NoSQL(Not Only SQL)

「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が適しているケース

✅ NoSQLを選ぶべき場合
  1. 大量のデータを高速に処理したい
    例:SNSのタイムライン、アクセスログ分析
  2. データ構造が頻繁に変わる
    例:プロトタイプ開発、スタートアップのMVP
  3. 水平スケーリングが必要
    例:急激にユーザーが増えるサービス
  4. リアルタイム性が重要
    例:キャッシュ、セッション管理、リアルタイムチャット
  5. 階層的・ネストしたデータを扱う
    例:JSON形式のAPI、ユーザープロファイル

RDBMSが適しているケース

✅ RDBMSを選ぶべき場合
  1. データの整合性が最重要
    例:金融システム、会計システム、在庫管理
  2. 複雑な関係性を持つデータ
    例:ERPシステム、CRMシステム
  3. 複雑なクエリが必要
    例:多次元分析、レポート作成
  4. トランザクション処理が必要
    例:ECサイトの注文処理、銀行のATM
  5. 標準化されたSQLを使いたい
    例:既存のSQLスキルを活かしたい、ツールとの連携

判断フローチャート

🔍 データベース選択のフローチャート
Q1: データの整合性が最重要?(金融、会計など)   ↓ YES → RDBMS   ↓ NO Q2: 複雑なJOINや集計が必要?   ↓ YES → RDBMS   ↓ NO Q3: 大量データの高速アクセスが必要?   ↓ YES   ↓ NO → RDBMS Q4: データ構造は柔軟に変わる?   ↓ YES → NoSQL(ドキュメント型)   ↓ NO Q5: リアルタイム性が最重要?   ↓ YES → NoSQL(キーバリュー型)   ↓ NO → ケースバイケース

📦 3. NoSQLの4つのタイプ

NoSQLは、データの保存方式によって4つのタイプに分類されます。

タイプ1:ドキュメント型(Document Store)

📄 ドキュメント型データベース

データをJSON/BSON形式のドキュメントとして保存します。

  • 🗄️ 代表例:MongoDB、Couchbase、Amazon DocumentDB
  • 📊 データ形式:JSON/BSON(ネストした構造も保存可能)
  • 得意:柔軟なスキーマ、階層的データ、プロトタイピング

例:MongoDBでのユーザープロファイル

{ “_id”: “user123”, “name”: “山田太郎”, “email”: “yamada@example.com”, “age”: 30, “address”: { “prefecture”: “東京都”, “city”: “新宿区”, “zipcode”: “160-0000” }, “interests”: [“プログラミング”, “旅行”, “読書”], “purchaseHistory”: [ {“date”: “2025-01-15”, “product”: “ノートPC”, “amount”: 80000}, {“date”: “2025-01-20”, “product”: “マウス”, “amount”: 2000} ] }

タイプ2:キーバリュー型(Key-Value Store)

🔑 キーバリュー型データベース

キー(鍵)に対して値(バリュー)を保存する、最もシンプルな形式です。

  • 🗄️ 代表例:Redis、Memcached、Amazon DynamoDB
  • 📊 データ形式:キー → 値(文字列、数値、リストなど)
  • 得意:超高速アクセス、キャッシュ、セッション管理

例:Redisでのセッション管理

キー: “session:abc123” 値: {“user_id”: “user123”, “login_time”: “2025-01-15T10:00:00Z”} キー: “cache:product:101” 値: {“name”: “ノートPC”, “price”: 80000, “stock”: 50}

タイプ3:カラム指向型(Column-Family Store)

📊 カラム指向型データベース

データを列(カラム)単位で保存します。大量データの集計に強いです。

  • 🗄️ 代表例:Apache Cassandra、HBase、Google Bigtable
  • 📊 データ形式:行キー + カラムファミリー + カラム
  • 得意:大量データの書き込み、時系列データ、ログ分析

例:Cassandraでのログデータ

行キー: “2025-01-15” カラム: { “10:00:00”: {“user_id”: “user123”, “action”: “login”}, “10:01:23”: {“user_id”: “user456”, “action”: “purchase”}, “10:02:45”: {“user_id”: “user123”, “action”: “view”} }

タイプ4:グラフ型(Graph Database)

🕸️ グラフ型データベース

データをノード(点)とエッジ(線)で表現します。関係性の分析に強いです。

  • 🗄️ 代表例:Neo4j、Amazon Neptune、ArangoDB
  • 📊 データ形式:ノード(エンティティ) + エッジ(関係)
  • 得意:SNS、推薦システム、ネットワーク分析

例:Neo4jでのSNSの友達関係

ノード: (山田太郎:User {age: 30, location: “東京”}) ノード: (佐藤花子:User {age: 28, location: “大阪”}) エッジ: (山田太郎)-[:FRIEND_OF {since: “2020-01-01”}]->(佐藤花子) クエリ: 「山田太郎の友達の友達」を瞬時に取得可能

4タイプの比較

タイプ 代表例 得意分野 典型的な用途
ドキュメント型 MongoDB 柔軟なスキーマ、階層データ CMS、ユーザープロファイル、カタログ
キーバリュー型 Redis 超高速アクセス、シンプルな操作 キャッシュ、セッション管理、ランキング
カラム指向型 Cassandra 大量データ書き込み、時系列データ ログ分析、IoTデータ、監視
グラフ型 Neo4j 関係性の分析、ネットワーク探索 SNS、推薦システム、不正検知

🔄 4. ハイブリッド構成の考え方

現代のシステムでは、RDBMSとNoSQLを組み合わせて使うのが一般的です。

ハイブリッド構成の例

🏗️ ECサイトの構成例
📊 RDBMS(MySQL)   ├─ 注文管理(トランザクション)   ├─ 在庫管理(整合性が重要)   ├─ 顧客管理(複雑なクエリ)   └─ 会計処理(ACID特性) 🔑 Redis(キーバリュー型)   ├─ セッション管理(超高速)   ├─ 商品キャッシュ(頻繁アクセス)   ├─ カート情報(一時データ)   └─ ランキング(リアルタイム) 📄 MongoDB(ドキュメント型)   ├─ 商品カタログ(柔軟なスキーマ)   ├─ ユーザーレビュー(ネスト構造)   ├─ アクティビティログ(大量データ)   └─ 推薦データ(機械学習用) 🔍 Elasticsearch(検索エンジン)   ├─ 商品検索(全文検索)   └─ ファセット検索(絞り込み)

データの流れ

🔄 典型的なデータフロー
1. 商品閲覧   ユーザー → Redis(キャッシュチェック)     ├─ キャッシュHIT → Redis から返却(超高速)     └─ キャッシュMISS → MongoDB → Redis にキャッシュ 2. カート追加   ユーザー → Redis(カート情報更新)     └─ セッション内で保持(一時データ) 3. 注文確定   ユーザー → MySQL(トランザクション開始)     ├─ 注文テーブルに INSERT     ├─ 在庫テーブルを UPDATE     ├─ 決済処理     └─ トランザクション COMMIT

ハイブリッド構成のメリット・デメリット

✅ ハイブリッド構成のメリット
  1. 適材適所:各データベースの強みを最大限活用
  2. パフォーマンス向上:キャッシュ層でRDBMSの負荷を軽減
  3. 可用性向上:一部のDBが停止しても、他が稼働
  4. 柔軟性:新しい要件に対して最適な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を実際に使ってみましょう!

📝 練習問題

問題 1 基礎

RDBMSとNoSQLの違いを3つ以上挙げて説明してください。

【解答例】
  1. データ構造:RDBMSは固定スキーマのテーブル形式、NoSQLは柔軟なスキーマ(ドキュメント、キーバリューなど)
  2. スケーラビリティ:RDBMSは垂直スケール(サーバー強化)、NoSQLは水平スケール(サーバー追加)
  3. ACID特性:RDBMSは完全サポート、NoSQLは部分的サポート(結果整合性)
  4. JOIN:RDBMSは得意(複雑な関係表現)、NoSQLは苦手(基本的にJOINなし)
  5. 用途:RDBMSは整合性重視の業務システム、NoSQLは大量データ・高速アクセス
問題 2 基礎

NoSQLの4つのタイプの名前と、それぞれの代表的なデータベース製品を1つずつ挙げてください。

【解答】
  1. ドキュメント型:MongoDB(他:Couchbase、Amazon DocumentDB)
  2. キーバリュー型:Redis(他:Memcached、Amazon DynamoDB)
  3. カラム指向型:Apache Cassandra(他:HBase、Google Bigtable)
  4. グラフ型:Neo4j(他:Amazon Neptune、ArangoDB)
問題 3 標準

以下のシナリオに最適なデータベースタイプを選び、理由を説明してください。

シナリオ:
  1. ECサイトのユーザーセッション管理(ログイン状態の保持)
  2. SNSの「友達の友達」を探す機能
  3. 商品カタログ(商品ごとに属性が大きく異なる)
  4. 銀行の口座振替処理
【解答】
  1. キーバリュー型(Redis):超高速アクセスが必要、TTL(自動削除)でセッション期限管理が容易、シンプルなキー検索のみ
  2. グラフ型(Neo4j):関係性の探索が得意、「友達の友達の友達…」のようなグラフ探索クエリが高速
  3. ドキュメント型(MongoDB):柔軟なスキーマで商品ごとに異なる属性を保存可能、ネスト構造も扱いやすい
  4. RDBMS(MySQL/PostgreSQL):ACID特性が必須、トランザクションで整合性を保証、金融データは厳密な整合性が最重要
問題 4 標準

以下のデータをMongoDBのドキュメント形式(JSON)で表現してください。

データ:

ブログ記事:タイトル「MongoDB入門」、著者「山田太郎」、公開日「2025-01-15」、
タグ:「データベース」「NoSQL」「MongoDB」、
コメント2件:(佐藤花子「勉強になりました」1/16)、(鈴木一郎「分かりやすい」1/17)

【解答】
{ “_id”: “post001”, “title”: “MongoDB入門”, “author”: “山田太郎”, “publishedDate”: “2025-01-15”, “tags”: [“データベース”, “NoSQL”, “MongoDB”], “comments”: [ { “user”: “佐藤花子”, “text”: “勉強になりました”, “date”: “2025-01-16” }, { “user”: “鈴木一郎”, “text”: “分かりやすい”, “date”: “2025-01-17” } ] }

ポイント:タグや配列、コメントのような階層データを自然に表現できるのがドキュメント型の強み

問題 5 応用

オンラインゲームのシステムで、以下のデータを管理するためのハイブリッド構成を設計してください。どのデータベースを使い、なぜそれを選ぶかを説明してください。

管理するデータ:
  • ユーザーアカウント情報(課金情報含む)
  • リアルタイムのプレイヤー位置情報
  • ゲームログ(全プレイヤーの行動履歴)
  • フレンド関係とギルド所属
  • プレイヤーの装備・インベントリ
  • リアルタイムランキング
【解答例】
【ハイブリッド構成】 1. RDBMS(MySQL/PostgreSQL) └─ ユーザーアカウント情報、課金情報 理由:課金処理にはACID特性が必須、トランザクション保証 2. Redis(キーバリュー型) ├─ リアルタイムのプレイヤー位置情報 ├─ リアルタイムランキング(Sorted Set使用) └─ セッション管理 理由:超高速アクセス、リアルタイム性最優先、TTL機能 3. MongoDB(ドキュメント型) └─ プレイヤーの装備・インベントリ 理由:柔軟なスキーマ(アイテムごとに属性が異なる)、 ネスト構造(装備スロット、所持品) 4. Cassandra(カラム指向型) └─ ゲームログ(全プレイヤーの行動履歴) 理由:大量の書き込み、時系列データ、 水平スケール可能 5. Neo4j(グラフ型) └─ フレンド関係、ギルド所属 理由:「友達の友達」「同じギルドのメンバー」など 関係性の探索が高速

ポイント:各データの特性(整合性要件、アクセスパターン、データ量)に応じて最適なDBを選択

問題 6 応用

「スタートアップでは最初からハイブリッド構成を採用すべきか?」について、メリット・デメリットを踏まえてあなたの意見を述べてください。

【解答例】

結論:最初はシンプルに始め、必要に応じて拡張すべき

最初からハイブリッド構成を採用しない理由:

  • 運用コスト:複数DBの管理、監視、バックアップが必要
  • 学習コスト:チームが複数のDBを習得する必要
  • 複雑性:データ同期、障害対応が複雑化
  • オーバーエンジニアリング:小規模段階では不要な機能

推奨アプローチ:

  1. Phase 1:RDBMSのみでスタート(PostgreSQL推奨)
  2. Phase 2:パフォーマンス問題が出たらRedisをキャッシュとして追加
  3. Phase 3:スキーマの柔軟性が必要ならMongoDBを検討
  4. 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

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE