2

次のスタックオーバーフロー、より具体的には質問の評価を処理するスキーマの部分のためにDBスキーマを設計しているとしましょう。

次のようなテーブルを使用すると思います:
ratings(question_id、user_id、rating)
...これは、評価を記録し、同じ質問に2回投票するユーザーがいないことを確認します。

そのテーブルだけで評価データを処理できますが、クエリが遅くなる可能性があります。

パフォーマンスを考慮して、このデータは評価テーブルのデータから派生しているため冗長になる場合でも、各質問の評価の合計を質問テーブルに保存することを検討しますか?

4

3 に答える 3

6

私は通常、質問テーブルの評価の合計を非正規化するのではなく、正規化されたモデルから始めます。

次に、アプリケーションが十分に機能しているときに、いくつかのパフォーマンステストを実行して、アプリケーションが本番環境で期待する負荷と比較して、負荷を十分に処理できるかどうかを判断します。

負荷を十分に処理できない場合は、ボトルネックをチェックし、アプリケーションが正常に機能するまで、最も重要なボトルネックを修正します。

アプリケーションが本番環境に移行した後、Webサイトに多くのopfユーザーがいる場合は、さらに最適化を行う必要があります。


物事を簡単にするために:

  • 過度に最適化しないでください
  • アプリケーションを機能させる
  • 動作したら、ベンチマークします
  • 必要に応じて/必要に応じて最適化


結局のところ、はい、多分、質問テーブルへの評価の合計を非正規化することが役立つかもしれません; しかし、あなたはそれをする必要がありますか?

それが本当の質問です;-)

于 2010-02-03T12:29:47.000 に答える
0

テーブルを事前に集計することを計画している場合は、マテリアライズドビュー(T-SQLのインデックス付きビュー)を確認する価値があります。

于 2010-02-03T12:25:48.003 に答える
0

一般に、データが書き込まれるよりもはるかに頻繁に読み取られることがわかっている場合は、集計値を格納するのが有効なアプローチです。この特定のケースでは、回答テーブルの物理的な設計を途中で行うことも検討します。これにより、集計が安価になります。そのためには、query_id、answer_idでクラスター化インデックスを定義します。その結果、特定のクエリに対するすべての回答を取得するために、ディスクからいくつかのDBページのみが読み取られます。

于 2010-02-03T18:25:45.197 に答える