在交易 table 中存储付款和退款的正确方法是什么?
What is the correct way to store payments and refunds in a transaction table?
我有一个问题涉及会计和数据库原则。我有一个名为 Payments 的 table,它在其他列中具有以下结构:
-------------------------------
id | amount | type
-------------------------------
1 | 100.00 | payment
2 | 200.00 | payment
3 | 50.00 | refund
4 | 130.00 | refund
5 | 500.00 | payment
所以目前,我将付款和退款存储为正数,并在不同的列中指示交易类型。当我们提取报告时,我会检查类型并将数量放在括号中 [例如,(50.00)]
但是,现在的问题是,也可能存储与以下相同的信息:
-------------------------------
id | amount | type
-------------------------------
1 | 100.00 | payment
2 | 200.00 | payment
3 | -50.00 | refund
4 | -130.00 | refund
5 | 500.00 | payment
其中的主要论据是我们可以运行在这一列上进行SUM()来快速获得平衡,还有一个问题'Why store a positive amount when technically money is going out.'
我的问题是:
在数据库中存储付款和退款的正确方法是什么?第一个实现在那里是因为我随心所欲——将其存储为负数以表示退款对我来说是错误的。正如这个答案所说,其背后的想法是:
Accounting values are not scalars -- they are vectors which contain an enum (debit or credit) and a fixed-point decimal number (which can be positive or negative).
(原栈溢出题可查here)
这个答案还声称
Using one column for everything and then using negative numbers for either debits or credits doesn't work ...
但我很难理解为什么问题中的情况是错误的。我还试图找到它在这里不起作用的情况,并查看存储负数是否错误,或者同时存储正数是否也是错误的。
重申一下,在数据库中存储付款和退款的正确方法是什么?由于这涉及金融交易,如果存在这样的事情,我想确保我是以正确的方式进行的。
What is the correct way of storing payments and refunds in a database?
从我的角度来看,这是积极的。
因为当您打印退款时,纸上的数字是正数。
简短的回答是,总是有多种方法来为系统建模。没有 "correct" 方法,所以停止搜索。我总体上同意@indiri。
您将存储的内容与该信息的呈现混淆了。更糟糕的是,您将看似无关紧要的内容纳入了会计庞然大物。您没有创建会计系统(因为那 非常 复杂)所以担心借方、贷方、资产、负债等并不是特别有用。如果您可以准确地检索和表示信息,那么您区分付款和退款的方式就是正确的。有些方法可能比其他方法更好,但没有任何迹象表明需要进行更改。
那 "doesn't work" 引用夸大了事情 - 但那是你的错。正如我所说,您没有创建会计系统。你有会计科目表吗?您是否跟踪系统支持的各种类型的交易产生的贷方和借方流量?不太可能。您可能创建了一个只处理事务的简单得多的版本。我猜想您无法轻松生成通用财务报表(例如余额 sheet)——至少在没有假设的情况下是这样。
您可能忽略或解决的一件事是,任何交易的价值都可能增加或减少余额。当您更正付款时,是否应该为付款交易输入负数?或者通过输入不同类型的交易?您应该更改原始事务还是添加一个新行作为 "offset"?这种事情可以继续下去。
所以停止寻找圣杯吧。只要您能生成准确的信息,就可以断定您的设计是正确的。
我采用了第二个实现,采用了@Raidex 和@indiri 建议的方法。没有理由不必要地使这个记录保持复杂化,尤其是因为我们只是在谈论 payments/refunds table。
我有一个问题涉及会计和数据库原则。我有一个名为 Payments 的 table,它在其他列中具有以下结构:
-------------------------------
id | amount | type
-------------------------------
1 | 100.00 | payment
2 | 200.00 | payment
3 | 50.00 | refund
4 | 130.00 | refund
5 | 500.00 | payment
所以目前,我将付款和退款存储为正数,并在不同的列中指示交易类型。当我们提取报告时,我会检查类型并将数量放在括号中 [例如,(50.00)]
但是,现在的问题是,也可能存储与以下相同的信息:
-------------------------------
id | amount | type
-------------------------------
1 | 100.00 | payment
2 | 200.00 | payment
3 | -50.00 | refund
4 | -130.00 | refund
5 | 500.00 | payment
其中的主要论据是我们可以运行在这一列上进行SUM()来快速获得平衡,还有一个问题'Why store a positive amount when technically money is going out.'
我的问题是:
在数据库中存储付款和退款的正确方法是什么?第一个实现在那里是因为我随心所欲——将其存储为负数以表示退款对我来说是错误的。正如这个答案所说,其背后的想法是:
Accounting values are not scalars -- they are vectors which contain an enum (debit or credit) and a fixed-point decimal number (which can be positive or negative).
(原栈溢出题可查here)
这个答案还声称
Using one column for everything and then using negative numbers for either debits or credits doesn't work ...
但我很难理解为什么问题中的情况是错误的。我还试图找到它在这里不起作用的情况,并查看存储负数是否错误,或者同时存储正数是否也是错误的。
重申一下,在数据库中存储付款和退款的正确方法是什么?由于这涉及金融交易,如果存在这样的事情,我想确保我是以正确的方式进行的。
What is the correct way of storing payments and refunds in a database?
从我的角度来看,这是积极的。 因为当您打印退款时,纸上的数字是正数。
简短的回答是,总是有多种方法来为系统建模。没有 "correct" 方法,所以停止搜索。我总体上同意@indiri。
您将存储的内容与该信息的呈现混淆了。更糟糕的是,您将看似无关紧要的内容纳入了会计庞然大物。您没有创建会计系统(因为那 非常 复杂)所以担心借方、贷方、资产、负债等并不是特别有用。如果您可以准确地检索和表示信息,那么您区分付款和退款的方式就是正确的。有些方法可能比其他方法更好,但没有任何迹象表明需要进行更改。
那 "doesn't work" 引用夸大了事情 - 但那是你的错。正如我所说,您没有创建会计系统。你有会计科目表吗?您是否跟踪系统支持的各种类型的交易产生的贷方和借方流量?不太可能。您可能创建了一个只处理事务的简单得多的版本。我猜想您无法轻松生成通用财务报表(例如余额 sheet)——至少在没有假设的情况下是这样。
您可能忽略或解决的一件事是,任何交易的价值都可能增加或减少余额。当您更正付款时,是否应该为付款交易输入负数?或者通过输入不同类型的交易?您应该更改原始事务还是添加一个新行作为 "offset"?这种事情可以继续下去。
所以停止寻找圣杯吧。只要您能生成准确的信息,就可以断定您的设计是正确的。
我采用了第二个实现,采用了@Raidex 和@indiri 建议的方法。没有理由不必要地使这个记录保持复杂化,尤其是因为我们只是在谈论 payments/refunds table。