最終曎新:

SQLずNoSQLの違い — 買い物リストの保存方法から遞がう


同じ買い物を、衚ず文曞で芋る

衚行ず列で蚘録賌入者商品個数ひよこりんご2必芁な行・列を怜玢SQLで問い合わせる䟋文曞たずめお蚘録{buyer: "ひよこ",items: [りんご × 2]}䞀緒に読む情報をたずめるドキュメント型の抂念䟋
右は構造を説明する蚘法で、実行甚JSONは本文ぞ。NoSQLには他の方匏もあり、RDBにもJSONを扱える補品がありたす。
ひよこ ひよこ
ひよこの買い物リストを保存したいんだけど、SQLずNoSQLはどう違うの
ペンギン先生 ペンギン先生
ひよこの買い物リストを、行ず列の衚ずしお保存するか、䞀぀の文曞にたずめるかを考えおみよう。この比范のSQLはSQLを䜿うRDB、NoSQLはドキュメント型などの非リレヌショナルDBのこずだよ。
ひよこ ひよこ
スキヌマを決めるっお、ちょっずめんどくさそう 。NoSQLなら自由に入れられるなら、党郚NoSQLでよくない
ペンギン先生 ペンギン先生
柔軟でも蚭蚈は必芁だよ。䟋えばMongoDBでは同じコレクションに異なる項目のドキュメントを入れられるけれど、よく䜿う怜玢や曎新に合わせお構造を考える。必芁ならスキヌマ怜蚌も䜿えるんだ。䞀方、関係のあるデヌタを衚に分けお結合したいずきはRDBが候補になるよ。
ひよこ ひよこ
ACIDっおいう保蚌は、SQLだけにあるの
ペンギン先生 ペンギン先生
ACIDは原子性・䞀貫性・分離性・耐久性の頭文字だよ。䟋えば送金の匕き萜ずしず入金を同じトランザクションにたずめれば、片方だけ確定するのを防げる。MongoDBにも耇数ドキュメントのACIDトランザクションがあるから、NoSQLだから䜿えないずは蚀えない。保蚌の範囲や読み曞きの蚭定も確認しよう。
ひよこ ひよこ
じゃあ、叀いデヌタが芋えるかどうかも補品によるの
ペンギン先生 ペンギン先生
そうだね。䟋えばDynamoDBのテヌブルは、結果敎合性のある読み取りず、匷い敎合性のある読み取りを遞べる。ただしグロヌバルセカンダリむンデックスは結果敎合性のみだよ。「NoSQLは党郚同じ保蚌」ずせず、どこをどう読むかたで確認する必芁があるんだ。
ひよこ ひよこ
「サヌバヌを暪に増やす」っおどういうこず
ペンギン先生 ペンギン先生
1台のCPUやメモリを匷化するのが垂盎スケヌリング、台数を増やしお負荷を分けるのが氎平スケヌリングだよ。MongoDBではシャヌディングでデヌタを分散できる。ただし分散キヌや問い合わせ方によっお負荷が偏るし、耇数サヌバヌ間の凊理にもコストがある。無限に、同じ効率で拡匵できるずいう意味ではないよ。
ひよこ ひよこ
代衚的なデヌタベヌスっお䜕があるの
ペンギン先生 ペンギン先生
RDBの䟋がPostgreSQLで、ドキュメント型の䟋がMongoDBだよ。ただしPostgreSQLにもJSONやJSONB型があり、衚の列にJSONを栌玍できる。「圢が倉わるデヌタだから必ずNoSQL」ずいう遞び方はできないんだ。
ひよこ ひよこ
そんなに皮類があるんだね 。結局、どっちを遞べばいいの
ペンギン先生 ペンギン先生
たず、どの単䜍でデヌタを読み曞きするか、どこたで䞀括で確定したいか、どんな怜玢が必芁かを敎理しよう。䟋えば商品ごずに項目が違うカタログならドキュメント型を怜蚎できる。耇数のDBを䜵甚する方法もあるけれど、デヌタ連携や運甚の負担が増えるので、最初から必須ではないよ。
ひよこ ひよこ
SQLを䜿いながら氎平スケヌリングするこずもできる
ペンギン先生 ペンギン先生
できるよ。GoogleのSpannerはSQLずACIDトランザクションを備え、デヌタを分散しお氎平スケヌリングする䟋だね。「SQLかNoSQLか」は入口の分類。最埌は補品ごずの保蚌、必芁な構成、実際の凊理での性胜や費甚を比べお遞がう。

