FIG-120

NoSQLとRDBMS — カチッとした表か、何でも入る段ボールか

データベース 2026.10.13 公開 読了 約9分

データベースには大きく2つの性格があります。1つはRDBMS(MySQL、PostgreSQLなど)。列の名前と型が決まったカチッとしたエクセルの表で、決まった形のデータしか受け付けません。もう1つはNoSQL、なかでもドキュメントDB(MongoDBなど)。こちらは何でも入る段ボールで、形がバラバラでも黙って受け取ります。

どちらが優れているかではなく、違いは「データの形を、いつ確かめるか」にあります。下の図1で、形の違う5人分の会員データを表と段ボールに同時に入れて、そのあと読み出してみてください。

RDBMS vs DOCUMENT DB — 入口で検品するか、何でも受け取るか
① 入れる会員データ クリックすると、表と段ボールの両方に入れる
RDBMS — カチッとした表
ドキュメントDB — 何でも入る段ボール 形の決まりなし
表が入口で断った 0件
段ボールが受け取った 0件
段ボールで、読むときに困った —
READY
会員データを1枚ずつ入れてみる
上のカードをクリックすると、同じデータが表と段ボールの両方に入ります。まずは「ふつうの会員」から。何枚か入れたら、下の②読み出すボタンも押してみてください。
図1 — 表は形の合わないデータを入口で断る。段ボールは何でも受け取るが、確かめる仕事は読む側に回ってくる

RDBMS — 入口で検品する

RDBMSでは、データを入れる前にスキーマ(列の名前・型・必須かどうか)を決めておきます。図1の表なら「name と email は必須、age は整数」。この約束に合わないデータは、書き込みの時点でエラーになります。年齢に「二十歳」と書いてきても、name を nmae と打ち間違えても、入口で止まる。

これは面倒に見えて、実は大きな安心です。表に入っている時点で形が正しいことが保証されているので、読む側は何も疑わずに平均を出したり、名前で並べたりできる。複数の表を JOIN でつなぐ、残高をトランザクションで守る、といった「データの正しさ」が大事な仕事が得意なのもこのためです。

代わりに、形を変えるのが重い。電話番号を持たせたくなったら ALTER TABLE で列を足し、既存の全行にも空欄(NULL)ができます。図1では一瞬ですが、何億行もある本番の表では、慎重な計画が要る作業になります。

ドキュメントDB — 何でも受け取り、出口で困る

ドキュメントDBは、1件ごとに好きな形のまましまえます。ある人だけ電話番号がある、住所を入れ子のまま1枚に持たせる――どれも準備なしで入ります。仕様がどんどん変わる開発初期や、項目が人によってバラバラなデータ(商品ごとに違うスペック、ログ、設定など)と相性が良いのはこのためです。

ただし「形の決まりがない」は、形を確かめる仕事が消えたという意味ではありません。読む側に移っただけです。図1で年齢の平均を出すと、文字の「二十歳」で計算が止まり、名前の一覧には nmae のせいで名前のない人が混ざります。これをスキーマオンリード(読むときに形を解釈する)と呼び、RDBMSのやり方はスキーマオンライト(書くときに形を確かめる)と呼ばれます。

用語ミニ辞書
スキーマ
データの形の約束。列の名前、型、必須かどうかなど。
RDBMS
行と列の表でデータを持ち、SQLで操作するデータベース。表どうしを JOIN でつなげる。
ドキュメントDB
JSONのような1件ずつの文書を、そのままの形でしまうNoSQLの一種。入れ子もそのまま持てる。
スキーマオンライト / オンリード
形を書き込み時に確かめるか、読み出し時に解釈するか。確かめる仕事の置き場所の違い。
ALTER TABLE
表の形(列の追加・型の変更など)を変えるSQL。大きな表では時間とリスクを伴う。

まとめ

RDBMSは入口で検品するカチッとした表、ドキュメントDBは何でも受け取る段ボールです。検品の手間は、どちらを選んでもなくなりません。書くときに一度だけ払うか、読むたびに払うかの違いです。形がはっきりしていて正しさが大事なデータ(会員、注文、お金)は表に、形がバラバラで変わりやすいデータは段ボールに。実際のサービスでは、両方を使い分けていることも珍しくありません。