其中';标准化(SQL视图)和性能/可用性(SQL表)之间的折衷
我有一个相当长的业务流程,最终导致财务运作 最后重要的是这些最后的行动,尽管我必须记录所有导致它的事情 由于包含在最终操作中的所有信息都可以在其他表中使用(在业务流程中使用),因此使用视图是有意义的,但是视图逻辑将非常复杂(涉及几十个表),我担心:其中';标准化(SQL视图)和性能/可用性(SQL表)之间的折衷,sql,database-design,Sql,Database Design,我有一个相当长的业务流程,最终导致财务运作 最后重要的是这些最后的行动,尽管我必须记录所有导致它的事情 由于包含在最终操作中的所有信息都可以在其他表中使用(在业务流程中使用),因此使用视图是有意义的,但是视图逻辑将非常复杂(涉及几十个表),我担心: 即使有适当的索引,一个表也可能快得多(我的表最终将包含数百万个if项,并且应该可以在几乎所有列上完全搜索) 视图逻辑会很复杂,所以如果我想改进我的业务逻辑,恐怕几年后会使事情复杂化 由于这两个原因,我有点想在业务流程结束时将数据写入表中,而不是依赖于
编辑:在我的情况下,创建表显然会导致重复,也就是说,表中写入的数据存在于数据库的其他地方,可以仅使用连接检索,而不进行任何计算。我想你已经回答了你的问题,请将其写下来 这个问题可以这样看:一方面你有“实时数据”。您有新的数据,从中创建视图来显示“实时数据”也很好 但随着时间的推移,有更多的数据和逻辑变化。所以写下一段时间前的数据摘要是很好的。这是非常实用的—您不需要复制数据,因为您需要重新计算它们并将它们的摘要保存到新表中 所以当你这样想的时候,很明显,在这个例子中,新表会更好。正如你所写:
- 更快的访问
- 可以有更复杂的逻辑
- 逻辑更改时保持归档数据不变
注意这个表的设计——因此,当业务逻辑发生变化时——您不需要从表中的一块石头开始改变所有内容。然后一切都会好起来的 我总是决定进行更好的标准化。在您的情况下,尽管视图可能很复杂,但最好使用该视图,而不是新表,新表必须与所有数据更改操作保持同步。此外,视图始终是最新的,而您的工作日结束表填充在一天中只有几个小时是最新的
此外,如果此表中的数据出于任何原因不同步,您会遇到更大的问题 在这种情况下,我支持新桌子。该视图有许多缺点-性能明显、复杂性和逻辑锁定。然而,最主要的原因是,随着底层数据的变化,视图中的值也会随之变化。在大多数情况下,这是一件好事,但是,对于金融业务来说,最好是对发生的事情有一个固定的记录。正如MrTelly所提到的,您确定最终结果表真的是视图数据的重复吗?或者,它实际上是作为视图数据中的项的结果而采取的最终操作的记录
举个更清楚的例子,假设每次我的油箱空了一半,我就买10美元的汽油。我把这写在日志里。有一天我买了汽油,把它写在日志里,后来发现我的燃油表坏了,我真的有3/4加仑的汽油。我现在应该从我的日志中删除10美元的购买,因为基础数据(油箱中的油位)已经改变了吗?好吧,也许这不是一个更清晰的例子,但希望它能让人明白这一点。记录结果与记录导致结果的事件是不同的。这在金融应用中尤其如此。因此,我不知道将最终结果存储在自己的表中会破坏规范化。索引视图就是一种方法。但是这种方法有很多局限性,但总体上是有利的,尽管如果实现不正确,它会有一些开销问题。使用这种方法,您将不需要跟踪在基表中发生的更改,并且数据将在您的索引视图中很好地自行累积。理论上 参考:
- Oracle:物化视图概念和体系结构