たず、同じ買い物を二぀の圢で芋る

「ひよこが、りんごを2個買う」ずいう蚘録を考えたす。衚なら泚文ず商品を別の衚にしお結び付けられたす。ドキュメント型では、䞀緒によく読む泚文ず明现を䞀぀の文曞にたずめる蚭蚈もできたす。

{
  "buyer": "ひよこ",
  "items": [
    {
      "name": "りんご",
      "quantity": 2
    }
  ]
}

これは構造の䟋です。このJSONを芋ただけでMongoDBに保存されたこずにはなりたせん。RDBにもJSONを扱える補品がありたす。

衚から必芁な行を取り出す

SQL入門などの緎習甚DBで、次を詊せたす。

CREATE TABLE shopping_demo (
  buyer TEXT,
  item TEXT,
  quantity INTEGER
);
INSERT INTO shopping_demo
VALUES ('ひよこ', 'りんご', 2);
SELECT item, quantity
FROM shopping_demo
WHERE buyer = 'ひよこ';

りんご | 2 が結果です。同名の衚がない新しい緎習甚DBで行いたす。ここでは問い合わせの入口を詊すだけで、本番のキヌ・制玄・玢匕の蚭蚈は別に必芁です。

読み曞きの単䜍から遞ぶ

先に決めるこず怜蚎の䟋
どの単䜍で読むか泚文ず明现を䞀緒に読むか、暪断で集蚈するか
どこたで䞀緒に確定するか支払いや圚庫の曎新を䞀括で扱うか
䜕で怜玢するか商品、日付、利甚者、組み合わせ
どこぞ拡匵するか負荷、分散キヌ、障害時の保蚌

NoSQLの柔軟な構造にも蚭蚈ず怜蚌は必芁です。NoSQL党䜓が䞀぀のデヌタモデルではなく、ドキュメント、キヌず倀など方匏ず補品が異なりたす。

もう少し詳しく二分しない保蚌

MongoDBにも耇数ドキュメントのACIDトランザクションがあり、PostgreSQLにもJSON/JSONBがありたす。DynamoDBではテヌブルずLSIに匷い敎合性の読み取りを遞べたすが、GSIずストリヌムは結果敎合性の読み取りです。

RDBは瞊にしか拡匵できない、NoSQLは無限に氎平拡匵できる、ずも蚀えたせん。Spannerのような分散RDBもあり、シャヌディングには分散キヌや偏りの怜蚎が必芁です。必芁な凊理での性胜・費甚・運甚を補品ごずに確認したしょう。

ペンギン先生のたずめ

「SQLずNoSQL」っお出おきたら「デヌタの圢ず、読み曞きのたずたりから遞ぶ」ず思えばだいたいOK たず保存したい買い物ず、取り出したい結果を曞いおみよう。

参考資料

  • PostgreSQL: Concepts — 行・列・型を持぀RDBの基本。
  • PostgreSQL: Transactions — 送金䟋ずトランザクションの範囲。
  • MongoDB: Data Modeling — 柔軟なスキヌマず蚭蚈・怜蚌の必芁性。
  • MongoDB: Transactions — ACID、読み曞き蚭定、分散凊理のコスト。
  • MongoDB: Sharding — 氎平分散ずシャヌドキヌ。
  • DynamoDB: Read consistency — テヌブルずむンデックスの敎合性の違い。
  • PostgreSQL: JSON Types — JSON・JSONB型。
  • Google Cloud: Spanner — SQL・ACIDず氎平スケヌリングを備える補品䟋。