个人理财应用数据库设计

时间:2011-02-24 04:34:39

标签: database-design

在寻找简约的资金跟踪/预算应用程序之后,我决定构建一个供我个人使用。

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

我遇到的困境是,我不知道是否应该创建另一个表来存储每个帐户的当前余额,或者我是否应该通过从信用中减去借方来动态填充它。

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

由于

编辑:抱歉,我可能不太清楚,我了解如何实施创建帐户余额的方法。我更关注两种方法的优点/缺点以及什么是“最佳实践”。非常感谢你的回复!

4 个答案:

答案 0 :(得分: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)
   ...

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-01(例如:抵押贷款)提取2011-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

所以,你去,灵活性和可扩展性。

答案 1 :(得分:2)

对于个人财务数据库,今天的关系数据库系统足够快,可以动态计算多个帐户的余额。您不需要列来保存当前余额。甚至Microsoft Access也足够快。我知道这是因为我在Access中构建并使用了个人财务数据库。它甚至可能是你最初寻找的东西。您可以阅读并在http://maiaco.com/software/ledger/index.php

下载

答案 2 :(得分:1)

我现在正在研究这个网站的想法,我设置数据库的方式是:

TABLE account
    id
    account_name
    current_balance

TABLE transaction
    id
    account_id
    payee
    date
    amount
    category

每当添加新交易时,我都会更新帐户的当前余额。

仅供参考,我希望在一个月内启动我的网站,如果您对使用此人网站感兴趣,请查看我的个人资料。

答案 3 :(得分:1)

我认为单个表读取会更好,并且将来可以提供更大的灵活性。您最终可以跟踪余额,信用和借记的平均值。