我正在开发一个简单的复式会计系统,用于管理汽车租赁公司的付款、费用、汽车费用等。我已经完成了(开发和数据库方面的)用于管理汽车、客户、合同等的主要操作系统,现在我被困在会计部分。
我已经提出了以下用于管理会计部分的数据库设计,但我仍然不能 100% 确定我是否可以使用它并将其视为一种尝试。
现在在t_Transaction表中,我有一个带有 1 Amount 字段的贷方账户和借方账户。我的问题是管理金额部分的最佳方法是什么?
1- 登录到数据库中的 1 个字段会更好吗?但是如何在生成报告时区分天气金额是借方还是贷方。
2- 或者我应该有 2 个单独的字段(a. 借方金额)和(b. 贷方金额),然后根据交易 1 字段将具有实际金额,而另一个字段将具有 NULL 值。
我仍然对如何开发将交易记录到数据库中的代码感到困惑,因为这是我第一次开发会计应用程序
从您的问题中不清楚您的应用程序将支持多少复式簿记。当涉及完全成熟的复式簿记中可能发生的各种交易时,您的数据库受到过度限制。
尤其是,在某些交易中,借方在接收借方的两个或多个账户之间拆分,或者贷方在接收贷方的两个或多个账户之间拆分。如果我正确理解您的情况,这些交易代表您的情况下的异常交易。但是你可能会发现有必要支持他们。
为了说明上述情况,请考虑房主何时支付抵押贷款。在房主的账簿中,交易的借方将分为抵押本金和抵押利息。Mortgage Interest 是一种费用,而 Mortgage Principal 是一种负债,抵押付款减少了它。
同样,您可能需要也可能不需要支持拆分事务。
鉴于这是您第一次使用 DB 设计进行复式记账,可能值得您花时间深入研究这个主题,以避免交付不合格的产品。有很多关于这个主题的优秀书籍。另外,如果你想查看一些免费提供的会计数据库,你可以去http://www.databaseanswers.org/data_models/查看会计的数据模型。
我将在这里给出一个过于简单的总结。
许多复式簿记数据库将交易数据拆分为两个表,我将其称为 TransactionHeader 和 TransactionDetail。TransactionHeader 包含每个事务仅出现一次的数据列,例如 TransactionID 和 Date。TransactionDetail 包含有关交易的数据,因为它只影响一个 Account,并且每笔交易至少有两个交易详细信息。TransactionDetail 中的数据包括 TransactionID、ItemID、AccountID、DebitAmount 和 CreditAmount。
拆分交易有两个以上的 TransactionDetails 与之关联。贷方的总和必须等于任何交易的借方的总和。有时,这可以表示为数据库约束。其他时候,程序员被迫在应用程序中维护这方面的数据完整性。
一些数据库构建器将 CreditAmount 和 DebitAmount 合并到一个名为 Amount 的列中。贷方作为负金额输入。如果您对一组项目进行求和,就会发生正确的事情。然而,走这条捷径也有弊端。我将把它留给教你有关簿记数据库的书籍来填写。
同样,如果这对您的情况来说太过分了,请随时忽略此答案。
希望以后没有人会尝试将您的数据库用于它从未打算涵盖的目的。但我在现实世界中看到了这种情况,带来了灾难性的后果。
小智 0
只需快速浏览一下,无需进行太多分析,我会将 t_transaction_type 更改为只有贷方和借方,并将 t_transction_type 表转换为 payment_type 或其他有意义的名称。
我也会避免使用 t_ ,表名应该只有一个有意义的描述,添加前缀会使数据库级别的管理变得困难。(即这里的智能感知会显示所有表,因为它们都以 t_ 开头)