ガイド

SQL vs NoSQL:アプリにはどちらのデータベースを使うべき?

SQLデータベース(リレーショナルデータベースとも呼ばれます)は、定義された構造、つまり行と列を持つテーブルにデータを保存し、関連するテーブル同士をリンクします。問い合わせにはSQL言語を使います。Postgres、MySQL、SQLiteが例です。NoSQLデータベースは、ドキュメント、キーバリューのペア、ワイドカラム、グラフなど、別の方法でデータを保存し、通常はより柔軟な構造を許容します。MongoDB、Redis、DynamoDB、Firestoreが例です。多くのビジネスアプリでは、SQLデータベースが妥当な初期選択です。NoSQLは特定の用途で力を発揮します。

AIで構築するときにこの選択が重要な理由

データベースは、後から変更するのが最も難しいアプリの部品の一つです。画面は午後一つで作り直せますが、何年分もの顧客データを別の種類のデータベースへ移すのはプロジェクトになります。

AIアプリビルダーがデータ保存を追加するとき、ビルダーはこれらのどれかを選んでいます。違いを知っておくと、次のことに役立ちます。

  • データの形を理解する。 後から聞きたい質問(「製品ごとの月別売上」など)にデータが答えられるかを判断できます。
  • プラットフォームの選択を判断する。 ドキュメントデータベースを土台にしたプラットフォームもあれば、リレーショナルデータベースを土台にしたプラットフォームもあります。それぞれの代表例として、SupabaseとFirebaseの比較 をご覧ください。
  • ベンダーロックインを避ける。 SQLは共通の標準なので、リレーショナルデータは通常、プロバイダー間で移行しやすいです。

身近なたとえ

SQLデータベースは、列が厳密に決められた、丁寧に設計されたスプレッドシートの集まりのようなものです。顧客用のシートがあり、注文用のシートがあり、各注文の行はIDで顧客の行を指しています。シート内のすべての行は同じ列を持ちます。事前の計画は必要ですが、シートをまたいだ質問は簡単で、データは整然と保たれます。

NoSQLドキュメントデータベースは、フォルダーが詰まったファイルキャビネットのようなものです。顧客ごとのフォルダーには、その人の詳細と注文がまとめて入っており、あるフォルダーだけに余分な書類が入っていることもあります。1人の顧客の情報をまるごと取り出すのは素早くできます。一方で「先月、全員が何を注文したか」を知るには、多くのフォルダーを開く必要があります。

実際の違い

SQL(リレーショナル)NoSQL
データの形定義された列を持つテーブルドキュメント、キーバリュー、ワイドカラム、グラフ
構造事前にスキーマを定義し、マイグレーションで変更柔軟であることが多く、構造はあったとしてもアプリのコードで保証
関連性外部キーと結合で標準装備通常はデータのネストか、アプリのコードで対応
問い合わせ言語SQL(共通の標準)製品ごとに異なる
整合性強いトランザクションが標準製品と設定によって異なる。現在は多くがトランザクションに対応
スケーリング伝統的にはサーバーを大きくする(スケールアップ)。横に広げることも可能だが難しい多くが多数のサーバーに分散するよう設計されている
得意な用途ビジネスデータ、レポート、関連が多いもの全般非常に大量のシンプルなレコード、キャッシュ、柔軟なコンテンツ
例Postgres、MySQL、SQLite、SQL ServerMongoDB、Redis、DynamoDB、Firestore、Cassandra、Neo4j

「NoSQL」は一つのものではありません。主な種類は次のとおりです。

種類データの保存方法典型的な用途
ドキュメント型(MongoDB、Firestore)JSON形式のようなドキュメントコンテンツ、カタログ、形式がさまざまなレコードを持つアプリ
キーバリュー型(Redis、DynamoDB)キーで値を検索するキャッシュ、セッション、カウンター
ワイドカラム型(Cassandra)柔軟な列の組み合わせを持つ行書き込みが多い巨大なデータセット
グラフ型(Neo4j)ノードと接続SNS、レコメンド

