gpt4 book ai didi

database-design - 个人理财应用数据库设计

转载 作者:行者123 更新时间:2023-12-03 14:45:06 26 4
gpt4 key购买 nike

在搜寻了一个简约的资金追踪/预算应用程序之后,我决定构建一个供自己使用的应用程序。

但是我不确定数据库设计的一部分。基本上目前,我有一个条目表,该表显然存储有关每笔交易的数据,无论是信贷还是债务等。

我面临的难题是,我不知道是否应该创建另一个表来存储每个帐户的当前余额,还是应该通过从贷方中减去借方来动态填充该表。

我的部分意思是,随着条目表的增长,为每个帐户生成余额的能力将变慢(是的,过早的优化被认为是邪恶的),但是当我可以从现有表中计算数据时似乎也没有必要添加另一个表。

谢谢

编辑:对不起,我可能还不清楚,我了解如何实现创建帐户余额的两种方法。我正在寻找这两种方法的优缺点以及什么是“最佳实践”。非常感谢您的答复!

最佳答案

如果我要设计一个简约的会计应用程序,我可能会做类似的事情

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)
...


key列包含一个日期和一个零填充数字值(即 201102230000),其中后4位为每日交易ID。这对于跟踪交易并返回范围等很有用。每日交易ID 0000可以是一天开始(或结束)时的帐户余额,而ID 0001和其他则是其他交易。

trans_type列将包含交易代码,例如“ DEB”(借方),“ CRE”(贷方),“ TRA”(转账)和“ BAL”(余额)等。

使用这样的设置,您可以执行任何类型的查询,从获取给定日期之间的所有“信用”交易到仅给定日期或日期范围内的帐户余额。

示例:获取 2011-01-012011-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


示例:获取帐户# 2011-01-012011-02-231之间的所有交易(余额除外)(例如:抵押)

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


这样一来,灵活性和可扩展性就可以了。

关于database-design - 个人理财应用数据库设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5100386/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com