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

8 php database-design

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

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

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

更新:除了暗示的实现方法,我也想进一步了解其中的性能问题发挥作用的假设只是检查是否存在IP和每个页面视图更新"查看"栏的幼稚的做法.被插入发生的历史的主要问题,大量的(假设交通繁忙),或者是更多的对象到IP映射表(这可能是巨大的,因为一个新的行会每个问题为每个插入新的唯一访问者)的大小.是否应考虑竞争条件(我只是假设更新/增量sql语句是原子的)?抱歉所有的问题,但我只是迷失了我应该如何处理这个问题.

Ric*_*ora 6

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

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

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

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

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


小智 0

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

如果您确实希望将 IP 存储在数据库中并希望避免数据库堵塞,您应该考虑以分层顺序存储它们。

<ID, IP_PART, LEVEL, PARENT_PART, VIEWS>
Run Code Online (Sandbox Code Playgroud)

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

<1, 212, 1, 0, 0> <2, 121, 2, 1, 0> <3, 139, 3, 2, 0> <4, 54, 4, 3, 1>

注意事项:

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

那么,chao,让我知道你实施了什么?