如果您正在执行min/max/avg查询,那么您更喜欢使用聚合表还是仅查询原始表中的一系列行?要聚合还是不聚合,那就是数据库模式设计问题
这显然是一个非常开放的问题,没有一个正确的答案,所以我只是寻找人们的一般建议。假设原始数据表由一个时间戳,一个数字外键(比如用户ID)和一个十进制值(比如购买金额)组成。此外,假设表中有数百万行。
我已经完成并且被撕裂了。一方面,聚合表为我提供了更快的查询速度,但代价是增加了额外的表。显示聚合范围的当前值要么完全返回到原始数据表或组合更多细粒度聚合。我发现在应用程序代码中追踪哪个聚合表要查询何时需要更多的工作,并且需要更改模式,因为原始聚合范围总是不够用(“但我想看看我们在过去3个薪酬阶段的销售额!“)。
另一方面,从原始数据查询可能会受到惩罚,但让我对数据范围非常灵活。当范围边界发生变化时,我只需更改查询而不必重新生成聚合表。同样,应用程序代码也需要更少的更新。我怀疑如果我的索引更聪明(即总是有很好的覆盖索引),我可以减少从原始数据中选择的惩罚,但这决不是万能药。
无论如何我能拥有两全其美?
这是干什么用的数据库? – 2009-12-23 23:33:55
我通常使用MySQL,但希望人们的提示适用于所有SQL数据库。 – pr1001 2009-12-23 23:46:15
@ pr1001:这在一定程度上是一个普遍问题,但是一些数据库提供了使这个问题更容易的机制(例如Oracle的“物化视图”),所以这样做“正确”将会是数据库特定的程度 – skaffman 2009-12-24 10:41:44