2010-02-08 46 views
1

抱歉如果标题不是很清楚。我将尝试现在解释:试图设计一个应该从另一个表中总结数值的列

我有两个表:表A和表B.它们之间的关系是一个(对于A表)对许多(对于B表)。所以,这就像主从情况。 我在表B中有一列'金额',很明显是十进制的,表A中的一列'TotalAmount'。我试图找出如何保持表A中的值为最新。我的建议是根据表A制作一个视图,用聚合查询来计算表B的数量。当然,使用适当的索引... 但是,我的队友建议每次我们改变一些东西时更新表A中的值在我们的应用程序中的表B中。 我想知道,这里最好的解决方案是什么?可能是第三个变体?

一些澄清...我们预计这个表是我们数据库中增长最快的表格。而表B的增长要比表A快得多。表B中最常见的操作将是插入...并且几乎没有别的。表A中最频繁的操作将被选择...但不仅限于此。

回答

1

我看到了一些选择:

  1. 使用上表B中的INSERT触发器并做更新表A作为你的朋友建议。这将使表B保持尽可能最新。
  2. 有一个计划任务,每x分钟更新一次表格(x =对您的应用程序有意义)。
  3. 更新表B时,在应用程序逻辑中的表A上执行更新。如果您在很多地方更新表B,这可能无法解决。
+0

选项2不适用于此,因为我们需要始终保持最新状态。但选项1听起来合理。 – anthares 2010-02-08 09:07:13

1

如果您在应用程序中向表B插入新行的地方最简单,那么最简单的解决方法是发送一个UPDATE A set TotalAmount=TotalAmount + ? where ID = ?并传递刚刚插入到B中的值。确保您包装事务中的两个查询(插入和更新)都可以发生,也可以不发生。

如果这并不简单,那么您的下一个选项是数据库触发器。阅读数据库的文档如何创建它们。基本上,触发器是在DB发生某些事情时执行的一小段代码(在你的情况下,当有人在表B中插入数据时)。

该视图是另一种选择,但它可能会导致选择过程中出现性能问题,而这些问题很难解决。尝试使用“物化视图”或“计算列”(但这些会在插入/移除列时导致性能问题)。

1

如果这个值会发生很大的变化,那么最好使用视图:这绝对是更安全的实现。但更好的是使用触发器(如果你的数据库支持它们)

我猜你的队友建议更新每个插入的值,因为他认为你会经常需要这个值,每次重新计算值。如果是这样的话:

  • 你的数据库应该照顾缓存,所以这可能不成问题。
  • 尽管如此,您可以在稍后的阶段添加该功能 - 这样您可以确保您的应用程序可以正常工作,并且可以更容易地调试该缓存列。
0

我肯定会推荐使用触发器来使用应用程序逻辑,因为这样可以确保数据库保持最新值,而不是依赖所有的调用者。但是,从设计角度来看,我会谨慎的将生成的数据与非生成的数据存储在同一个表中 - 我认为保持明确的分离非常重要,因此人们不会在应该使用哪些数据保持和维护他们。

但是,一般来说,更喜欢触发器的意见 - 这样你就不必担心维护价值。配置文件来确定性能是否是一个问题。在Postgres中,我相信你甚至可以在计算的值上创建一个索引,所以数据库不必查看细节表。

定期重新计算的第三种方法将比触发器慢得多,并且可能比视图慢。无论如何这不适合你的使用是蛋糕上的糖霜:)。

相关问题