2010-01-07 68 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等)