汇总数据的数据库设计

时间:2010-02-22 14:42:21

标签: sql mysql ruby-on-rails database-design postgresql

我有一个新表,我将添加到一堆其他汇总数据,基本上通过计算每周avgs来减少一些负载。

我的问题是我是否会因为一种模式而不是另一种模式而变得更好。一种模型,一周中的几天作为一列,附加一列价格或另一个模型作为DOW的一系列字段,每个都需要付出代价。

我想知道哪些可以节省我的速度和/或头痛?或者至少是权衡。

IE。

ID   OBJECT_ID   MON  TUE  WED  THU  FRI  SAT  SUN   SOURCE

OR

ID   OBJECT_ID   DAYOFWEEK   PRICE   SOURCE

2 个答案:

答案 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

<强>更新

好吧不清楚每天都会有价格。在这种情况下,我对约束的观点并不是那么有效。我仍然更喜欢第二种模式,它似乎更好地归一化。我现在还不太了解这个案例,说这是否是为了清晰和表现而摆脱一些良好的规范化做法的好时机,但它可能是......