1

我的数据库中有大约 100,000 个艺术家/乐队。我希望能够跟踪每个乐队的观看次数,例如,如果我正在查看 Pearl Jam 指标,我希望能够在 2012 年 1 月 1 日看到他们在 2012 年 1 月 2 日看到了 10,000 次观看观看了 12,000 次……等等。

捕获这些数据的最佳方法是什么?我不是在寻找代码帮助,而是在寻找理论/建议。

我正在考虑执行以下操作:

  1. 艺术家的命中表。每次查看 Pearl Jam(或任何其他艺术家)时,插入一个新行来跟踪此视图(包括艺术家 ID 和时间戳)。
  2. 在过去 24 小时内对这些行运行每晚脚本。按艺术家 ID 分组和计数。将此计数插入到该特定日期的每位艺术家的新表中。
  3. 截断这个命中表,使其不会变得非常大。
  4. 选择艺术家 ID 以获取视图。

这是正确的思路吗?有什么建议么?

4

1 回答 1

2

我是开源分析平台Countly的开发人员,想与您分享我的经验。

为艺术家的每个视图插入一个新行并每天对这些结果进行 map-reduce 肯定是一个解决方案(它实际上是旧分析解决方案使用的解决方案),但您可以选择更好的方法。然而,这种方法需要使用面向文档的数据库,就像MongoDB一样。

当对艺术家有看法时,您将对相关字段进行增量,就像;

db.views.update({'artist_id': 1}, {
    '$inc': {
        "views": 1,
        "2012.views": 1,
        "2012.8.views": 1,
        "2012.8.4.views": 1
    }
})

您将在视图集合中获得一个文档,如下所示;

{
    "artist_id": 1,
    "2012": {
        "8": {
            "4": {
                "views": 1 /* today */
            },
            "views": 1 /* august */
        },
        "views": 1 /* 2012 */
    },
    "views": 1 /* all time */
}

该解决方案不需要批处理,实际上是实时的。如果您想查看 8 月的所有统计数据,只需获取如下结果,您将获得 8 月所有日期的数据以及 8 月本身的总观看次数。

db.views.findOne({"artist_id": 1}, {"2012.8": 1})

或者,如果您只需要 2012 年的总观看次数;

db.views.findOne({"artist_id": 1}, {"2012.views": 1})

假设您使用的是 LAMP 堆栈,您可以查看MongoDB PHP 驱动程序。

于 2012-08-04T13:37:18.113 回答