2017年6月4日更新
この質問/回答がある程度人気を博していることを考えると、更新する価値があると思いました。
この質問が最初に投稿されたとき、MySQLはJSONデータ型をサポートしておらず、PostgreSQLでのサポートはまだ始まったばかりでした。 5.7以降、MySQL JSONデータ型をサポートするようになりました (バイナリストレージ形式)、およびPostgreSQL JSONB 大幅に成熟しました。どちらの製品も、JSONオブジェクトの特定のキーのインデックス作成のサポートなど、任意のドキュメントを保存できるパフォーマンスの高いJSONタイプを提供します。
ただし、リレーショナルデータベースを使用する場合のデフォルトの設定は、値ごとの列である必要があるという元のステートメントを引き続き支持します。リレーショナルデータベースは、データベース内のデータがかなり適切に正規化されることを前提として構築されています。クエリプランナーは、JSONドキュメントのキーを表示する場合よりも、列を表示する場合の方が最適化情報が優れています。外部キーは列間で作成できます(ただし、JSONドキュメントのキー間では作成できません)。重要:スキーマの大部分がJSONの使用を正当化するのに十分なほど揮発性である場合は、少なくともリレーショナルデータベースが正しい選択であるかどうかを検討することをお勧めします。
とはいえ、完全にリレーショナルまたはドキュメント指向のアプリケーションはほとんどありません。ほとんどのアプリケーションには、両方が混在しています。リレーショナルデータベースでJSONが役立つと個人的に感じた例を次に示します。
-
連絡先のメールアドレスと電話番号を保存する場合、JSON配列に値として保存する方が、複数の個別のテーブルよりも管理がはるかに簡単です。
-
任意のキー/値のユーザー設定を保存します(値はブール値、テキスト、または数値であり、データ型ごとに別々の列を使用したくない場合)
-
スキーマが定義されていない構成データの保存(ZapierまたはIFTTTを構築していて、統合ごとに構成データを保存する必要がある場合)
他にもあると思いますが、これらはほんの一例です。
元の回答
制限なしで(任意のドキュメントサイズ制限を除いて)必要な数のフィールドを本当に追加できるようにしたい場合は、MongoDBなどのNoSQLソリューションを検討してください。
リレーショナルデータベースの場合:値ごとに1つの列を使用します。 JSON BLOBを列に配置すると、クエリを実行することが事実上不可能になります(実際に機能するクエリを見つけると、非常に遅くなります)。
リレーショナルデータベースは、インデックス作成時にデータ型を利用し、正規化で実装することを目的としています。 構造。
ちなみに、これは、JSONをリレーショナルデータベースに保存してはいけないということではありません。真のメタデータを追加する場合、またはJSONがクエリする必要のない情報を記述している場合 表示にのみ使用されるため、すべてのデータポイントに個別の列を作成するのはやり過ぎかもしれません。