リレーショナルデータベース(RDB)とNoSQLの違い:データモデル・スキーマ・結合・一貫性・スケールを比較

関係データベース(リレーショナルデータベース、RDB)は、データを行と列からなる表で表し、SQLで問い合わせます。表どうしを結合した複雑な問い合わせができ、トランザクションのACID特性や、主キー・外部キーなどの制約で、データの整合性を厳密に保ちます。NoSQLは、関係データベース以外のデータベースをまとめて指す言葉で、キー・バリュー型、ドキュメント型、列指向型(ワイドカラム型)、グラフ型などがあります。多くは、データの形式を柔軟にし、複数のサーバに分散して規模を広げやすくする代わりに、結合のような複雑な問い合わせや、厳密な一貫性の一部をあきらめています。どちらが優れているというより、データの形と求める性質で使い分けます。

項目関係データベース(RDB)NoSQL
データの表し方行と列からなる表(関係)。表どうしを共通の値(外部キー)で関連付ける型によって違う。キーと値の組、JSONのような文書、列の集まり、頂点と辺からなるグラフなど
スキーマ列の名前と型を前もって定義する。変えるときは、ALTER TABLEなどで表の定義を変更する前もって厳密に決めなくてよい(スキーマレス)製品が多く、項目の違うデータも同じ所に入れられる
問い合わせ標準の言語であるSQLで、条件による検索、集計、並べ替えなどを宣言的に書ける製品ごとのAPIや問い合わせ言語を使うことが多い。SQLに似た言語を備える製品もある
表の結合JOINで、複数の表を組み合わせた問い合わせができる苦手なものが多い。一緒に読むデータを1つの文書や値にまとめて持たせる設計が多い
トランザクションと一貫性ACID特性を満たすトランザクションで、複数の行や表の更新をまとめて確定できる1つのキーや文書の単位の更新にとどまる製品や、複製の間で更新がすぐにはそろわない結果整合性を許す製品が多い。ACIDのトランザクションを備える製品もある
規模の広げ方1台のサーバの性能を上げるスケールアップが基本。読み出しは複製に分散できるが、書き込みを多数のサーバに分けるのは難しいデータをキーで分けて、多数のサーバに分散するスケールアウトがしやすい
正規化正規化してデータの重複をなくし、更新時の異常を防ぐ読み出しの速さを優先して、同じデータを重複して持たせることが多い
向いている用途会計、在庫、受発注など、整合性が大事で、データの関係が複雑な業務のシステムアクセスが非常に多いWebサービスのセッションやキャッシュ、形の決まっていないデータ、大量のログ、人や物のつながり(グラフ)

数値は代表的な目安で、世代や製品によって異なります。

どんなときに使うか

関係データベース
お金や在庫のように、更新の途中で矛盾が出ては困るデータや、さまざまな条件で結合・集計したいデータを扱うときに向きます。多くの業務のシステムで標準的に使われています。
NoSQL
データの量やアクセスが1台のサーバでは足りないほど多いとき、データの形がそろわず変わりやすいとき、キーで読み書きするだけの単純な操作が中心のときに向きます。目的に合った型を選ぶことが大切です。

よくある質問

NoSQLは「SQLを使わない」という意味ですか?

「Not only SQL(SQLだけではない)」の意味と説明されることが多く、SQLを否定するというより、関係データベース以外の選択肢をまとめて指す言葉として使われます。実際に、SQLに似た問い合わせ言語を使える製品もあります。

NoSQLには、どんな種類がありますか?

代表的なのは4つです。キー・バリュー型は、キーを指定して値を読み書きする単純な操作に特化しています。ドキュメント型は、JSONのような入れ子の構造をもつ文書を単位に保存し、文書の中の項目でも検索できます。列指向型(ワイドカラム型)は、行ごとに異なる列を持て、大量のデータを多数のサーバに分散して書き込むのに向きます。グラフ型は、頂点と辺でデータのつながりを表し、つながりをたどる問い合わせに向きます。

