使用SQL管理历史记录和当前记录

时间:2015-03-27 18:52:04

标签: mysql sql django relational-database django-orm

我想使用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)用户是否应该有一个平衡栏(我总是可以动态计算余额)?如果是这样,它应该是一个"缓存"小数值?或者它应该是最新余额的外键吗?

1 个答案:

答案 0 :(得分:0)

严格正常的做法是说 表都不应该包含余额列,但用户'应从所有历史总和中计算余额。但是,您可能会发现使用这样的模式会导致不可接受的性能 - 在这种情况下缓存余额是明智的:

  • 如果您对当前余额最感兴趣,那么在History表中缓存余额的理由很少(只需缓存当前仅User表中的余额);

  • 另一方面,如果您可能对任意历史余额感兴趣,那么将历史余额存储在History表中是有意义的(然后还有一点点也是如此将当前余额存储在User表中,因为可以从最新的History记录中轻松发现。

但也许它现在不值得担心缓存?请记住咒语" 正常化直到它受伤;非正常直到它起作用"以及Knuth的着名格言" 过早优化是所有邪恶的根源"。