![]() |
1
34
一般来说,事务应用程序的任务越关键,报告要求越复杂,拆分就越有意义。
它增加了非平凡的复杂性,所以在我看来,必须有一个很好的理由来分裂。 |
![]() |
2
27
通常,我会尝试首先报告事务数据库。 确保经常使用为方便高效报告而添加的任何索引。添加的索引越多,插入和(如果更改键)更新的性能就越差。 当您确实要访问报告数据库时,请记住,您访问该数据库的原因只有以下几个: 归根结底,报告数据库的第一件事是从OLTP数据库中删除锁争用。因此,如果您的报告数据库是同一数据库的直接副本,那么您只需使用延迟的快照,这不会干扰生产事务。 接下来,您可以有一个单独的索引策略来支持报告使用场景。这些额外的索引可以在报告数据库中维护,但会在OLTP数据库中造成不必要的开销。 现在,这两种方法都可以在同一台服务器上完成(甚至是在单独的数据库中的同一个实例,甚至是在单独的模式中),并且仍然可以看到好处。当CPU和IO完全固定时,此时,您肯定需要将它放在一个完全独立的盒子上(或者升级单个盒子)。 最后,为了实现最终的报告灵活性,可以将数据(通常是维度模型或星型模式)非规范化,以便报告数据库在不同的模型中是相同的数据。在维度模型中,大量数据(尤其是聚合数据)的报告速度非常快,因为星型模式非常有效。在没有大量重新索引或分析的情况下,对于各种各样的查询,更改索引也是有效的,因为维度模型更适合于不可预见的使用模式(旧的“向每一个方向切片和切块”请求)。您可以看到,这是一种使用数据仓库技术的小型数据仓库,但不一定实现全面的数据仓库。此外,星型模式对于用户来说特别容易掌握,数据字典对于使用星型模式的BI工具或报告工具来说更简单也更容易构建。你可以在同一个盒子或不同的盒子上做这个,就像前面讨论的那样。 |
![]() |
3
7
北极: 希望你在近两年后找到了答案。这个问题需要经验而不是科学。 作为一个BI架构师,我为我的客户设计每个BI解决方案所采用的方法是非常不同的。我没有检查清单。这需要全面了解他们的系统、报告要求、预算和人力。 我个人更喜欢在数据库端尽可能多地保留报告流程(BI世界中的最佳实践)。报告工具仅用于显示目的(对于小计算最大)。这种方法需要大量的数据预处理,这些数据需要不同的临时表、触发器等。 当你说:
你的陈述有一些问题。
我知道两年后我会回答,而且我的想法没有很好的组织,但我的观点是,所有这些都取决于决定何时: 1。设计新架构 2。创建语义数据库 三。处理同一事务数据库 4。或者甚至使用报告工具(有时使用Java/JSF/Ajax/jQuery或JSP的手写仪表板为客户端工作) |
![]() |
4
1
您需要一个单独的数据库来报告问题的主要原因是,生成报告会干扰应用程序的事务职责。例如,如果报告需要20分钟来生成和使用100%的CPU/磁盘/等…在活动频繁的时候,您可能会考虑使用单独的数据库进行报告。 至于问题,以下是一些基本问题:
|
![]() |
5
1
基本上,当应用程序中的数据库加载与用于报告的数据库加载不兼容时。这可能是由于:
|
![]() |
6
0
我还想补充一点,事务性数据库是用来保存当前状态的,而且通常是自我维护的。您不希望事务数据库的增长超出其必要的手段。当一个工作流或事务完成后,将该数据移出并移入一个报告数据库,该数据库更适合保存历史数据。 |
![]() |
7
0
我还将添加另一个您可能使用报告数据库的原因,即:cqrs模式(命令查询职责分离)。 如果有大量的用户访问和写入一小部分数据,那么考虑这种模式是明智的。它的最简单形式基本上意味着所有命令(创建、更新、删除)都被推送到事务数据库中。 所有查询(读取)都来自报告数据库。这可以让您自由地查看您的架构和升级功能。 在模式中还有更多的内容,我刚刚提到了由于您关于报告数据库的问题而有趣的部分。 |
|
kaiselwyvrn · 我无法打开Visual Studio项目 1 年前 |
![]() |
4SadMemeXD · 无法在Django中选择相关类别 2 年前 |
![]() |
Agrim Singh · 用户数据。名称未显示用户名 2 年前 |
![]() |
Peloucvo · 用数据库中的数据填充JTable 2 年前 |
![]() |
Montaser Majid · 用于从多行中提取单行的SQL查询 2 年前 |
![]() |
Max J. · 用整数作为键将dict写入csv 2 年前 |