CAP定理は、この比較とどう関係しますか?

CAP定理は、複数のサーバに複製を置く分散データベースが、ネットワークが分断されたときに、一貫性(どのサーバから読んでも最新の値が返る)と可用性(すべての要求に応答する)を同時には完全に満たせないことを示したものです。NoSQLの製品には、可用性を優先し、時間がたてば複製がそろう結果整合性を採用するものが多くあります。

1つのシステムで両方を使うことはありますか?

よくあります。例えば、注文や決済のように整合性が大事なデータは関係データベースに置き、ログイン中の利用者の情報(セッション)やよく読むデータのキャッシュはキー・バリュー型に、商品の説明のように形がそろわないデータはドキュメント型に置く、といった使い分けです。

理解度チェック

NoSQLと呼ばれるデータベースのうち、キー・バリュー型の特徴として、一般に正しいものはどれか。

  1. A表どうしの結合や副問い合わせを含む複雑なSQLを、関係データベースより高速に処理できる
  2. Bデータを書き込む前に、すべての列の名前と型をスキーマとして厳密に定義しなければならない
  3. Cキーを指定して値を読み書きする単純な操作に特化しており、複数のサーバに分散して規模を広げやすいが、表の結合のような複雑な問い合わせには向かない
答えと解説を見る

正解:C. キーを指定して値を読み書きする単純な操作に特化しており、複数のサーバに分散して規模を広げやすいが、表の結合のような複雑な問い合わせには向かない

NoSQLは、関係データベース以外のデータベースをまとめて指す言葉で、キー・バリュー型、ドキュメント型、列指向型(ワイドカラム型)、グラフ型などがあります。キー・バリュー型は、キー(識別子)と値の組を保存し、キーを指定して値を取り出すという単純な操作に特化しています。データをキーで分けて複数のサーバに分散しやすいので、アクセスの量が非常に多いWebサービスで、ログイン中の利用者の情報(セッション)などを保存するのに使われます。その一方で、値の中身による検索や、表の結合のような複雑な問い合わせは苦手で、アプリケーションの側で工夫する必要があります。値の形式を前もって厳密に決めておく必要がない(スキーマレス)製品が多いのも特徴です。また、分散した複製の間で、更新がすぐにはそろわない結果整合性を許す製品もあります。

複数のサーバにデータの複製を置く分散データベースについての、CAP定理の説明として適切なものはどれか。

  1. Aサーバ間のネットワークが分断されたときには、どのサーバから読んでも最新の値が返る一貫性と、すべての要求に応答する可用性を、同時には完全に満たせない
  2. B一貫性、可用性、分断耐性の3つは、適切に設計すれば常に同時に満たせる
  3. C分断耐性とは、サーバ間のネットワークが分断されないように、回線を二重化することをいう
答えと解説を見る

正解:A. サーバ間のネットワークが分断されたときには、どのサーバから読んでも最新の値が返る一貫性と、すべての要求に応答する可用性を、同時には完全に満たせない

CAP定理は、分散したデータベースが、一貫性(Consistency: どのサーバから読んでも最新の書き込みの結果が返る)、可用性(Availability: 故障していないサーバは、すべての要求に応答を返す)、分断耐性(Partition tolerance: サーバ間の通信が途絶えても、システムとして動き続ける)の3つを、同時にすべて完全には満たせないことを示したものです。ネットワークの分断は現実には避けられないので、要点は、分断が起きたときに、一貫性を優先して一部の要求への応答を止めるか、可用性を優先して古い値を返すことを許して応答を続けるかを選ぶ必要がある、ということです。分断が起きていないときは、一貫性と可用性の両方を満たせます。NoSQLの製品には、可用性を優先し、時間がたてば複製がそろう結果整合性を採用するものが多くあります。分断耐性は回線を二重化することではなく、分断が起きても動作を続ける性質のことです。

