何时构建单独的报告数据库?

问题描述 投票:30回答:7

我们正在构建一个拥有数据库的应用程序(是的,非常令人兴奋的呵呵:)。数据库主要是事务性的(支持应用程序),并且还会在应用程序中进行一些“报告” - 但没有什么太费劲。

除此之外,我们还有一些报告要求 - 但目前它们非常模糊和高级。我们有一个标准的报告工具,我们在内部使用,随着需求的巩固,我们将用它来进行“更重”的报告。

我的问题是:您如何知道何时需要单独的报告数据库?

需要问什么样的问题?什么样的事情会让你决定一个单独的报告数据库是必要的?

database database-design architecture reporting
7个回答
35
投票

一般而言,交易应用程序越关键,报告要求越复杂,分裂就越有意义。

  1. 当交易表现至关重要时。
  2. 当在事务应用程序上很难获得维护窗口时。
  3. 如果报告需要关联的结果不仅来自此应用程序,还来自其他应用程序孤岛。
  4. 如果报告需要支持最适合星型模式/商业智能环境的趋势或其他类型的报告。
  5. 如果报告长时间运行。
  6. 如果事务性应用程序位于昂贵的硬件资源(群集,大型机等)上
  7. 如果需要对事务数据执行数据清理/提取 - 转换 - 加载操作(例如,状态名称为规范状态缩写)。

它增加了非平凡的复杂性,所以imo,必须有一个很好的理由去分裂。


27
投票

通常,我会尝试最初报告事务数据库。

确保您经常使用添加的任何索引以促进有效报告。您添加的索引越多,性能越差,插入和(如果您更改密钥)更新。

当您转到报告数据库时,请记住您只有几个原因:

最终,关于报告数据库的首要问题是您正在从OLTP数据库中删除锁定争用。因此,如果您的报告数据库是同一数据库的直接副本,那么您只需使用不会干扰生产事务的延迟快照。

接下来,您可以使用单独的索引策略来支持报告使用方案。这些额外的索引可以在报告数据库中维护,但会在OLTP数据库中造成不必要的开销。

现在,上述两种方法都可以在同一台服务器上完成(即使是在单独的数据库中的相同实例,甚至只是在单独的模式中),仍然可以看到好处。当CPU和IO完全挂钩时,此时,您肯定需要将它放在一个完全独立的盒子上(或升级您的单个盒子)。

最后,为了最终报告的灵活性,您可以对数据进行非规范化(通常是对维度模型或星型模式),以便报告数据库是不同模型中的相同数据。在维模型中报告大量数据(特别是聚合)非常快,因为星型模式非常有效。对于更多种类的查询而言,如果没有大量的重新索引或分析来更改索引,它也是有效的,因为维度模型更适合于无法预料的使用模式(旧的“切片和骰子每个方向”请求)。您可以看到这是一种使用数据仓库技术的小型数据仓库,但不一定要实现完整的数据仓库。此外,星型模式对于用户来说特别容易掌握,并且数据字典对于BI工具或星型模式的报告工具来说更简单,更容易构建。你可以在同一个盒子或不同的盒子上做这个,就像前面讨论过的那样。


9
投票

这个问题需要经验而不是科学。

作为BI架构师,我为客户设计每个BI解决方案的方法非常不同。我没有查看清单。它需要对其系统,报告要求,预算和人力有一个大致的了解。

我个人更喜欢在数据库方面尽可能多地保留报告流程(BI世界中的最佳实践)。报告工具仅用于显示目的(最小用于小型计算)。这种方法需要大量的数据预处理,这需要不同的登台表,触发器等。

当你说:

我处理具有数亿行的项目,实时报告以及数百名用户同时访问应用程序/数据库而没有问题。

你的陈述有一些问题。

  1. 数以亿计的行很多。即使在今天,像Cognos TM1或Qlikview这样的内存工具也难以获得这样的结果。 (查看SAP的SAP HANA,了解业内巨头如何处理它)。
  2. 如果数据库中有数亿行,则并不一定意味着报告需要遍历所有这些记录。也许报告的工作量不是数百万,而是千万。可能那就是你所看到的。
  3. 交易报告与仪表板非常不同。大多数仪表板工具都会预处理和缓存数据。

我的观点是,在决定何时:

  1. 设计一个新的架构
  2. 创建一个语义数据库
  3. 在同一个交易数据库上工作
  4. 甚至使用报告工具(有时手写的仪表板与Java / JSF / Ajax / jQuery或JSP可以很好地为客户端工作)

1
投票

您需要一个单独的数据库来报告问题的主要原因是报告的生成会干扰应用程序的事务责任。例如。如果报告需要20分钟来生成并利用100%的CPU /磁盘/等......在高活动期间,您可能会考虑使用单独的数据库进行报告。

至于问题,这里有一些基本的问题:

  1. 我可以在非高峰时段进行高强度报告吗?
  2. 它是否会干扰使用该系统的用户?
  3. 如果是#2,那么干扰的代价是什么?另一个数据库服务器的成本,重构代码等......?

1
投票

基本上,当来自应用程序的数据库负载变得与用于报告的数据库负载不兼容时。这可能是由于:

  • 报告消耗过多的数据库服务器资源,影响应用程序的数据库性能。 此类别的一部分是应用程序数据库工作由于锁定而不得不等待主要缓慢的报告查询,尽管可能可以使用锁定调整等不那么激烈的方法来解决。
  • 报告查询与应用查询非常不兼容,只要进行调整(例如索引但不限于此) - 最愚蠢的例子就是因为报告目的索引而影响应用插入的热点。
  • 时间问题。例如。可用的数据库维护的唯一小窗口(由于应用程序的使用)是繁重报告工作的时间
  • 报告数据的绝对数量(例如,日志记录,审计,统计信息)非常大,以至于您的主数据库服务器体系结构是此类报告的错误解决方案(请参阅Sybase ASE与Sybase IQ)。顺便说一句,这是一个真实的场景 - 因此我们将绩效报告转移到IQ。

1
投票

我还将添加另一个可能使用报告数据库的原因,即:CQRS模式(命令查询责任分离)。

如果您有大量用户访问和写入一小组数据,您可以考虑使用此模式。基本上,它以最简单的形式表示所有命令(创建,更新,删除)都被推送到事务数据库。您的所有查询(读取)都来自您的报告数据库。这使您可以自由地修改您的架构和升级功能。

在模式中还有更多内容,我刚才提到了由于您关于报告数据库的问题而感兴趣的位。


0
投票

我还要补充说,事务数据库意味着保持当前状态,并且通常这样做是为了自我维护。您不希望事务数据库超出其必要的手段。当工作流或事务完成后,将该数据移出并进入报告数据库,该数据库设计得更好,可以保存历史数据。

© www.soinside.com 2019 - 2024. All rights reserved.