MongoDB Analytics Schema

时间:2012-04-28 13:28:09

标签: database-design mongodb

Mongo的新手,接受分析任务并提出架构问题。

我来自SQL服务器,我有4个表......

stats_landing_table
-------------------
id
post_id
visit_date
country
browser
impressions

stats_geo_table
---------------
id
post_id
date
country
country_count

stats_browser_table
-------------------
id
post_id
date
browser
browser_count

stats_impressions_table
-----------------------
id
post_id
date
impression_count

使用登陆表 - 我每次都将所有数据都放入其中 - 没有更新,只需插入。在那里,我有一个触发器,查看其他表并执行相应的更新或插入,然后从登陆表中删除条目。

因此,我需要快速插入/更新,能够根据整体或特定时间范围返回并显示有关帖子(国家/地区,浏览器,展示次数等)的每个属性的报告。

使用Mongo,可归结为我是应该嵌入还是拥有单独的文档,或者我认为是完全不同的模式。如果我嵌入,我试图找出如何更新浏览器表格,同时仍然检查国家和更新印象。听起来我需要为每个东西单独更新(比如,这个vistor使用的是来自德国的firefox,而这个是来自芬兰的firefox - 在我看到的单个查询中无法做到这一点)。另一种选择是做不同的文档,但这是同样的问题 - 我需要对每个集合进行更新 - 这是与SQL服务器单次调用相比的大量网络流量。

我愿意接受任何有关如何设计此类内容的建议,以便快速更新/插入,同时仍允许报告。

1 个答案:

答案 0 :(得分:3)

根据我对这种情况的理解,这三个表是汇总表,其中统计了day,post_id和浏览器或国家/地区的给定指标的唯一组合。

我会一起跳过插入表,因为你现在不保留它并将它或多或少地用作队列。

使用MongoDB,写入将全部写入内存,因此速度非常快。它也可以异步完成(触发并忘记它的样式)。

我会为每个唯一日期和post_id创建一个新文档。它有两个阵列,一个用于浏览器,另一个用于键,国家代码或浏览器,值是计数。该文件还有一个印象计数字段。

每次访问都会更新单个文档,并且很容易查询。

更新将使用原子操作符" $ inc"在服务器上以原子方式递增计数,因此不需要引入数据来进行更新。这将是一个非常少量的数据传输。

这会回答这个问题吗?