Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
其中';标准化(SQL视图)和性能/可用性(SQL表)之间的折衷_Sql_Database Design - Fatal编程技术网

其中';标准化(SQL视图)和性能/可用性(SQL表)之间的折衷

其中';标准化(SQL视图)和性能/可用性(SQL表)之间的折衷,sql,database-design,Sql,Database Design,我有一个相当长的业务流程,最终导致财务运作 最后重要的是这些最后的行动,尽管我必须记录所有导致它的事情 由于包含在最终操作中的所有信息都可以在其他表中使用(在业务流程中使用),因此使用视图是有意义的,但是视图逻辑将非常复杂(涉及几十个表),我担心: 即使有适当的索引,一个表也可能快得多(我的表最终将包含数百万个if项,并且应该可以在几乎所有列上完全搜索) 视图逻辑会很复杂,所以如果我想改进我的业务逻辑,恐怕几年后会使事情复杂化 由于这两个原因,我有点想在业务流程结束时将数据写入表中,而不是依赖于

我有一个相当长的业务流程,最终导致财务运作

最后重要的是这些最后的行动,尽管我必须记录所有导致它的事情

由于包含在最终操作中的所有信息都可以在其他表中使用(在业务流程中使用),因此使用视图是有意义的,但是视图逻辑将非常复杂(涉及几十个表),我担心:

  • 即使有适当的索引,一个表也可能快得多(我的表最终将包含数百万个if项,并且应该可以在几乎所有列上完全搜索)

  • 视图逻辑会很复杂,所以如果我想改进我的业务逻辑,恐怕几年后会使事情复杂化

  • 由于这两个原因,我有点想在业务流程结束时将数据写入表中,而不是依赖于视图,但复制数据闻起来并不正确(这看起来也有点像过早优化,但因为它是我设计中的一个中心点,我想尽快解决这个问题)

    你曾经面对过这样的选择吗?你决定了什么


    编辑:在我的情况下,创建表显然会导致重复,也就是说,表中写入的数据存在于数据库的其他地方,可以仅使用连接检索,而不进行任何计算。

    我想你已经回答了你的问题,请将其写下来

    这个问题可以这样看:一方面你有“实时数据”。您有新的数据,从中创建视图来显示“实时数据”也很好

    但随着时间的推移,有更多的数据和逻辑变化。所以写下一段时间前的数据摘要是很好的。这是非常实用的—您不需要复制数据,因为您需要重新计算它们并将它们的摘要保存到新表中

    所以当你这样想的时候,很明显,在这个例子中,新表会更好。正如你所写:

    • 更快的访问
    • 可以有更复杂的逻辑
    • 逻辑更改时保持归档数据不变
    因此,当您满足这个(或部分)标准时,您需要的不是它的选择-您进入表格

    只有在显示其他新数据中的新数据时,我才会使用视图。在非常非常简单的问题中。当事情变得更复杂时,你总是切换到新的表格

    因此,不要害怕进入它。拥有一个具有更快访问速度的摘要表是一个非常漂亮的解决方案,它是格式良好的数据库的标志


    注意这个表的设计——因此,当业务逻辑发生变化时——您不需要从表中的一块石头开始改变所有内容。然后一切都会好起来的

    我总是决定进行更好的标准化。在您的情况下,尽管视图可能很复杂,但最好使用该视图,而不是新表,新表必须与所有数据更改操作保持同步。此外,视图始终是最新的,而您的工作日结束表填充在一天中只有几个小时是最新的


    此外,如果此表中的数据出于任何原因不同步,您会遇到更大的问题

    在这种情况下,我支持新桌子。该视图有许多缺点-性能明显、复杂性和逻辑锁定。然而,最主要的原因是,随着底层数据的变化,视图中的值也会随之变化。在大多数情况下,这是一件好事,但是,对于金融业务来说,最好是对发生的事情有一个固定的记录。

    正如MrTelly所提到的,您确定最终结果表真的是视图数据的重复吗?或者,它实际上是作为视图数据中的项的结果而采取的最终操作的记录


    举个更清楚的例子,假设每次我的油箱空了一半,我就买10美元的汽油。我把这写在日志里。有一天我买了汽油,把它写在日志里,后来发现我的燃油表坏了,我真的有3/4加仑的汽油。我现在应该从我的日志中删除10美元的购买,因为基础数据(油箱中的油位)已经改变了吗?好吧,也许这不是一个更清晰的例子,但希望它能让人明白这一点。记录结果与记录导致结果的事件是不同的。这在金融应用中尤其如此。因此,我不知道将最终结果存储在自己的表中会破坏规范化。

    索引视图就是一种方法。但是这种方法有很多局限性,但总体上是有利的,尽管如果实现不正确,它会有一些开销问题。使用这种方法,您将不需要跟踪在基表中发生的更改,并且数据将在您的索引视图中很好地自行累积。理论上

    参考:

    • Oracle:物化视图概念和体系结构

    我的表格也将始终是最新的(我将在每个业务操作结束时填充它,而不是在一天结束时填充)。话虽如此,你是对的,我的困境是标准化与实用主义。我不完全理解你为什么说我“不复制数据”;对我来说,这里显然存在一些重复,因为我将获取各个表中的数据,并将其插入到最终的表中,而不是依赖连接来获取数据。对我来说,重复数据发生在您将数据像现有数据一样直接复制到其他位置时。但是当你做一些计算时,它不再是重复的。就像你们在订单表中有产品清单和产品成本总和一样——这不是重复,而是计算。@Tomasz:也许我没有