首页 > 解决方案 > SQL循环外键

问题描述

假设一个数据库拥有一些账户和它的交易。

将有一个表Account(为简单起见,它只包含一个 id)和一个Transaction包含列idaccount_id(外键)、type和的表value

现在,如果存入一些钱,那就没有问题了。account_id被选择并且typevalue定义。但是,如果我想将钱从账户 a 转移到账户 b 怎么办?

我考虑过添加某种offset_account_id来区分从哪里到哪里,但这不是一个好的解决方案。

或者我是否为每个涉及的帐户添加两个交易?然后我首先必须插入两者,然后更新两者,因为它们需要相互循环引用。

第三,我考虑添加一个“转移”表来保存transaction_id相关帐户。

尽管如此,我对最后一个解决方案的问题是,如果我删除帐户 a 我想在整个数据库中级联,所有事务都应该被自动删除。但是如果我删除a,那么a的交易将消失,转移表中的条目也会消失,但账户b的交易仍将在数据库中。

这些“会计”问题的好布局是什么?

附带问题:您会在运行时计算余额还是使用插入/删除/更新触发器来将余额存储在相应的帐户中?

标签: sqlforeign-keys

解决方案


我发布了上述表格的示例。在此示例中,帐户 ID“100”已向帐户 ID“123”支付了 30 美元。交易在应付表中显示为记录,在应收表中显示为记录。

表示例

然后,如果某天关闭了 100 的帐户,您将通过在应付帐款表中创建新记录来从帐户中删除剩余余额。如果钱被转移到一个新账户,那么也会在应收账款表中创建一条记录。这将显示资金流动的历史。如果您想跟踪打开或关闭的帐户,我还建议创建一个包含所有帐号、客户名称和“打开/关闭”列的表。这样关闭的账户就会反映在您的数据中,您仍然可以根据打开或关闭的账户进行查询,但历史不会被删除,这对于良好的会计记录至关重要。


推荐阅读