関係データベースの表を正規化する主な目的はどれか。

  1. A表の数を減らして、どんな検索も結合なしで速く行えるようにすること
  2. Bデータを暗号化して、許可のない利用者に読まれないようにすること
  3. Cデータの重複をなくし、更新したときに内容が食い違うなどの異常を防ぐこと
答えと解説を見る

正解:C. データの重複をなくし、更新したときに内容が食い違うなどの異常を防ぐこと

正規化は、列どうしの関数従属(ある列の値が決まると、別の列の値が1つに決まる関係)に基づいて表を分割し、同じ事実が何か所にも記録されないようにする設計の手順です。例えば、社員表の各行に部署名まで書いておくと、部署名を変えるときに、その部署の社員の行をすべて書き換えなければならず、書き換え漏れがあると内容が食い違います(更新時異常)。ほかにも、社員がまだいない部署を登録できない(挿入時異常)、最後の1人の社員を削除すると部署の情報まで消える(削除時異常)といった問題が起きます。部署の情報を部署表に分けておけば、部署名は1か所を直すだけで済みます。一方、表が分かれる分、検索のときに結合が増えるので、正規化すると検索が速くなるとは限りません。

  1. 読み出しが大部分を占める集計用のデータベースで、正規化した表をあえて1つにまとめ、同じデータを重複して持たせる設計(非正規化)を行うことがある。この設計の長所と短所の組み合わせとして正しいものはどれか。
  2. トランザクションが持つべきACID特性のうち、「口座Aから引き落として口座Bに入金する振替の処理が、途中で障害が起きても、両方とも行われるか、まったく行われないかのどちらかになる」という性質はどれか。

データベースの基礎の練習問題へ

関連する用語の解説

関係データベース
データを行と列からなる表(関係、リレーション)で表し、表どうしを共通の値で関連付けて扱うデータベース。リレーショナルデータベース(RDB)とも呼ぶ。SQLで問い合わせや更新を行い、主キーや外部キーなどの制約でデータの整合性を保つ。
NoSQL
関係データベース以外のデータベースの総称。キー・バリュー型、ドキュメント型、列指向型、グラフ型などがある。複数のサーバに分散して規模を広げやすく、データの形式を柔軟にできる製品が多い一方、表の結合のような複雑な問い合わせや、厳密な一貫性は苦手なことが多い。
SQL
関係データベースで、表の定義、データの検索・追加・更新・削除、権限の制御などを行うための標準の言語。ISO/IECとJISで規格化されている。SELECT、INSERT、UPDATE、DELETE、CREATE TABLE、GRANTなどの文がある。
トランザクション
データベースに対する一連の処理を、まとめて1つの単位として扱うもの。COMMITで処理の結果を確定し、ROLLBACKで開始前の状態に戻す。原子性・一貫性・独立性・耐久性(ACID特性)を満たすように、DBMSがロックやログを使って管理する。
ACID特性
トランザクションが満たすべき4つの性質の頭文字。原子性(Atomicity: すべて実行されるか、まったく実行されないか)、一貫性(Consistency: 整合性の制約を満たし続ける)、独立性(Isolation: 同時に実行しても互いに干渉しない)、耐久性(Durability: コミットした結果は障害でも失われない)。
正規化
関係データベースの表を、列どうしの関数従属に基づいて分割し、同じ事実が何か所にも記録されないようにする設計の手順。データの重複をなくし、更新時異常・挿入時異常・削除時異常を防ぐ。第1正規形から第3正規形、ボイス・コッド正規形などの段階がある。
主キー
表の中の1行を一意に識別するための列、または列の組。値が重複せず、NULLを含まないという制約を持つ。行を一意に識別できる最小限の列の組(候補キー)の中から1つを選んで主キーにする。
外部キー
ほかの表の主キー(または一意な列)を参照する列。参照先に存在する値かNULLしか入れられないという参照整合性制約により、存在しない行を指すデータが入るのを防ぐ。参照先の行を削除・更新したときの動作(拒否、連鎖して削除など)も指定できる。

関連する比較