个人理财应用数据库设计

Posted

技术标签:

【中文标题】个人理财应用数据库设计【英文标题】:Personal finance app database design 【发布时间】:2011-07-03 06:59:36 【问题描述】:

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

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

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

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

谢谢

编辑:对不起,我可能不太清楚,我了解如何实现创建帐户余额的任何一种方法。我更关注这两种方法的优缺点以及“最佳实践”。非常感谢您的回复!

【问题讨论】:

如果您居住在美国或加拿大,请访问 Mint.com... 不,我没有,另外我说我想要简约轻巧的东西 【参考方案1】:

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

TABLE account
    id
    account_name
    current_balance

TABLE transaction
    id
    account_id
    payee
    date
    amount
    category

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

示例:获取帐户#1(例如:抵押贷款)的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 <> "BAL"
   AND ledger.key BETWEEN 201101010000 AND 201102239999
   AND account.id = 1
 ORDER BY ledger.key ASC

因此,灵活性和可扩展性就是如此。

【讨论】:

有什么理由不在表中添加一个额外的“created”字段? @Stoosh,我只是展示基本的数据库设计。你可以有任何你想要的领域,我这里只关注你的问题。 那里,我添加了一个created 列:) 我的意思更多,因为您将日期和交易 ID 组合为 1 个值。没有去,只是想知道这背后的原因是什么。也感谢您的示例查询! 这种键背后的想法是,拥有一个自动递增的键并没有什么意义……它有什么用?虽然有一个由日期和索引组成的键,但它会告诉您交易的日期以及该日期发生的交易顺序,所有这些都在一个列中,供您查询:)【参考方案4】:

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

【讨论】:

【参考方案5】:

除非出于性能原因需要,否则不要将计算值存储在表中。 我会使用 View 来公开计算的值。

【讨论】:

以上是关于个人理财应用数据库设计的主要内容,如果未能解决你的问题,请参考以下文章

基于安卓的个人理财记账app(android毕业设计)

权限管理设计------之数据库设计

论文毕业设计--基于javaweb框架的个人博客系统项目毕业设计论文.doc

技术分享 | 关于数据库设计的总结

软件工程 - 个人博客系统 - 概要设计与详细设计文档

软件工程 - 个人博客系统 - 概要设计与详细设计文档