[英]Sum one table and update other with result, or just do `sum` on select?
可能是一个愚蠢的问题,但我正在创建一个系统,在该系统中,用户不能在他们可以上传的图片中超过 X 个 kb 安装量。
上传图片时,我会使用图片大小(以 KB 为单位)和其他信息更新images
表。
现在,我还应该跟踪users
表上每个用户图像的总大小吗? 或者我应该select sum(size) from images where user = xxx
每次我想检查限制时select sum(size) from images where user = xxx
? 每次新上传可能会出现哪些情况?
从关系的角度来看,最好的方法是什么?
您可以使用任一方法。
但是,因为您有一个与大小总和相关的业务规则,我可能建议您使用触发器来维护用户级别的总和。 虽然这对于insert
s/ update
s/ delete
s 有一些额外的开销,但在返回有关用户的信息时它的开销要小得多。
这还有其他一些优点:
users
表中实现检查约束(好吧,您可以在最新版本的 MySQL 中执行此操作)。将 SUM 存储在users
表中是一种非规范化。
如果您需要经常查询总和,并且每次需要时都进行聚合查询太慢,那么这可能是值得的。
但是您接受这样的风险,即users
表中存储的总和将与相关图像的实际SUM(size)
不同步。
您不会认为这会很困难,但在实践中,存在许多边缘情况,即存储的总和无法更新。 您将最终在后台定期运行聚合查询,以覆盖存储的总和,以防万一它不同步。
作为一名编码人员,非规范化对你来说是更多的工作,因为你必须编写代码来纠正这样的异常。 对于您创建的非规范化案例的数量要保守,因为每个案例都要求您做更多的工作。
但是,如果您对总和的查询比运行聚合查询更快地返回结果非常重要,那么这就是您必须做的。
根据我的经验,所有优化都是有代价的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.