3


0

MySQLデータベースに冗長列を含めることがベストプラクティスであることは疑問に思います。 データベースにUserテーブルがありますが、個々のユーザーに関する多くの統計を表示できるようにしたいので、これを考えています。 これらの統計には、ユーザーが別のモデルと対話した回数や、メッセージの数が含まれる場合があります。

それらを数えるために特定のオブジェクト(メッセージなど)のすべてのレコードを検索するのはパフォーマンスを損ないますか? それとも、メッセージが追加/削除されるたびに更新される、total_messagesというユーザーテーブル内の冗長列を作成するほうがよいでしょうか。 おかげで、これはしばらく私を混乱させています。

3 Answer


3


短い答え:両方をする

経験則として、その場で計算できるデータを作成および更新するのは好きではありません(例: カウント)。 したがって、パフォーマンスのボトルネックを見つけてそれに応じて調整するまで、これらの冗長な統計を追加することは控えます。

ユーザーアクティビティに基づいて遡及統計をいつでも追加できるので、絶対に必要な冗長性を追加するだけでアプリケーションを "成長"させることができます。

冗長データを追加するとパフォーマンスが向上する可能性がありますが、すべてのソリューションに適したサイズになることはなく、単純な要求でその場で計算できる使用値を常に計算および更新しようとすると、全体的なパフォーマンスが低下する可能性があります。


2


データベースに viewを作成して関連情報を入手してください。冗長な列を追加する代わりに、外の世界の列のように見えるが最適化可能なSQLコードを追加します。 また、SQLがビューを最適化するという事実により、データの検索が非常に高速になります。


0


Railsのcounter_cachesを調べてください。 彼らはあなたのためにこれをします。

何かのようなもの

クラスメッセージ<ActiveRecord :: Base belongs_to:user、:counter_cache => true

#... 終わり

これには、users_テーブルにmessages_countの列を用意する必要があります(そしてmessages.countを使用しないようにします)。