在寻找简约的资金跟踪/预算应用程序之后,我决定构建一个供我个人使用.
但是我不确定部分数据库设计.基本上目前,我有一个条目表,显然存储有关每笔交易的数据,无论是信贷还是债务等.
我遇到的困境是,我不知道是否应该创建另一个表来存储每个帐户的当前余额,或者我是否应该通过从信用中减去借方来动态填充它.
我的一部分是说,随着条目表的增长,为每个帐户生成余额的能力将变得更慢(是的,过早优化被认为是邪恶的),但是当我可以从现有表计算数据时,似乎没有必要添加另一个表.
谢谢
编辑:对不起,我可能不太清楚,我了解如何实施创建帐户余额的方法.我更关注两种方法的优点/缺点以及什么是"最佳实践".非常感谢回复!
Yan*_*hon 19
如果我要设计一个简约的会计应用程序,我可能会做类似的事情
ledger
-------------
key INT(12) PRIMARY KEY
account_id INT(10)
category_id INT(10)
trans_type CHAR(3)
amount NUMERIC(10,2)
account
------------
account_id INT(10) PRIMARY KEY
created DATETIME
name VARCHAR(32)
...
category
------------
category_id INT(10)
name VARCHAR(32)
...
Run Code Online (Sandbox Code Playgroud)
该列key将包含日期和零填充数值(即201102230000),其中最后4位数字将是每日交易ID.这对跟踪交易和返回范围等很有用.每日交易ID 0000可以是当天开始(或结束)的账户余额,而id 0001和up是其他交易.
该列trans_type将保留交易代码,例如"DEB"(借方),"CRE"(贷方),"TRA"(转账)和"BAL"(余额)等.
通过这样的设置,您可以执行任何类型的查询,从获取任何给定日期之间的所有"信用"交易,到任何给定日期或日期范围内的帐户余额.
例如:获取所有的信用卡和借记卡交易之间2011-01-01和2011-02-23
SELECT ledger.*, account.name, category.name
FROM ledger
JOIN account
ON ledger.account_id = account.account_id
JOIN category
ON ledger.category_id = category.category_id
WHERE (ledger.trans_type = "CRE"
OR ledger.trans_type = "DEB")
AND ledger.key BETWEEN 201101010000 AND 201102239999
ORDER BY ledger.key ASC
Run Code Online (Sandbox Code Playgroud)
例如:间取所有交易(除余额)2011-01-01,并2011-02-23为帐号1(例如:按揭)
SELECT ledger.*, account.name, category.name
FROM ledger
JOIN account
ON ledger.account_id = account.account_id
JOIN category
ON ledger.category_id = category.category_id
WHERE ledger.trans_type <> "BAL"
AND ledger.key BETWEEN 201101010000 AND 201102239999
AND account.id = 1
ORDER BY ledger.key ASC
Run Code Online (Sandbox Code Playgroud)
所以,你去,灵活性和可扩展性.
对于个人财务数据库,今天的关系数据库系统足够快,可以动态计算多个帐户的余额。您不需要一列来保存当前余额。甚至 Microsoft Access 也足够快。我知道这一点是因为我在 Access 中构建并使用了个人财务数据库。它甚至可能是您最初要寻找的。您可以在http://maiaco.com/software/ledger/index.php阅读并下载它