表形式にとらわれず多様な形式でデータを格納する非リレーショナルなデータベース。
NoSQLとは、表形式(行と列)にとらわれず、多様な形式でデータを格納する非リレーショナルなデータベースの総称です。名前は「Not only SQL(SQL だけではない)」の略で、SQL を全否定するものではありません。
身近な例で考えると、整理の仕方が決まっていない引き出しのようなものです。RDB が「項目ごとに仕切られた書類棚」だとすると、NoSQL は「メモも写真もカードもそのまま放り込める箱」をいくつも用意できるイメージです。中身の形がバラバラでも受け入れられます。
こうした柔軟さと大量データを複数のサーバーに分散させやすい(スケールしやすい)性質から、SNS・IoT・ビッグデータの分野で広く使われます。上の図解の4種類は、保存する「形」がそれぞれ違うことに注目してください。
NoSQL は保存するデータの「形」によって、大きく次の4種類に分けられます。
・キー値(キーバリュー)型:1つの「キー」に1つの「値」を結びつける、最もシンプルな形。辞書のように高速に引ける
・ドキュメント型:JSON のような階層を持つ「文書」を1単位として丸ごと格納する
・カラム指向型:列(カラム)ごとにまとめて保存し、特定の列を使った大量集計を高速に行う
・グラフ型:点(ノード)と線(エッジ)でデータ同士の「関係」を表現する
| 種類 | データの形 | 得意な用途 |
|---|---|---|
| キー値型 | キー → 値 | セッション管理・キャッシュ |
| ドキュメント型 | JSON 文書 | 商品カタログ・プロフィール |
| カラム指向型 | 列単位 | 大量データの集計・ログ分析 |
| グラフ型 | 点と線 | SNS の人間関係・経路探索 |
図書館に例えると、キー値型は「番号札と引換に荷物を渡すコインロッカー」、ドキュメント型は「1冊の本にまとめられた資料」、カラム指向型は「項目ごとに別ファイルに集めた台帳」、グラフ型は「人物相関図」のようなイメージです。
RDB と NoSQL は優劣ではなく、扱うデータの性質に応じて使い分けるのが基本です。判断のポイントを整理します。
・RDB が向く場面:データの形が決まっていて、正確さ・整合性が最重要なとき(銀行口座・在庫・受発注)
・NoSQL が向く場面:データの形が多様で、量が膨大かつ高速処理が必要なとき(SNS・センサーログ・推薦)
RDB は事前に表の形をきっちり決めるため、データの矛盾を防ぎやすい反面、後から項目を増やすのは手間がかかります。NoSQL は形が自由なので変更に強く、複数サーバーへ分散させやすい一方、複雑な関連の集計は苦手なことがあります。
実際のシステムでは両方を組み合わせて使うことも多くあります。「正確さが命の帳簿は RDB、雑多で大量のログは NoSQL」と役割を分けて考えると、設計の見通しが立てやすくなります。
NoSQL がスケール(処理量の拡大)しやすい最大の理由は、データを複数のサーバーに分散して置けるからです。これを水平スケーリング(=台数を増やして対応)と呼びます。
RDB が難しい理由は、表(テーブル)のデータが行をまたいで密接に関連しているからです。RDB では「AさんとBさんのデータをサーバ1と2に分けて置く」とすると、2人の関連を計算するたびにサーバ1と2が通信する必要があります。これが複雑で遅くなります。
一方 NoSQL(特にキー値型やドキュメント型)は、1つのデータが完結した単位(キー → 値 / 1つの文書)になっています。「user:1のデータはサーバ1に置く、user:2のデータはサーバ2に置く」と、データの単位ごとに別のサーバへ割り振れます。取り出すときも1台のサーバに問い合わせれば完結するため、サーバを増やすだけで処理量を増やせます。
身近な例で考えると、本の棚1段に詰め込もうとするか(RDB的)、棚を何段でも増やせるか(NoSQL的)の違いです。棚1段は限界があり強化すると高くつきますが、同じ棚を増やすだけなら安くいくらでも対応できます。
NoSQL ではデータを複数のサーバーに分散するため、書き込みと読み取りを行うサーバーが別になることがあります。そのとき、「書き込んだ直後はまだ他のサーバーに反映されていない」という状態が一瞬起こりえます。これを結果整合性(=最終的には同じ値になる、が、一瞬ずれるかもしれない)と呼びます。
なぜ整合性を少し緩めるのかというと、「全台に同時に書き込みが反映されるまで待つ」ようにすると、スケール(台数を増やして速くする)のメリットが薄れてしまうからです。台数が増えるほど全台が一致するのを待つ時間が長くなり、結果として遅くなります。
つまり、「速さ・量」と「完全な整合性」はトレードオフ(どちらかを取るとどちらかが落ちる関係)にあります。SNSの「いいね数」が1秒ほどずれてもほぼ問題ありませんが、銀行口座の残高は1円もずれてはいけません。どちらを優先するかでRDBかNoSQLかを選ぶことになります。
身近な例で考えると、電光掲示板の更新(NoSQL的:少し遅れてもよい)と現金残高の確定(RDB的:即時に正確でなければならない)の違いです。どちらが正しいかではなく、用途に合った選択が大切です。
Q1.NoSQL データベースの説明として最も適切なものはどれか。
Q2.NoSQL のうち、JSON のような階層を持つ文書単位でデータを格納する種類はどれか。
Q3.SNS の友達関係のように、要素同士のつながり(関係)を効率よく表現・探索するのに適した NoSQL の種類はどれか。