在SQL中自动更新一个基于另一个表的表?

时间:2016-07-26 23:35:52

标签: php mysql sql-server database

我正在编写一个网站。我的问题可以简化为:

如果交易发生并记录在交易表中。应根据交易自动更新余额表。

我能想到的一种方法是在事务表中添加另一列作为标志,以查看是否已根据此事务更新余额表。每次用户打开网站时,我都会使用php更新余额表,并在交易表中标记为“未更新”的条目,然后显示更新的余额表。

但这意味着每次用户检查余额时每次更新余额表。

我插入事务表时更新两个表的方法是不可行的,因为我只能访问事务的数据库,而不是要插入的代码。

我想知道是否有其他方法可以根据交易表自动更新余额表?是否有一个脚本可以放在服务器端每10秒运行一次或推送功能,只要事务表中有更新,那么服务器会自动更新余额表吗?

提前致谢。

1 个答案:

答案 0 :(得分:3)

第一个问题是,你想要一张平衡表吗?如果您可以从交易中获得余额,也许一个视图就足够了。它始终是最新的,并且不会给事务处理带来任何开销或复杂性。

如果要在表中缓存派生余额 - 可能因为平衡的查看频率远远超过添加事务 - 您需要能够从冷启动开始。你不希望只有在交易到来时能够产生余额,因为当出现问题时 - 不是,何时 - 你将被困在写作中“紧急代码“当你宁愿吃晚饭时。因此,不要使余额生成依赖于事务处理。

我将如何做到这一点:

  • 写一个余额视图。
  • 创建一个与视图相同的balances表,但列last_transaction_time

现在您需要一个SQL过程来执行以下操作:

  1. max(balances. last_transaction_time)max(transactions.time)进行比较。
  2. 如果balances已过期,请从视图中进行更新。
  3. select ... from balances(表)。
  4. 缺点是用户必须等待在发布新交易后重新生成余额。好处是仅在需要时生成余额,而不是在每次交易后生成。这通常非常重要,因为事务处理通常是时间敏感的。

    处理事务和计算余额之间总会有一些时间。缓存平衡的效用是其使用频率和计算复杂性的函数。

    上述过程始终产生正确的余额并最大限度地减少计算次数。它可以修改为在松弛时间内“预先计算”过时的缓存;这将是一个选择,以产生非高峰开销,以换取峰值时间吞吐量。