2010-01-07 67 views
3

用戶將擁有一個用戶配置文件,他希望每個用戶都知道誰查看了他們的配置文件。我能想到的唯一方法就是在每次有人查看配置文件頁面(可能在頁面末尾使用Ajax調用)時執行數據庫INSERT操作。這聽起來像是一個巨大的性能問題,特別是如果網站建立起任何重要的流量。在Rails網站上跟蹤用戶操作

有關如何以高性能方式實現此目標的任何想法,還是僅僅是追蹤這類事物的本質?

謝謝。

回答

3

如果您使用的是MySQL,我非常喜歡使用「INSERT INTO ... ON DUPLICATE KEY」功能,如果發生密鑰衝突,您可以在一行上執行更新。這意味着,不是每個配置文件視圖都有一行,每個用戶+配置文件對可以有一行,或者更細的用戶+配置文件+日。

根據您的交通狀況和數據庫引擎的選擇,這可能會很好,即使長時間。雖然這樣的跟蹤表中可能有很多行,但內容非常小,就像一對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 

這將或者插入一行,或更新計數的現有行。

+0

該解決方案將限制被修改的表的大小,但它不是一個非常有效的審計方法。你必須做一個選擇然後插入或更新,所以你的表需要更好的外鍵索引。此外,您會丟失訪問時間戳等信息。 – 2011-03-05 02:11:48

4
  1. 爲什麼要添加另一個ajax調用來查看?
    做時,你撥打的用戶個人資料顯示的動作。在控制器

  2. 其隊列到後臺作業(例如:starling + workling

  3. 不使用酸DB的觀察數據,使用某種(cassandra,redis等)