JSONをデータベースに保存するか、キーごとに新しい列を作成するか 質問する

JSONをデータベースに保存するか、キーごとに新しい列を作成するか 質問する

私は、ユーザー関連のデータをテーブルに格納するために次のモデルを実装しています。2 つの列uid(主キー) と、metaユーザーに関するその他のデータを JSON 形式で格納する列があります。

 uid   | meta
--------------------------------------------------
 1     | {name:['foo'], 
       |  emailid:['[email protected]','[email protected]']}
--------------------------------------------------
 2     | {name:['sann'], 
       |  emailid:['[email protected]','[email protected]']}
--------------------------------------------------

uidこれは、、、などの多くの列がテーブルに含まれる、プロパティごとに 1 列のモデルよりも優れた方法 (パフォーマンス面、設計面) でしょうかnameemailid

最初のモデルの気に入っている点は、制限がなく、できるだけ多くのフィールドを追加できることです。

また、最初のモデルを実装したので、疑問に思いました。たとえば、「foo」のような名前を持つすべてのユーザーを取得するには、どうすればクエリを実行できますか?

質問- ユーザー関連データをデータベースに保存するには、JSON とフィールドごとの列のどちらを使用するのがよいでしょうか (フィールドの数は固定されていないことに注意してください)? また、最初のモデルが実装されている場合、上記のようにデータベースをクエリするにはどうすればよいですか? クエリで検索される可能性のあるすべてのデータを別の行に保存し、その他のデータを JSON (別の行) に保存して、両方のモデルを使用する必要がありますか?


アップデート

検索を実行する必要がある列はそれほど多くないので、両方のモデルを使用するのが賢明でしょうか? 検索する必要があるデータには列ごとのキーを使用し、その他のデータには JSON (同じ MySQL データベース内) を使用するのでしょうか?

ベストアンサー1

2017年6月4日更新

この質問/回答が人気を集めていることを考えると、更新する価値があると思いました。

この質問が最初に投稿されたとき、MySQLはJSONデータ型をサポートしておらず、PostgreSQLでのサポートも初期段階でした。5.7以降、MySQLJSONデータ型をサポートするようになりました(バイナリストレージ形式)、PostgreSQLJSONB大幅に成熟しました。どちらの製品も、JSON オブジェクトの特定のキーのインデックス作成のサポートなど、任意のドキュメントを保存できる高性能な JSON 型を提供します。

ただし、リレーショナル データベースを使用する場合のデフォルトの設定は、依然として列/値であるべきだという私の最初の発言は変わりません。リレーショナル データベースは、その中のデータがかなり適切に正規化されているという前提で構築されています。クエリ プランナーは、JSON ドキュメント内のキーを見るときよりも、列を見るときに最適化情報を得ます。外部キーは列間で作成できます (ただし、JSON ドキュメント内のキー間では作成できません)。重要な点: スキーマの大部分が JSON の使用を正当化するほど不安定である場合は、リレーショナル データベースが適切な選択であるかどうかを少なくとも検討する必要があります。

とはいえ、完全にリレーショナルまたはドキュメント指向のアプリケーションはほとんどありません。ほとんどのアプリケーションでは、その両方が混在しています。以下は、リレーショナル データベースで JSON が便利だと私が個人的に感じた例です。

  • 連絡先のメールアドレスと電話番号を保存する場合、JSON配列の値として保存すると、複数の個別のテーブルよりもはるかに簡単に管理できます。

  • 任意のキー/値のユーザー設定を保存する (値はブール値、テキスト、数値のいずれかで、異なるデータ型ごとに別々の列を用意する必要はありません)

  • 定義されたスキーマを持たない構成データを保存する(Zapier または IFTTT を構築していて、各統合の構成データを保存する必要がある場合)

他にもたくさんあると思いますが、これらはほんの一例です。

元の回答

制限なし(任意のドキュメント サイズ制限以外)で必要な数のフィールドを追加できるようにしたい場合は、MongoDB などの NoSQL ソリューションを検討してください。

リレーショナル データベースの場合: 値ごとに 1 つの列を使用します。列に JSON BLOB を配置すると、クエリが事実上不可能になります (実際に機能するクエリが見つかった場合、非常に遅くなります)。

リレーショナル データベースは、インデックス作成時にデータ型を活用し、正規化された構造で実装されるように設計されています。

補足として、これはリレーショナル データベースに JSON を決して保存してはいけないと言っているわけではありません。真のメタデータを追加する場合、またはクエリする必要がなく表示のみに使用される情報を JSON で記述する場合、すべてのデータ ポイントに対して個別の列を作成するのはやりすぎかもしれません。

おすすめ記事