14

我们正在开发一个项目,该项目将具有某些操作(例如点击)的实时统计数据。每次点击时,我们都会记录日期、年龄和性别(这些来自 Facebook)、位置等信息。

我们正在讨论存储这些信息并将其用于实时统计的最佳位置。我们将显示汇总统计信息:例如,点击次数、男性/女性点击次数、按年龄组划分的点击次数(例如 18-24、24-30...)。

由于在该站点上我们到处都在使用 MongoDB,我的同事认为我们也应该在其中存储统计信息。然而,我更喜欢基于 SQL 的数据库来完成这项任务,比如 MySQL(或者 Drizzle),因为我相信 SQL 在执行数据聚合等操作时会更好。虽然解析 SQL 会产生开销,但我认为 MySQL/Drizzle 实际上可能比 No-SQL 数据库更快。使用 INSERT DELAYED 查询时,插入也不慢。

请注意,我们不需要执行 JOINS 或从多个表/集合中收集数据。因此,我们不在乎数据库是否不同。但是,我们确实关心可扩展性和可靠性。我们正在构建一些(希望)变得非常大的东西,并且我们在设计每一行代码时都考虑到了可扩展性。

你怎么看待这件事?有什么理由比 MySQL/Drizzle 更喜欢 MongoDB 吗?还是无动于衷?如果你是我们,你会用哪一个?

谢谢你,亚历山德罗

4

2 回答 2

13

所以 BuddyMedia 正在使用其中的一些。Gilt Groupe 用Hummingbird (node.js + MongoDB)做了一些很酷的事情。

在社交媒体领域为一家大型在线广告商工作后,我可以证明实时报告真的很痛苦。尝试每天“累积”5 亿次展示已经是一项挑战,但尝试实时进行是可行的,但它存在一些重大限制。(就像它实际上延迟了 5 分钟 :)

坦率地说,这类问题是我开始使用 MongoDB 的原因之一。而且我不是唯一一个。人们正在使用 MongoDB 进行各种实时分析:服务器监控集中式日志记录以及仪表板报告。

进行此类报告时,真正的关键是要了解数据结构与 MongoDB 完全不同,您将避免“聚合”查询,因此查询和输出图表将有所不同。客户端有一些额外的编码工作。

这是可能为您指明使用 MongoDB 执行此操作的正确方向的关键。看一下下面的数据结构:

{
  date: "20110430",
  gender: "M",
  age: 1, // 1 is probably a bucket
  impression_hour: [ 100, 50, ...], // 24 of these
  impression_minute: [ 2, 5, 19, 8, ... ], // 1440 of these
  clicks_hour: [ 10, 2, ... ],
  ...
}

这里显然有一些调整,适当的索引,可能将 data+gender+age 放入_id. 但这就是使用 MongoDB 进行点击分析的基本结构。更新印象和点击真的很容易{ $inc : { clicks_hour.0 : 1 } }。您可以自动更新整个文档。报告实际上是很自然的。您已经拥有一个包含每小时或分钟级数据点的数组。

希望这为您指明了正确的方向。

于 2011-04-30T23:31:46.843 回答
4

MongoDB 非常适合这类事情,并且肯定会比 MySQL 更快,尽管不要低估 MySQL 的强大功能——许多公司已经用它构建了分析工具。

看看 BuddyMedia 的 Patrick Stokes 的这个演示文稿,了解他们如何将 MongoDB 用于他们的分析系统。

http://www.slideshare.net/pstokes2/social-analytics-with-mongodb

于 2011-04-30T01:29:58.400 回答