2

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

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

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

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

4

3 回答 3

1

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

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

于 2009-09-28T05:51:11.893 回答
1

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

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

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

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

于 2010-06-21T19:08:50.123 回答
0

如果您使用 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() 来计算视图数。

这回答了你的问题了吗?

于 2011-05-07T21:23:56.373 回答