实现独特的页面查看计数器?

时间:2009-08-15 00:55:07

标签: php database-design

我想实现一个面向用户的视图计数器(类似于SO对于问题视图的视图),它跟踪页面的唯一视图数。这里有几个similar个问题,但似乎没有人完全回答我的问题。

最好的设置是什么(就数据库表等而言)?将'views'列添加到'questions'表并在每个页面视图上增加它会不会很好?如果我希望视图是唯一的,我想我可以有另一个带有问题ID和IP地址的表,如果还没有当前IP的条目,则只增加“视图”列。然而,这个'ip-view'表会非常快速地使用...主要是我担心必须将每个页面视图和每个IP存储在一个表中。

如何对其进行优化以使其不会成为性能瓶颈?有没有比我描述的更好的方法?请注意,对我来说非常重要的是只计算独特的观点。

更新:除了建议实施方法之外,我还想进一步了解性能问题在哪里发挥作用,假设只是简单地检查IP是否存在并更新'视图的天真方法'每页查看列。主要问题是发生了大量插入(假设流量很大),还是更大的对象到ip映射表的大小(这可能很大,因为每个新的唯一访问者每个问题都会插入一个新行)。是否应考虑竞争条件(我只是假设更新/增量sql语句是原子的)?对不起所有的问题,但我很遗憾我应该如何解决这个问题。

2 个答案:

答案 0 :(得分:6)

如果您需要专门跟踪独特的视图,可能有两种方法可以执行此操作...除非您使用可以识别的内部用户进行操作。现在,为了做到这一点,您需要跟踪访问该页面的每个用户。

跟踪可以在服务器端或客户端完成。

服务器端将需要是IP地址,除非您正在处理可以识别的内部用户。每当你处理IP地址时,所有关于使用它们识别人员的常见警告(每个IP可能有多个用户,或每个用户有多个IP),你就无法做任何事情。

您还应该考虑“巨大的IP死亡表”并不是一个解决方案。如果你有成千上万的用户,性能只会成为一个问题......当然,假设它被正确索引。

客户端可能会让您离开“我已经访问过!”曲奇饼。如果cookie不存在,则增加用户数。如果无法创建cookie,则必须使用膨胀的用户视图。关于处理cookie的所有警告都适用......也就是说,它们最终会变坏并消失。

答案 1 :(得分:0)

似乎有一种革命性的方法(在我的头脑中),我自己还不确定是否可扩展或相当可行。

如果您真的希望将IP存储在数据库中并希望避免让数据库堵塞,您应该考虑按层次顺序存储它们。

<ID, IP_PART, LEVEL, PARENT_PART, VIEWS>

因此,当用户从IP 212.121.139.54访问您的网站时,您的表中的行将是:

  

&lt; 1,212,1,0,0&gt;   &lt; 2,121,2,1,0&gt;   &lt; 3,139,3,2,0&gt;   &lt; 4,54,4,3,1&gt;

注意事项:

  1. 只有LEVEL val = 4的行才会有视图计数。
  2. 为了避免存储VIEWS val = 0的冗余,对于LEVEL val = 1,2,3;你可以考虑将它们存放在不同的表格中。
  3. 这个想法,正如它所设想的那样,似乎不适合一小部分IP。
  4. 虽然这可能忽略了这样一个事实:位于私人网络前面的公共代理IP从多个盒子访问你的网站。但这似乎不是问题。我猜。
  5. 所以,chao,让我知道你实施了什么?