我正在用PHP和MySQL开发一个个人财务管理应用程序,以学习更多的PHP和MySQL。
该系统目前使用4个表:
users,此表包含具有下列列的所有用户帐户:
users_balance,此表保存了所有用户的余额。当然,在某个日期或时间之后,用户每次获得新的收入或费用时,都会更新用户的余额。该表有以下列:
user_incomes,此表保存特定用户的所有收入。该表有以下列:
user_expenses,此表包含特定用户的所有费用。该表有以下列:
用户可以查看当前余额,但如果用户希望从特定日期检查其余额,怎么办?
我是否需要将所有费用和收入减去并汇总到该特定日期,还是必须创建另一列,在创建新事务时跟踪每个新用户的余额?
发布于 2015-07-18 19:24:09
如果您查看收入和支出表,您会发现它们是相同的,它们的不同只是用户平衡变化的一个标志。您可以很容易地创建一个“事务”表来保留这两个表,或者添加一个类型为收入、费用的列,或者只通过在值列上唱歌来确定它(我想您在讨论所有费用和收入之和时都想要这个表,但在问题中没有定义)。
然后你就可以做简单的
select sum(value) as balance from transactions where user_id = X and datetime <= Y;如您所见,我使用datetime作为一列--我建议您这样做,否则检查范围的所有条件都会变得非常麻烦:
where date < xxx or (date = xxx and time <= yyy)
-- and now add once more for the upper limit这足够好,如果您只需要有时,并有一个很好的索引与user_id和日期时间,最好也有一个值。但是,如果知道您将经常检查这个值,或者每个用户都会有大量的事务,那么在应用该事务后再添加一个列来存储用户余额的值是有意义的。这样就可以获得给定日期时间的用户平衡,如下所示
select balance_value
from transactions
where user_id = X and datetime <= Y
order by datetime desc
limit 1;再次使用索引on (user_id,datetime)进行非常快速的检索。
这也可以有辅助用法--它只允许您简单地验证users_balance记录,并检查没有缺少任何事务。在出现错误或数据存储问题的情况下,这种情况可能会非常严重。
https://dba.stackexchange.com/questions/107453
复制相似问题