変更要約: 初版
1.4データモデルの多様性とNoSQL
階層型・網型・関係モデル・オブジェクト指向モデルという伝統的なデータモデルと、KVS・ドキュメント指向・カラム指向・グラフDBというNoSQLの各方式の特徴を理解し、要件に応じて最適なデータモデルを選択判断する力を学びます。
関係モデルが今日のシステムで広く使われている一方、大規模Webサービスやリアルタイム分析基盤では、関係モデルの制約(厳密なスキーマ・水平分散の難しさ)が課題になる場面があり、NoSQLの各方式が台頭しています。この節では、各データモデルの特徴を並べて暗記するのではなく、「この要件にはどのデータモデルが最も適しているか」という選択判断を軸に理解します。関係モデルが常に最適とは限らず、逆にNoSQLが常に優れているわけでもない、という適材適所の視点が重要です。
1.4.1伝統的なデータモデル
- 階層型モデル=データを木構造(親子関係)で表現し、1つの子は1つの親しか持てない。網型モデル=階層型を拡張し、1つの子が複数の親を持てるネットワーク構造。どちらも関係モデル以前に主流だったモデルで、データ構造がアプリケーションのアクセス経路に強く依存するという制約があった。
- 関係モデル=数学的な集合論に基づき、データ構造とアクセス経路を分離した(データ独立性を実現した)モデル。オブジェクト指向モデル=プログラミング言語のオブジェクト(クラス・継承・カプセル化)をそのままデータベースの構造として扱うモデルで、複雑な構造を持つデータ(CAD図面・マルチメディア等)の扱いに向くが普及は限定的だった。
1.4.2NoSQLの4方式
- KVS(キーバリューストア)=キーと値の単純なペアで管理し、キー指定の検索・更新が極めて高速。値の内部構造をDBMS側が理解しないため、セッション情報やキャッシュなど単純な参照パターンに適す。ドキュメント指向=JSON等の半構造化ドキュメント単位で格納し、ドキュメントごとに柔軟なスキーマを持てる。カタログ情報のように項目数がレコードごとに異なるデータに適す。
- カラム指向(列指向)=列単位でデータをまとめて格納する方式で、特定の列だけを大量に集計・分析する処理(分析基盤・時系列データ)で読み込みが高速。グラフDB=ノード(頂点)とエッジ(辺)でデータと関係を直接表現し、多段階の関連をたどる問合せ(SNSの友人関係・レコメンデーション・不正検知の関連調査)を関係モデルの多段結合より高速に処理できる。
「階層型は1子1親、網型は1子複数親」「KVS/ドキュメント/カラム指向/グラフDBそれぞれの得意な処理パターン」が最頻出です。要件(アクセスパターン・スキーマの柔軟性・整合性要求)からどのモデルが最適かを選ぶ判断を練習しておきましょう。関係モデルとNoSQLは対立ではなく適材適所である点も重要です。
あなたはSNSサービスの新機能「友人の友人(2次のつながり)を経由したレコメンデーション」を設計するデータベース設計者です。既存の関係データベースにはユーザー同士のフォロー関係を格納する中間テーブルがありますが、「ユーザーAから2〜3ホップ先までの繋がりを高速に辿って推薦候補を出す」という要件を関係モデルのSQLで実現しようとすると、多段階の自己結合(JOIN)が必要になり、ホップ数が増えるほど結合コストが指数的に増大します。ここで「関係モデルはSQLの表現力が高いのだから、結合を工夫すれば何とかなる」と安易に結合の最適化だけで解決しようとするのは、大規模なユーザー基盤では性能上のボトルネックを先送りするだけの判断です。多段階の関連を頻繁にたどる要件には、ノードとエッジで関係を直接表現するグラフDBの方が構造的に適しており、2〜3ホップの探索も結合ではなくグラフの走査(トラバーサル)として高速に処理できます。一方で、同じSNSサービスでも「ユーザーのプロフィール設定(項目数が将来増減しやすい柔軟な構造)を保存したい」という要件であれば、スキーマを事前に厳密に固定しないドキュメント指向のデータベースが適します。全ての要件を1つのデータモデルで賄おうとせず、アクセスパターンごとに最適なモデルを併用する(ポリグロットパーシステンス)という発想が、大規模システムの設計では重要になります。
| 方式 | データ表現 | 得意な処理パターン | 代表例 |
|---|---|---|---|
| KVS | キーと値のペア | キー指定の高速な読み書き | セッション情報・キャッシュ |
| ドキュメント指向 | JSON等の半構造化文書 | 項目数が可変な柔軟なスキーマ | 商品カタログ・プロフィール |
| カラム指向 | 列単位のまとまり | 特定列の大量集計・分析 | 分析基盤・時系列データ |
| グラフDB | ノードとエッジ | 多段階の関連のたどり探索 | SNS関係・レコメンド・不正検知 |
ひっかけ: 「NoSQLは関係モデルより常に高性能・高機能であり、新規システムでは関係モデルより優先すべきだ」は誤りです——各方式には得意な処理パターンがあり、強い整合性や複雑な結合を要する要件には関係モデルの方が適する場面が多い。「網型モデルは1つの子が1つの親しか持てない」も誤り=それは階層型モデルの制約であり、網型モデルは1つの子が複数の親を持てる点が階層型との違いです。
1.4.3この節のまとめ
- 階層型(1子1親)と網型(1子複数親)は関係モデル以前の伝統的モデル。関係モデルはデータ構造とアクセス経路を分離しデータ独立性を実現
- NoSQLの4方式(KVS/ドキュメント指向/カラム指向/グラフDB)は、それぞれ得意な処理パターンが異なり、要件のアクセスパターンに応じて選択する
- 多段階の関連をたどる要件にはグラフDB、柔軟なスキーマにはドキュメント指向のように、複数のモデルを併用(ポリグロットパーシステンス)する発想が大規模設計で重要
進捗の記録にはログインが必要です。
理解度チェック
(軽い確認用)Q1. SNSサービスで「ユーザーの友人の友人(2〜3ホップ先)を経由したレコメンデーション」を高速に実現したい。既存の関係データベースの多段階JOINでは性能劣化が課題となっている。最も適切な対処はどれか。
Q2. 階層型モデルと網型モデルの違いについて、最も適切な説明はどれか。
Q3. 商品カタログのように、商品カテゴリによって管理したい項目数が大きく異なるデータを格納する場合に最も適したデータモデルはどれか。