具体例:同じショップのデータを2通りで保存

1人の顧客と、その注文を持つ小さなオンラインショップを考えます。

SQL(リレーショナル): データはテーブルに分けられ、IDでリンクされます。

-- customers: id=1, name='Lena Ortiz'
-- orders:    id=101, customer_id=1, total=42.00
--            id=103, customer_id=1, total=25.00

SELECT c.name, SUM(o.total)
FROM customers c JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;

Lenaがメールアドレスを変更しても、変更は1か所で済みます。「今月の顧客ごとの売上合計」も1回の問い合わせで取得できます。

NoSQL(ドキュメント): 彼女の注文は、彼女のドキュメントの中に入れられます。

{
  "_id": "cust_1",
  "name": "Lena Ortiz",
  "email": "lena@example.com",
  "orders": [
    { "id": 101, "total": 42.00, "items": ["Green tea"] },
    { "id": 103, "total": 25.00, "items": ["Teapot"] }
  ]
}

注文をすべて含めて彼女のプロフィールページを表示するのは、1回の読み取りで済みます。しかし、全顧客にまたがる質問(今月最も売れた製品など)は手間がかかります。同じ製品の詳細が多くの注文にコピーされている場合は、それらを同期させることがアプリ側の仕事になります。

どちらが間違いというわけではありません。問題は、アプリがどのパターンを最も多く使うかです。

選び方

次のような場合は、リレーショナルSQLデータベースが通常の初期選択として適切です。

  • ユーザー、チーム、予約、請求書、製品など、関連するデータが多い。
  • レコードをまたいだレポート、絞り込み、合計が必要になる。
  • 金銭、在庫数、権限など、正確さが重要である。

次のような場合は、NoSQLデータベースの検討に値します。

  • 高速なキャッシュやセッションストアが必要。この用途では Redis がよく使われ、多くは SQL データベースと 併用 されます。
  • イベントログやセンサーの値のように、件数が非常に多く、シンプルで独立したレコードを扱う。
  • Firebaseの Firestore のように、NoSQLを中心に設計されたプラットフォーム上で、そのリアルタイム機能が主な魅力になっている。

SQLを信頼できる情報源(マスター)として使い、キャッシュや特定の機能のためにNoSQLストアを加えるなど、両方を併用しているアプリも多くあります。

主要な用語

用語意味
リレーショナルデータベースリンクされたテーブルで構成されるSQLデータベース。
スキーマデータの定義された構造。
結合(Join)1回の問い合わせで、2つのテーブルの関連する行を組み合わせること。
ドキュメントドキュメントデータベースにおける、自己完結したJSON形式のレコード。
非正規化読み取りを速くするため、データを複数の場所にコピーすること。
ACIDトランザクションが信頼できることを保証する性質。全か無か、一貫性、分離性、永続性を指す。
水平スケーリング1台の大型サーバーではなく、多数のサーバーにデータを分散させること。

よくある誤解

  • 「NoSQLにはスキーマがない」。 データには必ず形があります。NoSQLではデータベースがその形を強制しないことがあるため、代わりにコードがそれを守る必要があります。
  • 「SQLはスケールしない」。 リレーショナルデータベースは非常に大規模なサービスを動かしています。ほとんどのアプリは、その限界に近づくことすらありません。
  • 「NoSQLは常に速い」。 得意とするパターンでだけ速いのです。横断的なレポートは遅くなることがあります。
  • 「一度選んだら変えられない」。 多くのアプリは両方を組み合わせています。また、PostgresのようなSQLデータベースもJSONを保存できるため、少数の柔軟なフィールドのためにNoSQLが必要になるわけではありません。
  • 「NoSQLはSQLを使えないという意味」。 名前は通常「SQLだけではない」と読まれ、一部のNoSQL製品はSQLに似た問い合わせ言語を提供しています。

