【问题标题】:Tracking Unique Page Views跟踪唯一页面浏览量
【发布时间】:2009-09-28 05:41:00
【问题描述】:

跟踪特定页面的页面浏览量(特别是唯一的)的最佳方法是什么?

示例:论坛中的主题、视频网站中的视频、Q/A 脚本中的问题 (SO)。

目前,我正在为我尝试计算视图的每一行采取一个简单的“视图”列的方法,但是,我知道这不是最有效的方法。

对于独特的视图,我有一个单独的表,其中包含一行“QuestionID”和“UserID”。当用户访问问题/页面时,我的代码尝试在视图表中找到具有“UserID”和“QuestionID”的行,如果不能,它会添加一行,然后增加问题中的 Views 值“问题”表。

【问题讨论】:

    标签: visitor-statistic


    【解决方案1】:

    您的存储解决方案似乎是跟踪用户的最佳方式。这些表没有冗余数据,并且您的多对多关系由其自己的表表示。

    另外说明: 对于匿名用户,您需要记录他们的 IP 地址,并且您可以使用 COUNT() sql 函数以这种方式获取唯一访问者的数量,但即使 IP 地址本身不是“唯一的”。

    【讨论】:

      【解决方案2】:

      首先,当您有一个存储 userid-quesitonid 对的表时,这意味着您可以计算它们,我认为添加视图列违反了规范化规则。

      另一件事是,如果您不实施 cookie 解决方案,我可以随心所欲地 F5,如果没有,则向表中添加一行。

      当涉及到 IP 地址解决方案时,这远远不是一个解决方案,它会阻止路由器后面的人。

      我想到(现在也在实施)一个解决方案,它检查注册用户的 cookie、sessionIds、数据库表,如果没有找到,则在表中添加一行。无论如何,它也记录 SessionID 和 IP 地址,但并不真正依赖它们。

      【讨论】:

        【解决方案3】:

        如果您为匿名用户使用 ASP.NET MEmbership 和匿名提供程序,那么只要您说 Profile.Save(),每个匿名用户都会在 aspnet_Users 表中创建一行。在这种情况下,您可以跟踪查看特定页面的匿名用户和注册用户。您需要做的就是记录 aspnet_user 的 UserID 和 QuestionID。

        但是,我强烈反对在数据库级别执行此操作,因为它会炸毁您的数据库。如果您有 10,000 个问题、1,000 个注册用户和 100,000 个匿名用户,并假设每个用户平均访问 10 个问题,那么您最终在跟踪表中有 1M 行。相当的负荷。

        此外,对跟踪表执行 SELECT COUNT() 会对数据库造成相当大的负担,尤其是您几乎在论坛上的每个页面查看都执行此操作。最好是在问题表中针对每个问题保留一个总计数器。每当您有一个独特的用户查看页面时,您只需增加计数器。

        也不要从跟踪表创建到用户表的 FK 关系。您将需要清理 aspnet_users 表,因为随着时间的推移,它会堆积很多匿名用户,这些用户很可能永远不会回来。所以,跟踪页面只需要有 userID 字段,没有 FK。此外,您将不得不随着时间的推移清理跟踪表,并且它将不断获得数百万行。这就是为什么 TotalView 计数器需要在 Question 表中,并且在显示页面时从不使用 SELECT COUNT() 来计算视图数。

        这能回答你的问题吗?

        【讨论】:

          猜你喜欢
          • 2012-11-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-07-18
          相关资源
          最近更新 更多