mysql - 如何处理关系数据库中的金融交易?

标签 mysql database database-design polymorphic-associations

我正在努力设计我的数据库。我的数据库涉及多种金融交易,将用于计算用户的余额。不同的交易在结构上是不同的,目前我将它们存储在不同的表中。当谈到计算用户的余额时,我意识到这是一个很大的困惑,因为我需要从多个表中选择许多不同的不一致行并将它们全部加起来。所以我想如果我创建一个表来汇总交易(例如金额和拥有该交易的用户 ID)并引用更详细的记录并有一个字段来指定它是什么类型的交易,会怎么样。事实证明:我试图实现的东西被称为“多态关联”,并且没有办法用 MySQL 以可靠的方式实现它。有一些解决方法,但它们都不能保证我想要的数据完整性。最后,我变得非常绝望,开始寻找其他 DBMS,但它们似乎都不适合我的情况。

你有什么建议吗?也许,我不应该害怕编写大型且不断增长的函数来计算用户的余额吗?或者我应该选择在 MySQL 中建模多态关联的最佳选择,并留下轻微的数据不一致风险?或者也许有 DBMS 可以解决我的问题而无需解决方法?

我现在的结构 The structure I have now 有些交易直接与用户链接,而另一些则通过另一个表链接。我的目标是计算单个用户的所有事务的总和,这将是一个非常大且不断增长的 SQL 语句来获取每种事务的所有行。

这就是我想要的结构 This is how I want it to be structured

也就是说,我想要一个表以便于计算,但该表必须强制它呈现的记录存在。

最佳答案

BEGIN;
SELECT balance FROM Balances WHERE user_id = 123 FOR UPDATE;
do stuff in other table(s)
UPDATE Balances SET balance = balance + 876 WHERE user_id = 123
COMMIT;

由于您的操作分散在各个表中,因此您需要该代码的各种副本。

注意用户的余额只在一张表的一处

FOR UPDATE 对于正确锁定至关重要。

关于mysql - 如何处理关系数据库中的金融交易?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58566854/

相关文章:

php - 如果选中复选框,则将状态设置为确定

Python 循环查询 MySQL - 查询结果未更新?

mysql - Liquibase tag 命令标签过多

database - 如何使用代码在VB中搜索一个access数据库的多个字段

mysql - 出租车司机队列管理MySQL查询

mysql - 数据库设计 : how to model a table?

sql - 启动 MySQL 例程和脚本

database - 如何扩展数据库

sql-server - 为什么我无法在 SSMS 中删除(编辑)具有 xml 值的行?

mysql - 重构庞大的非规范化mysql数据库