MySQL を使用している場合、キーの競合がある場合に行を更新できる "INSERT INTO...ON DUPLICATE KEY" 機能を使用するのが大好きです。これは、プロファイル ビューごとに 1 行ではなく、ユーザー + プロファイルのペアごとに 1 行、またはさらに細分化するために、ユーザー + プロファイル + 1 日ごとに 1 行が存在する可能性があることを意味します。
トラフィックの状況と DB エンジンの選択によっては、これは長時間でも非常にうまく機能する場合があります。このような追跡テーブルには非常に多数の行が存在する可能性がありますが、コンテンツは非常に小さく、ID フィールドのペアと数値カウンターのように、エントリごとに 12 ~ 16 バイト程度です。
たとえば、追跡テーブルは次のように定義できます。
def self.up
create_table :user_profile_views do |t|
t.integer :user_id
t.integer :profile_user_id
t.integer :count, :default => 0
end
add_index :user_profile_views, [ :user_id, :profile_user_id ], :unique => true
end
モデルの場合:
def self.record_view_profile!(user, profile)
connection.execute(sanitize_sql([ "
INSERT INTO user_profile_views (user_id, user_profile_id, count)
VALUES (%d,%d,1)
ON DUPLICATE KEY UPDATE
count=count+1
", user.id, profile.id ])
end
これにより、行が挿入されるか、既存の行のカウントが更新されます。