如何使用Rails进行一些报告(使用专用数据库)

Mar*_*ard 1 reporting ruby-on-rails

在Rails应用程序中,我想知道如何构建报告解决方案.我听说我应该使用一个单独的数据库进行报告,但知道我需要存储大量数据,我有很多问题:

  • 我应该选择什么样的DBMS?
  • 我应该何时将数据存储在报告数据库中?
  • 生产数据库和报告数据库的数据库模式是否应该相同?

我正在存储基本数据(关于用户的信息,关于操作结果),我将需要例如运行报告以了解上个月有多少用户操作失败.

现在这是一个模糊的问题,但任何提示都会受到高度赞赏.

谢谢!

Nic*_*ick 5

向后工作

从最终用户想要报告的内容或他们希望/应该如何可视化数据开始.一旦你有了一些概念,那就开始向后工作,看看如何实现这些目标.从假设它应该是RBDMS中的复制副本开始,排除了几种合理的可能性.

制作实时界面

如果用户希望动态聚合值(计数,平均值等)(每个Web请求),如果SQL性能可以接受(如果您可以接受,则可以考虑将主服务器复制到报告数据库)将输入数据加倍).SQL引擎通常可以很好地聚合和扩展.这也使您能够将数据结果连接在一起,并在用户请求时返回复杂的结果.

请记住,复制并不容易,或者没有自己的问题.

根据我的经验,这将开始显示数亿行范围内的弱点和标准化数据.在某些时候,插入与同一个表上的选择对抗足以使两者变得特别慢(记住,复制仍然是插入流).或者,索引变得如此之大以至于需要存储I/O才能进行密钥更新,因此整体表性能会降低.

配料

另一方面,如果报告属于发送标准化报告而几乎没有交互的方案,我不一定会建议支持RBDMS.在这种情况下,结果被组合,聚合,连接等一次.支付RBDMS索引和存储膨胀的开销是不值得的.

Hadoop这样的批量引擎可以横向扩展(许多小型机器而不是几台大型机器),因此处理大量数据是经济的.

批量到RBDMS或K/V商店

如果需要进行大量计算以使记录对报告引擎更有意义,这也是一种有用的途径.或者,可以在将记录存储在报告存储引擎中之前对记录进行非规范化.然后将非规范化或简单的结果传送到键/值存储或RBDMS,以使报告更容易,并以延迟,计算和可能的存储为代价实现更高的性能.

个人建议

不要过度设计它.您在初始实施时做出的决定可能会在某些时候发生变化.但是,请考虑当前和近期的问题来设计它.此外,如果您的使用模式与他们的使用模型不完全相同,那么其他人所做的基准测试并不是非常有用; 基准您的使用模型.