我遇到的问题涉及会计和数据库原则。我有一个名为Payments的表,其他列中有这个结构:
-------------------------------
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()以快速获得余额,还有一个问题是“为什么在技术上存钱时存储正数量。”#39 ;
我的问题是:
在数据库中存储付款和退款的正确方法是什么?第一次实施就在那里因为我带着我的直觉 - 把它存放为负面以表明退款让我觉得不对。这背后的想法是,正如这个答案所说:
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 ...
但我很难理解为什么问题中的案例是错误的。我也试图找到一个在这里不起作用的情况,并且还要查看存储负数是否错误,或者将它存储为正数也是错误的。
要重新迭代,在数据库中存储付款和退款的正确方法是什么?由于这涉及金融交易,我想确保我以正确的方式做到这一点,如果存在这样的事情。
答案 0 :(得分:0)
在数据库中存储付款和退款的正确方法是什么?
从我的观点来看,这是积极的。 因为当您打印退款时,数字在纸上是正面的。
答案 1 :(得分:0)
简短的回答是,总有多种方法可以对系统进行建模。没有人正确的方式,所以停止搜索。我一般都同意@indiri。
您将存储的内容与该信息的呈现混淆了。更糟糕的是,你已经采取了似乎是一个无关紧要的会计mumbo jumbo offramp。您没有创建会计系统(因为非常复杂),因此担心借方,贷方,资产,负债等并不是特别有用。如果您可以准确地检索和表示信息,那么如何区分付款和退款是正确的。某些方法可能比其他方式更好,但没有任何迹象表明需要进行更改。
那"不起作用"引用过度陈述 - 但这是你的错。正如我所说,你没有创建一个会计系统。你有账户图表吗?您是否跟踪系统支持的各种交易所产生的信用和借方流量。不是; ikely。您可能创建了一个更简单的版本来处理事务。我猜你不能轻易生成共同的财务报表(例如资产负债表) - 至少在没有假设的情况下。
您可能忽略或解决的一件事是,任何交易的价值都可以增加或减少平衡。当您更正付款时,是否应该通过输入付款交易的负数来执行此操作?或者通过输入不同类型的交易?您是否应该更改原始交易或添加新行作为"偏移"?这种事情可以继续下去。
所以停止寻找圣杯。只要您能够生成准确的信息,您就可以得出结论,您的设计是正确的。
答案 2 :(得分:0)
我采用了第二种实现方式,采用了@Raidex和@indiri建议的方法。没有理由不必要地使这个记录保持复杂,特别是因为我们只是在谈论支付/退款表。