ASP.NET MVC 3 - Web应用程序 - 高效聚合数据

时间:2011-09-19 16:56:06

标签: asp.net-mvc aggregation

我正在运行ASP.NET MVC 3 Web应用程序,并希望收集统计信息,例如:

  • 查看特定产品的频率
  • 哪些搜索词组通常会在结果列表中返回特定产品
  • 搜索结果转换为视图的频率(针对特定产品)

我想汇总这些数据并将其分解:

  • 按产品
  • 按产品分类

我想知道汇总数据的最简洁,最有效的策略是什么。我能想到一对,但我相信还有更多:

  • 将数据插入临时表,然后运行作业以聚合数据并将其推送到永久表中。
  • 使用排队系统(MSMQ / Rhino / etc。)并创建一个服务,以便在数据被推送到数据库之前聚合这些数据。

我担心的是:

  • 我想限制活动部件的数量。
  • 我想减少对数据库的影响。
  • 更少的往返次数和更少的无关数据存储得更好
  • 在某些情况下(未列出)我希望数据有点接近实时(准确到小时可能是合适的)

有没有人有这方面的真实经验,如果有的话,你会建议哪种方法以及积极和消极的方面是什么?如果有一个更好的解决方案我不会想到我会喜欢听到它......

由于

JP

3 个答案:

答案 0 :(得分:2)

我需要在最近的一个项目中做类似的事情。我们在辅助数据库中实现了一个完整的审计系统,它跟踪实时数据库上每条记录的变化。基本上每次插入,更新和删除实际上都会更新2条记录,一条在实时数据库中,一条在审计数据库中。

由于我们在审计数据库上实时获得了这些数据,因此我们使用第二个数据库来填充我们可能需要的任何报告。我在使用报告数据库时发现的一个技巧是忘记规范化。只需为您想要的每个报告创建一个表,并让它只包含您为该报告所需的数据。它的重复数据,但性能提升是值得的。

关于填写报告中的实际数据,我们使用混合物。每日报告由凌晨3点左右的计划任务生成,同样适用于每周和每月报告,通常是在周末或深夜。

其他报告是按需生成的,主要使用自上一天以来的数据,所以它不是那么多记录,而是全部来自辅助数据库。

答案 1 :(得分:1)

我同意您应该为统计信息创建一个单独的数据库,它将减少对数据库的影响。

你可以考虑使用“Staging”表和“Aggregate”表;这样,如果你想访问临时表中的近实时数据,当你想要历史数据时,你会转到聚合。

最后,我建议您使用异步调用来保存统计信息;这样你的页面就不会对响应时间产生影响。

答案 2 :(得分:0)

我建议您为此创建一个单独的数据库。最好的方法是使用BI技术。有一个单独的服务 Bi的SQL服务器。