用于处理访问者数据的Mongodb Schema

时间:2014-01-27 03:16:42

标签: php mysql mongodb

我目前正在使用MongoDB进行设置并存储访问者信息。例如,假设我有关于在日期范围内访问过您网站的每位访问者的信息。我想将这些信息存储在数据库中。

目前我将它存储在mongo中,如下例所示。我真的有两个问题:

  • mongo是最好的解决方案[我想过使用couchdb,mysql会起作用,但对于高流量网站,QPS会成为瓶颈]?
  • 将独特的访问者存储在文档中[每个日期被分配访问者]一个好主意,因为16mb是最大文档大小而不是简单地将每个访问者存储为自己的文档?

架构:

Visitor
    Non unique id
    Date
    Visitors --array[could contain up to millions of visitors[daily visitors]]
         source
         keyword
         city
         state
         country
         page_views
         etc.......

2 个答案:

答案 0 :(得分:2)

  

mongo是否是最佳解决方案

没有。原因很多,但最大的原因是文档的大小。

一段时间后,该文档可能会增长到接近16MB的限制。这意味着将它从磁盘加载到您的工作集中不仅耗费时间,而且效率低下。

你会做得更好,就像你实际上一样,每位访客都有一份文件。

如果你希望你的文档加载速度更快,你实际上希望它们更小,磁盘读取更小,反过来IO更小,反而使用更少的资源。

此外,由于我怀疑你会想要所有访问者(可以加载单个文档设置),那么你也可以拥有你不需要的数据填充RAM。

现在存储你可以根据需要有选择地加载访问者,而且只需要很少的IO开销,我保证你已经采取了替代方案:

  

是的,我最终得到了每位访问者的文档,因为我们将允许用户对用户运行过滤器并删除某些访问者

答案 1 :(得分:1)

如果您仅在Visitors数组中存储IP地址,并使用最大长度为45个字符的人类可读表示,那么您可以在一个文档中容纳最多372,827个访问者。因此,如果您每天获得的访问人数超过此数量,您可以获得VC资金并重写您的应用程序(只是开玩笑)。一种选择是以块的形式存储数据。您可以在此类文档中维护单个计数器,只要接近此最大数量,您就可以创建新文档。这有点难以维护,因此另一种选择是将数据分成几小时或几分钟(如果必须的话)。

我认为将每个访问者存储在单独的顶级文档中是不值得的,除非您计划在该记录中存储更多信息并分析访问者访问的内容等。取决于您对此数据的处理方式。< / p>

对于记录目的和视图计数,我会选择一个大数组。出于业务分析的目的,我会为每个访问者选择1个doc。