web-dev-qa-db-ja.com

オブジェクトまたは文字列を使用してデータベースにデータを保存するより効率的な方法はどれですか(データベース設計)

データベースにデータを保存するのにどちらの方法が適していますか?その理由これがレストランの例です。 SQLデータベースとJSONを使用してデータベースと通信しています。

各行がデータベースの列であると想像してください

  1. 主にオブジェクトなし

    • レストランID-文字列
    • レストラン名-文字列
    • レストランの写真-ハイパーリンク
    • レストランの説明-文字列
    • レストラン時間-文字列
    • レストランは営業しています-ブーラン
    • レストランのタイプ-文字列
    • 場所-緯度と経度を含む文字列
    • レストランメニュー-オブジェクトの配列{アイテム名、価格、説明、タイプ、写真}
    • レストランの評価-オブジェクトの配列{rating、description、critic_id}
  2. 主にオブジェクト

    • レストランID-文字列
    • レストラン情報-オブジェクト{名前、写真、説明、時間、isOpen、タイプ、場所}
    • レストランメニュー-オブジェクトの配列{アイテム名、価格、説明、タイプ、写真}
    • レストランの評価-オブジェクトの配列{rating、description、critic_id}
1
Sebastian

リレーショナルSQLデータベースにはオブジェクトはなく、データをマップして、最終的にすべてがテーブル内の基本的なdbタイプ(int、strings ...)の1つのフィールドに入るようにする必要があります。

最初のスキームについての注意:SQLにも配列はありません。配列を独自の行を持つテーブルに変換し、配列項目をレストランIDに接続できるようにする外部キーを追加する必要があります。

オブジェクトの利点を維持するには、両方の世界間のマッピングを作成するデータソースレイヤーでデータベースマッピングを分離する必要があります。したがって、後でdbコンポーネントを変更する場合、すべてのコードに問題を追加することはありません。たとえば、ある時点で、MongoDBなどのSQLなしのドキュメントデータベースに切り替える場合、オブジェクトアプローチの方が適しています。

1
Christophe

パフォーマンスとレプリケーションの容易さが問題になる可能性がありますが、sqlとnosqlのどちらを使用するかを決定する場合は、データの構造または不足を考慮してください。

あなたは飲食店を追跡するためのかなり単純なデータ構造を提案したので、それは重要ではないと思います。ただし、ファストフードレストランでは固有の情報が必要であり、ハイエンドの5つ星レストランではデータ要件のセットがまったく異なるため、もう少し複雑にする必要がある場合はどうなりますか。両方を同じデータ構造で管理しようとすると、複雑になる可能性があります。 NoSQLデータベースは、このタイプのものを少しよく処理する傾向があります。データは通常、クエリしたい方法で構造化されています-ブーム、それは非常に高速に実行されます。

SQLデータベースは、データが通常はデータで満たされる列(変動や驚きがない)にうまく収まる場合に、よりよく実行される傾向があります。他のテーブルのデータに関連付けることができると、一貫性が提供され、データをクエリする予期しない複雑な方法が可能になります。インデックス作成は両方の長所を試し、提供することができますが、自分が何をしているのかをよく理解し、変更を加えることによるパフォーマンスへの影響を考慮する必要があります。たぶん変更を加えることは大したことではありません。結局のところ、レストランは3秒ごとに変わるわけではありません。

これが学習状況でない限り、あなたが最もよく知っている状況で行ってください。必要に応じてタイムリーにTweakで変更できます。いくつかの指標を早い段階で決定し、それらを監視して、間違ったプラットフォームを使用していることを示唆するインジケーターがポップアップする可能性があることを把握します。

1
JeffO

両方してください。 doxdbでは、そのアプローチを使用しました。コンセプトは、クエリされるデータを格納し、実際のデータとは別にインデックスを作成することです。そうすることで、スキーマ設計をもう少し自由にすることができます。

Mongoまたはelastic searchを使用してこれを行うこともできます。

0