我想使用Django ORM跟踪每个用户的当前余额和余额历史记录。我想象2个表(用户和历史)与用户和历史之间的一对多表示用户的整个历史记录,以及用户和历史记录之间的一对一,以便轻松访问当前的余额:
History
ID | User (FK to User) | Delta | Balance | Timestamp
User
ID | Name | Employee | Year | Balance (FK to History)
1)鉴于我使用的是Django ORM,这看起来是否合理?我认为使用原始SQL或其他ORM,我可以给历史记录一个开始和结束日期,然后使用SELECT * FROM History WHERE user_id=[id] AND stop IS NULL;
轻松获取最新信息。
2)历史应该有一个平衡栏吗?
3)用户是否应该有一个平衡栏(我总是可以动态计算余额)?如果是这样,它应该是一个"缓存"小数值?或者它应该是最新余额的外键吗?
答案 0 :(得分:0)
严格正常的做法是说 表都不应该包含余额列,但用户'应从所有历史总和中计算余额。但是,您可能会发现使用这样的模式会导致不可接受的性能 - 在这种情况下缓存余额是明智的:
如果您对当前余额最感兴趣,那么在History
表中缓存余额的理由很少(只需缓存当前仅User
表中的余额);
另一方面,如果您可能对任意历史余额感兴趣,那么将历史余额存储在History
表中是有意义的(然后还有一点点也是如此将当前余额存储在User
表中,因为可以从最新的History
记录中轻松发现。
但也许它现在不值得担心缓存?请记住咒语" 正常化直到它受伤;非正常直到它起作用"以及Knuth的着名格言" 过早优化是所有邪恶的根源"。