为个人使用和帮助管理一个非常小的企业建立一个双重记账系统。试图加入一些现在看起来相关的功能。
业务规则
对于不熟悉会计的人来说,逻辑是:金钱既不会被创造也不会被销毁,只会从一个账户转移到另一个账户。每笔交易都有借方和贷方。以下是一些例子:
来自雇主的工资: 贷方:
工资,借方:银行账户- 钱来自你的工资,进入了你的银行账户。支付房租: 贷方:
银行账户,借方:房租- 钱来自你的银行账户,进入了你的房租账户。
账户可以是“存量”账户,即账户余额是累积的(银行账户是一个很好的例子),也可以是“流量”账户,即账户余额是非累积的(房租是一个很好的例子)。
设计背后的逻辑
这个想法是有一个主要的JournalDB表来存储主要条目。表JournalTx存储每个参与交易的账户。每个来自JournalDB的条目都有一个ID,而每个来自JournalTx的交易都与一个日志条目相关联。基本情况是JournalDB上有1个条目,而JournalTx中有两个(或更多)交易。每个条目可以有一个cost_center,一个project和一些其他属性。
根据这个问题,基本上有两种设计方式 - 一行对应一次交易的方式和两行对应一次交易的方式。在第一种方式中,我会有一行包含借方账户和贷方账户,在第二种方式中(即这种方式),会有n行,每行表示受影响的每个账户。
账户
账户表是会计术语中的科目表。它具有层次结构 - 我使用了邻接列表样式。虽然不是很频繁,但账户将进行CRUD操作。我添加了parent_imediate和parent_second作为一个非常丑陋的解决方案来进行聚合(例如计算资产账户的总额),但考虑到挑战(在长时间的研究后也不知道如何做到这一点),这似乎是一个简单的解决办法 - 对此问题的任何输入或建议也都受欢迎。
主要查询
获取报告,通常是每月一次:基本上是所有受影响的交易的汇总,以及每个帐户。最理想的情况是一个数据透视表(列为日期),每行是一个帐户。我想一个“堆叠”版本也可以很好地工作。
账户只是一个维度 - 例如,我可能想按cost_center或project进行查询。
其他功能
我想要有预算账户的能力(因此有了预算表),同时还想要设定“目标”(我想要度假,花费1000美元)。 我还想要有标签,并且能够设置循环账单(即“预期”交易)。
基本关系
一个条目(journal_db)有多个交易(journal_tx)。 一个成本中心、项目等有多个条目。 一个账户有多个交易。 一个联系人有多个条目。
我的主要疑问
我刚开始学习数据库/编程,所以请原谅我可能犯的明显错误。
- 从编程/性能/功能的角度来看,这个设计是否稳固?
- 如何实现报表功能?是通过查询数据库(派生表)还是创建新表(比如journal_reports),并为每个条目创建触发器来更新账户余额?(在这个问题中看到这不是一个好主意)
- 有什么可能我遗漏的内容吗?
