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服务器单次调用相比的大量网络流量。
我愿意接受任何有关如何设计此类内容的建议,以便快速更新/插入,同时仍允许报告。
答案 0 :(得分:3)
根据我对这种情况的理解,这三个表是汇总表,其中统计了day,post_id和浏览器或国家/地区的给定指标的唯一组合。
我会一起跳过插入表,因为你现在不保留它并将它或多或少地用作队列。
使用MongoDB,写入将全部写入内存,因此速度非常快。它也可以异步完成(触发并忘记它的样式)。
我会为每个唯一日期和post_id创建一个新文档。它有两个阵列,一个用于浏览器,另一个用于键,国家代码或浏览器,值是计数。该文件还有一个印象计数字段。
每次访问都会更新单个文档,并且很容易查询。
更新将使用原子操作符" $ inc"在服务器上以原子方式递增计数,因此不需要引入数据来进行更新。这将是一个非常少量的数据传输。
这会回答这个问题吗?