我们正在开发一个项目,该项目将包含某些操作(例如点击次数)的实时统计信息.每次点击,我们都会记录日期,年龄和性别(这些来自Facebook),位置等信息.
我们正在讨论存储这些信息的最佳位置,并将它们用于实时统计.我们将显示汇总统计信息:例如,点击次数,男性/女性点击次数,点击次数除以年龄组(例如18-24岁,24-30岁......).
由于我们在网站上使用的是MongoDB,我的同事认为我们也应该在其中存储统计信息.但是,我更喜欢基于SQL的数据库来完成这项任务,比如MySQL(或者可能是Drizzle),因为我认为在进行数据聚合等操作时,SQL会更好.虽然解析SQL的开销很大,但我认为MySQL/Drizzle实际上可能比No-SQL数据库更快.使用INSERT DELAYED查询时插入也不慢.
请注意,我们不需要执行JOINS或从多个表/集合中收集数据.因此,我们不关心数据库是否不同.但是,我们关心可扩展性和可靠性.我们正在构建一些(希望)变得非常大的东西,并且我们在设计每一行代码时都考虑了可伸缩性.
你怎么看待这件事?有没有理由比MySQL/Drizzle更喜欢MongoDB呢?还是无动于衷?如果你是我们,你会使用哪一个?
谢谢,亚历山德罗
所以BuddyMedia正在使用其中一些.Gilt Groupe用Hummingbird(node.js + MongoDB)做了很酷的事.
在社交媒体领域为一家大型在线广告客户工作,我可以证明实时报道真的很痛苦.试图每天"累积"500万次展示已经是一项挑战,但尝试实时工作,但它带来了一些重大限制.(就像它实际上延迟了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, ... ], ... }
这里显然有一些调整,适当的指数,可能是数据+性别+年龄_id
.但这是MongoDB点击分析的基本结构.更新展示次数和点击次数非常简单{ $inc : { clicks_hour.0 : 1 } }
.您可以自动更新整个文档.报告实际上非常自然.您已经拥有一个包含每小时或每分钟数据点的数组.
希望这能指出你正确的方向.