另一个来自app程序员的问题,他第一次尝试将DB模型聚集在一起。
在我的应用中,有用户,帐户和交易。我最初拥有3NF的所有表格(或者我相信)。然后我决定向用户添加一个平衡字段,主要是因为我的代码将是开源的,我不希望人们通过更改PHP代码来搞乱系统的业务逻辑。因此触发器和存储过程会更新平衡。
现在有一项新要求,即用户将在其帐户页面上显示他们使用余额列执行的所有交易的列表,以便他们可以查看每笔交易的余额如何变化。当然,交易和用户位于不同的表格中。
如何去做? 我当前的解决方案草图看到一个balance_history表,其中包含对transaction_id和user_id的外键。还有其他建议吗?感谢。
答案 0 :(得分:1)
在数据库中存储计算值总是充满潜在的错误。话虽如此,它只是一种缓存技术,现在很容易理解缓存。
但是,每次访问帐户页面时计算运行余额是否昂贵?我们在这里只谈加法和减法。也许只是通过获取缓存的最终余额,并从中计算每个事务的运行余额,并且可以节省大量工作来维护您提出的balance_history表。
我还要补充一点,如果允许插入或更新旧事务,则balance_history表将很难更新。然后,您必须更新该用户的每个连续事务以更正运行余额。
Alexey Sviridov建议使用视图来运行余额是一个很好的建议,尽管它们写起来很棘手(特别是为了高效运行)。 Oracle的分析函数对于那种事情非常好,但我不确定MySQL是否具有等价物。
答案 1 :(得分:1)
如果您的交易表不是很大,我建议您从用户表中删除余额列。为什么balance_history如果你已经有一个交易表? 我强烈建议您从触发器中删除任何bussines逻辑!只有存储过程。我建议仅将触发器用于真正的透明操作(审计,复杂验证等)。 总而言之,我认为你sholuld从users表中删除了balance column,而是编写了加入用户和事务表的视图(例如'UserBalance')。从触发器中删除任何bussines逻辑,改为调用aproriate存储过程。仅使用事务表显示余额历史记录。 这对于不是很大的表来说都是如此(3-4百万条记录是可以的)。对于非常大的数据库,您需要使用分布式缓存,垂直数据库等。