2

私の質問は具体的というより一般的ですが、アイデアを伝えるために例を使用しています。

私はフォーラムを持っており、各リプレイでユーザーのメッセージ数を提示しています。

一部のページに 15 人の異なるユーザーがいて、それぞれに 20,000 件以上のメッセージがあると仮定すると、ユーザーが持っているメッセージ テーブルのエントリ数を数えてメッセージ数を再計算する必要がありますか、それともユーザー テーブルに列を作成する方がよいでしょうか?このデータを含む列を作成し、返信が行われるたびに列を更新しますか?

データベースの正規化規則に違反していることはわかっていますが、毎回計算するのは非常に無駄に思えます。

問題があれば、mySQL を使用しています。

4

5 に答える 5

2

一般的にはありませんが、特定のケースではあります。

データベースに冗長なデータを持たないようにする必要があります。ただし、適切なパフォーマンスを得るには、そのトレードオフを行う必要がある場合があります。

私は実際にあなたの例とまったく同じことをしました。パフォーマンスには優れていますが、メッセージ数を正しく保つのは非常に困難です。遅かれ早かれ矛盾する値が得られるため、値を定期的に調べて再計算する方法を計画する必要があります。

于 2012-09-22T20:07:18.370 に答える
1

あなたは denormalization について話しているウィキペディアの引用

非正規化とは、冗長データを追加するか、データをグループ化することによって、データベースの読み取りパフォーマンスを最適化しようとするプロセスです。

非正規化されたデータを「プレーンな」コードに保持するのは簡単なことではありません。覚えておいてください:

  • トリガーを使用して冗長データを保持できます。
  • アーキテクチャにORMが含まれている場合は、冗長データを保持するのがより簡単になります。
于 2012-09-22T20:13:41.647 に答える
0

マテリアライズドビューについて誰も言及していないことに驚いています。これらのオブジェクトは、実際のデータの正規化に違反することなく、パフォーマンス上の理由からデータの集計を維持する場合に非常に役立ちます。 詳細をご覧ください

于 2012-09-23T22:36:34.110 に答える
0

行数のカウント結果をベンチマークしようとしましたか? ビューで計算することをお勧めします。あなたが提案している非正規化では、データ破損のリスクにさらされているだけです。投稿数の列は、実際の投稿数とは関係のない任意の値になります。

于 2012-09-24T14:05:10.710 に答える
0

また、非正規化を途中で行うこともできます。ユーザーごとの月次データを含むテーブルを作成し、月次ジョブで埋めて、その月の 1 日以降のメッセージ + 月次データの合計をカウントすることにより、その場でメッセージ数を計算します。または、月ごとのデータが必要ない場合でも、月ごとにその場で計算できます + EOM 図を更新する月ごとのプロセス。それはトリガーを避けるでしょう...

于 2012-09-22T20:26:27.303 に答える