报表数据库

2014年4月2日

大多数企业应用程序使用数据库来存储持久数据。该数据库支持应用程序状态的操作更新,以及用于决策支持和分析的各种报告。然而,操作需求和报告需求通常截然不同,对架构和数据访问模式有不同的要求。当这种情况发生时,将报告需求分离到一个报表数据库中通常是一个明智的做法,该数据库会复制必要的操作数据,但以不同的架构表示。

这样的报表数据库与操作数据库完全不同。它可能是完全不同的数据库产品,使用多语言持久化。它应该围绕报告需求进行设计。

报表数据库有许多优点

  • 报表数据库的结构可以专门设计,以便更容易编写报表。
  • 您不需要规范化报表数据库,因为它只读。随意根据需要复制数据,以使查询和报告更容易。
  • 开发团队可以重构操作数据库,而无需更改报表数据库。
  • 针对报表数据库运行的查询不会增加操作数据库的负载。
  • 您可以在数据库中存储派生数据,从而更容易编写使用派生数据的报表,而无需引入单独的派生逻辑集。
  • 您可以为不同的报告需求创建多个报表数据库。

报表数据库的缺点是其数据必须保持最新。最简单的情况是使用隔夜运行来填充报表数据库。这通常效果很好,因为许多报告需求可以完美地使用昨天的数据。如果您需要更及时的数据,可以使用消息系统,以便将对操作数据库的任何更改转发到报表数据库。这更复杂,但数据可以保持更新。通常,大多数报表可以使用稍微过时的数据,您可以为真正需要实时数据的报表生成特殊情况报表[1]

另一种方法是使用视图。这封装了操作数据,并允许您反规范化。为了将操作负载与报告负载分离,您需要将视图复制到其他节点以供读取。主要限制是,与内存编程环境相比,派生数据的灵活性较低。

当您在域模型或其他内存代码中有很多域逻辑时,报表数据库非常适合。域逻辑可用于处理对操作数据的更新,也可用于计算派生数据,以丰富报表数据库。

注意

1: 如今,人们似乎希望进行近乎实时的分析。我对这种价值持怀疑态度。通常,在分析数据趋势时,您不需要立即做出反应,而且当您花时间仔细思考时,您的想法会得到改善。过快地做出反应会导致一种信息恐慌,您会对变化太快而无法正确了解情况的数据做出错误的反应。

修订

2004-04-02:首次发布

2014-04-02:一般更新

2018-03-27:调整了视图段落,以指出复制视图数据的能力(感谢 Matthias Hjalmarsson 的提醒)。