首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >个人理财数据库设计

个人理财数据库设计
EN

Database Administration用户
提问于 2015-07-18 19:01:24
回答 1查看 9.9K关注 0票数 3

我正在用PHP和MySQL开发一个个人财务管理应用程序,以学习更多的PHP和MySQL。

该系统目前使用4个表:

users,此表包含具有下列列的所有用户帐户:

  • ID
  • 名字
  • 中间名
  • 电子邮件
  • 密码

users_balance,此表保存了所有用户的余额。当然,在某个日期或时间之后,用户每次获得新的收入或费用时,都会更新用户的余额。该表有以下列:

  • ID
  • user_id
  • 平衡

user_incomes,此表保存特定用户的所有收入。该表有以下列:

  • ID
  • user_id
  • 标题
  • 描述
  • 日期
  • 时间

user_expenses,此表包含特定用户的所有费用。该表有以下列:

  • ID
  • user_id
  • 标题
  • 描述
  • 日期
  • 时间

用户可以查看当前余额,但如果用户希望从特定日期检查其余额,怎么办?

我是否需要将所有费用和收入减去并汇总到该特定日期,还是必须创建另一列,在创建新事务时跟踪每个新用户的余额?

EN

回答 1

Database Administration用户

发布于 2015-07-18 19:24:09

如果您查看收入和支出表,您会发现它们是相同的,它们的不同只是用户平衡变化的一个标志。您可以很容易地创建一个“事务”表来保留这两个表,或者添加一个类型为收入、费用的列,或者只通过在值列上唱歌来确定它(我想您在讨论所有费用和收入之和时都想要这个表,但在问题中没有定义)。

然后你就可以做简单的

代码语言:javascript
复制
select sum(value) as balance from transactions where user_id = X and datetime <= Y;

如您所见,我使用datetime作为一列--我建议您这样做,否则检查范围的所有条件都会变得非常麻烦:

代码语言:javascript
复制
where date < xxx or (date = xxx and time <= yyy)
-- and now add once more for the upper limit

这足够好,如果您只需要有时,并有一个很好的索引与user_id和日期时间,最好也有一个值。但是,如果知道您将经常检查这个值,或者每个用户都会有大量的事务,那么在应用该事务后再添加一个列来存储用户余额的值是有意义的。这样就可以获得给定日期时间的用户平衡,如下所示

代码语言:javascript
复制
select balance_value 
from transactions 
where user_id = X and datetime <= Y
order by datetime desc
limit 1;

再次使用索引on (user_id,datetime)进行非常快速的检索。

这也可以有辅助用法--它只允许您简单地验证users_balance记录,并检查没有缺少任何事务。在出现错误或数据存储问题的情况下,这种情况可能会非常严重。

票数 2
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/107453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档