traffic
ユーザーが特定のを追跡しているシナリオを考えてみましょうcities
。トラフィックは 2 時間ごとに更新され、グラフをプロットするために以前のデータを保持する必要があります。だから私はtraffic_stats
このようなテーブルを持っています -
traffic_stats(id,city_id,user_id,traffic,created_at)
(指定されたトラフィックは数値です)
一意 city_id
の s を取得し、これらの都市の現在のトラフィック統計を取得し、このテーブル自体に新しいエントリを追加する統計リフレッシャー デーモンがあります。デーモンはこのクエリを使用してフェッチしますcity_id
-
SELECT * FROM traffic_stats GROUP BY city_id
city_id
同じテーブルにそれぞれの新しいエントリを追加します。user_id
どのユーザーがその都市を購読しているかは問題ではないため、新しいエントリごとの属性は 0 です。が表にある場合city_id
は、traffic_stats が更新されます。
フロントエンドでは、ユーザーのデータを取得するために次のクエリが実行されます -
SELECT * FROM
(SELECT * FROM traffic_stats WHERE user_id = #{session[:user_id]} ORDER BY created_at DESC)
as traffic_for_user_in_descending_order
GROUP BY city_id
これにより、city_id の単一の最新エントリが得られます。
100 人のユーザーが 200 のユニークな都市を追跡している場合、traffic stats
テーブルには 2 時間ごとに 200 の新しいエントリが存在するという事実を除けば、これは問題なく動作するはずです。これは 1 日 2400 エントリで、テーブルは増え続けます。
ここで、ユーザーが追跡している都市に関するデータを含む 1 つのテーブルと、リフレッシャー デーモンがエントリを追加する別のテーブルを持つことができます。しかし、このアプローチにパフォーマンス上の利点があるかどうかはわかりません。