我在我的国家拥有小型短信高级网关。现在我正在重建它,所以问题是如何组织数据库结构,这样就可以从每个用户帐户中提取资金或增加资金(当进行新的短信交易时)
现在我有结构,当我存储每个有金钱价值的交易时,让我们说1 $,每个用户都有他的静态帐户,由user_id组织,其中包含金钱:
user_id money
1 15.55
Flow就像这样:
但我认为这种结构很糟糕,因为你需要复制所有数据,而且很有可能数据不同步。 并且当在用户统计中我将计算他的所有交易时,可能存在交易中的钱与钱包中的钱不同的情况。退出用户帐户非常困难,因为我将它们存储在单独的表中作为“撤销标记”和期间,这样当我数钱时,我将这段时间与交易分开。
据我所知,银行没有静态用户钱包,所有款项都在每天结束时计算,并且会有特殊标记,但找不到任何相关信息。
所以请指向数据库结构的正确方向以保证用户资金,这样就可以创建统计数据,撤销并动态添加资金。
我正在使用PHP / laravel和mysql数据库。
修改: 根据评论中的要求,我将发布旧的代码结构: 当进行交易时,我在数据库中写一条记录:
sms_records:
id = 12345
transaction_id = 12345
value = 1.50 ( $ )
user_id = 10
datetime = 05.12.2013
... other columns ...
我也向用户钱包(user_accounts)收费
id = 12345
user_id = 10
money = money + 1.50 ( $ )
用户可以按月(1个月)从月的第1天到月的最后一天查看统计数据。提取是在上个月(期间)的每个月进行的
撤消时,我在数据库中插入一个特殊标记:
period_marks:
id = 12345
payout_id => referes to bill table
start_period = 01.12.2013
end_period = 31.12.2013
period_mark = 2013-12
total = 1.50 ( $ )
( so it means that all transactions that was made from 01.12.2013 till 31.12.2013 are payed out to user )
并且在撤回时我从静态用户帐户中获取资金:
UPDATE user_accounts SET money = money - '1.50' WHERE user_id = 12345.
我认为这种结构非常困难和错误。使用这种结构,在静态用户帐户(用户钱包)中犯错是非常简单的,当您将钱包中的钱与统计数据(所有记录)进行比较时,它可能会导致统计数据和静态用户帐户之间的总和不同。
如何组织这种结构会更好?