【问题标题】:Mysql Transactions and balancesMysql 交易和余额
【发布时间】:2019-03-28 17:29:40
【问题描述】:

所以我在 MySQL 中有这张表,里面有用户信息:

[             USERS           ]
[id | name |  email  | balance]
[ 1 | A    | a@e.com |    0   ]
[ 2 | B    | b@e.com |    0   ]
[ 3 | C    | c@e.com |    0   ]

还有一个带有事务的表

[           TRANSACTIONS         ]
[id | user_id | product |  amount  | price ]
[ 1 |       3 |TV 600   |       1  | 279,22]
[ 2 |       2 |Radio G  |       1  |  32,12]

我想要的是,如果我在表 transactions 中添加一行,那么用户的 balance 也会更新。 100% 确保平衡始终正确的最佳做法是什么?

带有锁或触发器或其他东西的存储过程?

【问题讨论】:

  • 使用触发器。或计算列。或者一个视图。
  • 我认为当交易量增长时,计算列可能会变慢

标签: mysql sql stored-procedures triggers


【解决方案1】:

我会为该任务使用视图。保证最新数据,因为在查询视图时,它后面的查询会被执行,因此它会重新计算您的余额。

create view MyCalculatedView as
select u.id, u.name, u.email, t.balance from USERS u
left join (
    select user_id, sum(price) as balance
    from TRANSACTIONS
    group by user_id
) t on u.id = t.user_id;

【讨论】:

  • 我也想过,但是该表可以包含 100k 行。恐怕随着时间的推移它会变得缓慢。与其每次需要时都计算结果,不如在插入数据时进行计算(计算一次)。因为仅仅读取平衡字段要快得多。
  • @NLAnaconda 好吧,触发器也是可以接受的。但是我使用适当索引的方法应该可以合理地执行。
  • 我认为你是对的。应该预成型足够好。它始终保持正确的平衡,因为这是最重要的,我认为我会坚持这种方法。
  • @NLAnaconda 如果您认为我的回答对您有帮助或解决了您的问题,您应该接受该回答并可选择投票。
猜你喜欢
  • 2015-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多