我有一个新表,我将添加到一堆其他汇总数据,基本上通过计算每周avgs来减少一些负载。
我的问题是我是否会因为一种模式而不是另一种模式而变得更好。一种模型,一周中的几天作为一列,附加一列价格或另一个模型作为DOW的一系列字段,每个都需要付出代价。
我想知道哪些可以节省我的速度和/或头痛?或者至少是权衡。
IE。
ID OBJECT_ID MON TUE WED THU FRI SAT SUN SOURCE
OR
ID OBJECT_ID DAYOFWEEK PRICE SOURCE
答案 0 :(得分:6)
我会首先考虑以下聚合模型:
ID | OBJECT_ID | DATE | PRICE | SOURCE
---+-----------+------------+--------+--------
1 | 100 | 2010/01/01 | 10.00 | 0
2 | 100 | 2010/01/02 | 15.00 | 0
3 | 100 | 2010/01/03 | 20.00 | 0
4 | 100 | 2010/01/04 | 12.00 | 0
然后,您可以非常容易且相对较快地汇总上述数据以生成每周/每月/每年的平均值。
要获取每周平均值列表,您可以执行以下操作:
SELECT WEEK(date), AVG(price) FROM table GROUP BY WEEK(date);
对于其他一些示例,以下查询将返回星期日的平均价格:
SELECT AVG(price) FROM table WHERE DAYOFWEEK(date) = 1;
或者可以获得一年中第8周的平均每日价格:
SELECT AVG(price) FROM table WHERE WEEK(date) = 8;
获得每月或每年的平均值也很容易:
SELECT MONTH(date), AVG(price) FROM table GROUP BY MONTH(date);
如果以上聚合的计算成本太高,我只会选择更多的非规范化选项,例如你提出的两个选项。
答案 1 :(得分:2)
我会投票给第二个。对于第一个,您需要一些约束来确保任何行只有MON, TUE, WED, THU, FRI, SAT, SUN
中的一个。当然,对于第二个,您可能需要一些额外的参考数据来定义星期几,以填充DAYOFWEEK
。
<强>更新强>
好吧不清楚每天都会有价格。在这种情况下,我对约束的观点并不是那么有效。我仍然更喜欢第二种模式,它似乎更好地归一化。我现在还不太了解这个案例,说这是否是为了清晰和表现而摆脱一些良好的规范化做法的好时机,但它可能是......