FE EXAM

NoSQL(非リレーショナルDB)

表形式にとらわれず多様な形式でデータを格納する非リレーショナルなデータベース。

DIAGRAM
キー値
ドキュメント
カラム指向
グラフ
NoSQL の主要4種類 ── データの「形」が種類ごとに違う① キー値型キーで値を1対1で引くuser:1Tanakauser:2Satocart:9[A,B,C]② ドキュメント型JSON 文書をまるごと格納{ "id": 1, "name": "Tanaka", "tags": ["A","B"], "addr": { "city":.. }}③ カラム指向型列ごとにまとめて保存名前年齢都市同じ列を縦に圧縮 → 集計が高速④ グラフ型点と線で関係を表現ABC友達関係など共通点:表(行×列)の決まった形にとらわれず、データの性質に合った形で保存する→ 大量・多様なデータをスケールしやすく高速に扱えるRDB は「表で厳格に管理」/ NoSQL は「形が自由でスケールしやすい」→ 扱うデータの性質に応じて使い分ける
解説

📌
NoSQLとは

RDB表に固定vsNoSQL形は自由

NoSQLとは、表形式(行と列)にとらわれず、多様な形式でデータを格納する非リレーショナルなデータベースの総称です。名前は「Not only SQL(SQL だけではない)」の略で、SQL を全否定するものではありません。

身近な例で考えると、整理の仕方が決まっていない引き出しのようなものです。RDB が「項目ごとに仕切られた書類棚」だとすると、NoSQL は「メモも写真もカードもそのまま放り込める箱」をいくつも用意できるイメージです。中身の形がバラバラでも受け入れられます。

こうした柔軟さ大量データを複数のサーバーに分散させやすい(スケールしやすい)性質から、SNS・IoT・ビッグデータの分野で広く使われます。上の図解の4種類は、保存する「形」がそれぞれ違うことに注目してください。

📌
主要4種類

NoSQL は保存するデータの「形」によって、大きく次の4種類に分けられます。
キー値(キーバリュー)型:1つの「キー」に1つの「値」を結びつける、最もシンプルな形。辞書のように高速に引ける
ドキュメント型JSON のような階層を持つ「文書」を1単位として丸ごと格納する
カラム指向型:列(カラム)ごとにまとめて保存し、特定の列を使った大量集計を高速に行う
グラフ型:点(ノード)と線(エッジ)でデータ同士の「関係」を表現する

種類データの形得意な用途
キー値型キー → 値セッション管理・キャッシュ
ドキュメント型JSON 文書商品カタログ・プロフィール
カラム指向型列単位大量データの集計・ログ分析
グラフ型点と線SNS の人間関係・経路探索

図書館に例えると、キー値型は「番号札と引換に荷物を渡すコインロッカー」、ドキュメント型は「1冊の本にまとめられた資料」、カラム指向型は「項目ごとに別ファイルに集めた台帳」、グラフ型は「人物相関図」のようなイメージです。

📌
RDBとの使い分け

RDB整合性が大事銀行・在庫NoSQL量・速度が大事SNS・IoT

RDB と NoSQL は優劣ではなく、扱うデータの性質に応じて使い分けるのが基本です。判断のポイントを整理します。
RDB が向く場面:データの形が決まっていて、正確さ・整合性が最重要なとき(銀行口座・在庫・受発注)
NoSQL が向く場面:データの形が多様で、量が膨大かつ高速処理が必要なとき(SNS・センサーログ・推薦)

RDB は事前に表の形をきっちり決めるため、データの矛盾を防ぎやすい反面、後から項目を増やすのは手間がかかります。NoSQL は形が自由なので変更に強く、複数サーバーへ分散させやすい一方、複雑な関連の集計は苦手なことがあります。

実際のシステムでは両方を組み合わせて使うことも多くあります。「正確さが命の帳簿は RDB、雑多で大量のログは NoSQL」と役割を分けて考えると、設計の見通しが立てやすくなります。

🔍
なぜNoSQLはスケールしやすいのか

RDB:1台を大きくするサーバ高スペック化限界あり・高コストNoSQL:台数を増やすS1S2S3S4小さなサーバを並べる台数を増やすだけで対応

NoSQL がスケール(処理量の拡大)しやすい最大の理由は、データを複数のサーバーに分散して置けるからです。これを水平スケーリング(=台数を増やして対応)と呼びます。

RDB が難しい理由は、表(テーブル)のデータが行をまたいで密接に関連しているからです。RDB では「AさんとBさんのデータをサーバ1と2に分けて置く」とすると、2人の関連を計算するたびにサーバ1と2が通信する必要があります。これが複雑で遅くなります。

一方 NoSQL(特にキー値型やドキュメント型)は、1つのデータが完結した単位(キー → 値 / 1つの文書)になっています。「user:1のデータはサーバ1に置く、user:2のデータはサーバ2に置く」と、データの単位ごとに別のサーバへ割り振れます。取り出すときも1台のサーバに問い合わせれば完結するため、サーバを増やすだけで処理量を増やせます。

身近な例で考えると、本の棚1段に詰め込もうとするか(RDB的)、棚を何段でも増やせるか(NoSQL的)の違いです。棚1段は限界があり強化すると高くつきますが、同じ棚を増やすだけなら安くいくらでも対応できます。

📌
RDBとNoSQLで「整合性」への姿勢が違う理由

RDB常に正確な値を保証強い整合性NoSQL少し遅れても最終的に同じ値結果整合性(ゆるい整合性)

NoSQL ではデータを複数のサーバーに分散するため、書き込みと読み取りを行うサーバーが別になることがあります。そのとき、「書き込んだ直後はまだ他のサーバーに反映されていない」という状態が一瞬起こりえます。これを結果整合性(=最終的には同じ値になる、が、一瞬ずれるかもしれない)と呼びます。

なぜ整合性を少し緩めるのかというと、「全台に同時に書き込みが反映されるまで待つ」ようにすると、スケール(台数を増やして速くする)のメリットが薄れてしまうからです。台数が増えるほど全台が一致するのを待つ時間が長くなり、結果として遅くなります。

つまり、「速さ・量」と「完全な整合性」はトレードオフ(どちらかを取るとどちらかが落ちる関係)にあります。SNSの「いいね数」が1秒ほどずれてもほぼ問題ありませんが、銀行口座の残高は1円もずれてはいけません。どちらを優先するかでRDBかNoSQLかを選ぶことになります。

身近な例で考えると、電光掲示板の更新(NoSQL的:少し遅れてもよい)と現金残高の確定(RDB的:即時に正確でなければならない)の違いです。どちらが正しいかではなく、用途に合った選択が大切です。

✏️
練習問題

Q1.NoSQL データベースの説明として最も適切なものはどれか。

Q2.NoSQL のうち、JSON のような階層を持つ文書単位でデータを格納する種類はどれか。

Q3.SNS の友達関係のように、要素同士のつながり(関係)を効率よく表現・探索するのに適した NoSQL の種類はどれか。

関連コンテンツ