モデリングソリューションの選択には助けが必要です。1対多の関係クエリでカウントするためのベストモデリング
私はテーブルBの多くの他のものに関連するレコードを持つテーブルAを持っています:例えば、テキスト(A)とそれを好んだユーザー(B)または製品(A)xレビュー(B)
だから、どれくらいの人がテキストをお気に入りにしたり、商品をレビューしたかを知りたい。これは、この状況のための唯一のクエリですが、テーブルが増えるにつれて複雑になることがあります。たとえば、クチコミ+商品に含まれているクチコミ+写真のレビューやレビューが全くないユーザー名を見つけたり、レビューに関連しているが調整のためにブロックされたりしているユーザー名を検索するなどです。表Aは、ちょうどテーブルBに関連しているレコード数をカウントするための列を持っている場合
はまだ、それは私が知っている、そのためにクエリを実行することは可能ですが、...
はそれがより良いソリューションですか? Favorite_Count、review_count、review_avgのように...
これは、誰かが好きな、または好きなものを選んでいないときに、ちょっとしたコーディングと引き換えに、複雑なクエリで「結合を保存する」でしょう。結局のところ、クエリは読みやすく、おそらく速いでしょう。
あなたはどう思いますか?
このようにして集計データをテーブルに格納することは避けています。あなたのアプリケーションが誰かが言うべきことを誤っている場合は、これらの数字が一致していない場合、一致するかどうかを確認するプロセスが必要になります。次に、悪いアプリケーション書き込みを修正するためにアグリゲータを実行する頻度を管理します。他のアプリケーションがオンラインで購入されている間に、集計に問題が発生する可能性があります。 GROUP BYとINNER JOINSはお友達です。おそらく、読取り専用のデータベースを調べると、そこでレポートが実行され、そこでデータが平坦化される可能性があります。 –
私はKamilのポイントを見ています。非常に重い読書状況では、あなたのBaseテーブルに更新された情報を管理することの複雑さを理解することができました。しかし、私はRossと通常は別の障害ポイント。さらに、詳細なデータと、パーティション化されたウィンドウ関数などの集約されたテクニックと適切なインデックスを持つCROSS APPLYが必要な場合は、最適化を行うことで、読み取り速度を速く保つことができます。 – Matt
しかし、システムはAPIなどの外部からの入力を受けないので、実際には更新エラーは起こりそうにありません。とにかくそれは良い点です。 しかし実際の例を見てください。これは私がやろうとしていることであり、難しいです:http://stackoverflow.com/questions/40346096/designing-and-querying-product-review-system 私はブロックされていないレビューや製品を検討する必要があります数えられるだけでなく、レビューを平均化する(ブロックされずに隠されていないもののみ)。 私はSQLの専門家ではないので、それは私にとっては難しいことです。 : – mEba