在Rails应用程序中,我想知道如何构建报告解决方案。我听说我应该使用一个单独的数据库进行报告,但知道我需要存储大量数据,我有很多问题:
我正在存储基本数据(有关用户的信息,有关操作结果的信息),例如,我需要运行报告以了解上个月有多少用户操作失败。
现在这是一个模糊的问题,但任何提示都会受到高度赞赏。
谢谢!
答案 0 :(得分:5)
从最终用户想要报告的内容或他们希望/应该如何可视化数据开始。一旦你有了一些概念,那就开始向后工作,看看如何实现这些目标。从假设它应该是RBDMS中的复制副本开始,排除了几种合理的可能性。
如果用户希望动态聚合值(计数,平均值等)(每个Web请求),那么如果SQL性能可以接受(并且保持不变),则值得考虑将主服务器复制到报告数据库如果您要将输入数据加倍,则可以接受)。 SQL引擎通常可以很好地聚合和扩展。这也使您能够将数据结果连接在一起,并在用户请求时返回复杂的结果。
请记住,复制并不容易,或者没有自己的问题。
根据我的经验,这将开始显示数亿行范围内的标准化数据的弱点。在某些时候,插入与同一个表上的选择对抗足以使两者变得特别慢(记住,复制仍然是插入流)。或者,索引变得如此之大,以至于需要重新加密存储I / O,因此整体表性能会降低。
另一方面,如果报告属于发送标准化报告且几乎没有交互的方案,我不一定会建议支持RBDMS。在这种情况下,结果被组合,聚合,连接等一次。支付RBDMS索引和存储膨胀的开销是不值得的。
像Hadoop这样的批量引擎会水平扩展(许多小型机器而不是几台大型机器),因此处理大量数据是经济的。
如果需要进行大量计算以使记录对报告引擎更有意义,这也是一个有用的途径。或者,可以在将记录存储在报告存储引擎中之前对记录进行非规范化。然后将非规范化或简单的结果传送到键/值存储或RBDMS,以便更容易地报告,并以延迟,计算和可能的存储为代价实现更高的性能。
不要过度设计它。您在初始实施时做出的决定可能会在某些时候发生变化。但是,请考虑当前和近期的问题来设计它。此外,如果您的使用模式与他们的使用模型不完全相同,那么其他人所做的基准测试并不是非常有用;对您的使用模式进行基准测试。
答案 1 :(得分:0)
如果您需要大量报告,我建议使用一些预构建报告服务,而不是手动写出。
您可能希望查看Tableau http://www.tableausoftware.com/和其他可用的内容。
数据库..是的它应该是一个单独的似乎更安全,加上报告通常用于旧的和合并的数据..您的实时数据可能太大而无法执行分析。
数据库类型 - >必须根据使用的报告服务进行选择,虽然我认为任何报告服务都不支持mongo,但首选mysql。
如果只有一个或两个报告,您可以在轨道上构建它们