AIビルダーに聞くこと

  • 「このアプリはどの種類のデータベースを使っていて、なぜ私のデータに合うのですか?」
  • 「テーブルやコレクションと、それらの関係を図に描いてください。」
  • 「6か月後に必要になりそうなレポートは何ですか?このデータベースで簡単に答えられますか?」
  • 「本当に柔軟にすべきフィールドが少数であれば、2つ目のデータベースを追加する代わりに、Postgresの中にJSONとして保存してください。」
  • 「速度の問題が実際に計測されたときにだけ、キャッシュを追加してください。」

Mythexのデータベース

Mythexは、データベースが必要なプロジェクトに専用のPostgresデータベース(リレーショナルSQLデータベース)を用意します。アプリが必要とした時点で、チャットで依頼するか、/database コマンドを使えば追加されます(Database)。これは、ユーザー、予約、注文、レポートといった、多くのビジネスアプリに適しています。ホスト型のドキュメントデータベースなど、特定の外部サービスが必要な場合は、エージェントがプロジェクトのシークレットとして保存したキーを使って接続するコードを書けます。SQLという言語自体について詳しく知りたい場合は、SQLとは何か をお読みください。

よくある質問

SQLとNoSQLの主な違いは何ですか?

SQLデータベースは、定義された構造を持つテーブルにデータを保存し、関連するテーブル同士をリンクします。問い合わせにはSQLを使います。NoSQLデータベースはドキュメント、キーバリューのペア、ワイドカラム、グラフなど別のモデルを使い、通常はより柔軟な構造を許容します。問い合わせ方法は製品ごとに異なります。

NoSQLはSQLより速いのですか?

一概にそうとは言えません。どちらも、それぞれが得意とするアクセスパターンでは速く動きます。キーバリューストアはキーを指定して1件のデータを取り出すのが非常に速く、リレーショナルデータベースは、関連するデータの絞り込み、結合、集計に強みがあります。カテゴリーよりも、設計とインデックスの方が重要です。

スタートアップや小規模アプリにはどちらが良いですか?

顧客、注文、予約、ユーザー、権限といった、多くのビジネスアプリでは、PostgresなどのリレーショナルSQLデータベースが安全な初期選択です。NoSQLは、キャッシュ、特定のプラットフォームでのリアルタイム同期、大量のシンプルで独立したレコードなど、特定の用途で意味を持ちます。

MongoDBはSQLですか、NoSQLですか?

MongoDBはNoSQLのドキュメントデータベースです。テーブルの行ではなく、柔軟なJSON形式のようなドキュメントとしてレコードを保存します。

SQLデータベースにJSONを保存できますか?

はい。Postgresには、JSONを保存・検索するためのjsonb型があります。MySQLとSQLiteもJSONに対応しています。そのため多くのアプリは、別のNoSQLデータベースを使わなくても、リレーショナルな中核に少数の柔軟なフィールドを持たせられます。

Mythex · Pricing · AIでなんでも作ろう · ウェブサイト・アプリのテンプレート · Mythexを比較 · AIアプリ開発用語集 · AIアプリ開発の無料ツール · English

English አማርኛ العربية Български বাংলা Bosanski Català Čeština Dansk Deutsch Ελληνικά Español Español (España) Eesti فارسی Suomi Français Français (Canada) ગુજરાતી हिन्दी Hrvatski Magyar Հայերեն Bahasa Indonesia Íslenska Italiano ქართული Қазақ тілі ಕನ್ನಡ 한국어 Lietuvių Latviešu Македонски മലയാളം Монгол मराठी Bahasa Melayu မြန်မာ Norsk bokmål Nederlands ਪੰਜਾਬੀ Polski Português (Brasil) Português (Portugal) Română Русский Slovenčina Slovenščina Soomaali Shqip Srpski Svenska Kiswahili தமிழ் తెలుగు ไทย Tagalog Türkçe Українська اردو Tiếng Việt 简体中文 繁體中文(香港) 繁體中文(台灣)