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

标签 mysql sql django relational-database django-orm

我想使用 Django ORM 跟踪每个用户的当前余额余额历史记录。我想象有 2 个表(UserHistory),UserHistory 之间存在一对多关系,代表一个用户的整个历史记录,以及用户历史之间的一对一关系,以便轻松访问当前余额:

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)用户是否应该有一个余额栏(我总是可以即时计算余额)?如果是这样,它应该是“缓存的”十进制值吗?或者它应该是最新余额的外键?

最佳答案

严格的正常方法会说,两个表都不应包含余额列,但应在需要时根据所有历史记录的总和来计算用户的余额。但是,您可能会发现使用这样的模式会导致性能 Not Acceptable ,在这种情况下缓存余额是明智的:

  • 如果您最感兴趣的是当前余额,那么就没有理由在History表中缓存余额(只需将当前余额缓存在History表中)仅用户表);

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

但也许现在不值得担心缓存?请牢记这句格言:“规范化,直到造成伤害;非规范化,直到有效”以及 Knuth 的著名格言“过早优化是万恶之源”。

关于mysql - 使用 SQL 管理历史和当前记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29308140/

相关文章:

django - Ajax - 如何自动保存我的 Django 表单

Mysql 不被识别为内部或外部命令

php - PHP 脚本可以在没有客户端请求的情况下在服务器上定期运行吗?

MySQL查询问题

mysql - 需要通过多个字段搜索的技巧[mysql优化]

SQL 2016 PolyBase 计算下推到使用 WASBS 又名 Azure Blob 的 Hadoop HDI

php - Laravel 5.4 中任何用户登录时喜欢和不喜欢的功能

mysql - 关于 MySQL 表上的垃圾收集/自动删除的问题

java - 在一条语句中使用 getGenerateKeys() 从 java 向 Oracle 数据库中插入多行

django如何创建字段相关字段