汇总数据的数据库设计

hol*_*den 2 mysql sql postgresql database-design ruby-on-rails

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

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

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

IE浏览器.

ID   OBJECT_ID   MON  TUE  WED  THU  FRI  SAT  SUN   SOURCE
Run Code Online (Sandbox Code Playgroud)

要么

ID   OBJECT_ID   DAYOFWEEK   PRICE   SOURCE
Run Code Online (Sandbox Code Playgroud)

Dan*_*llo 6

我会首先给出以下aggreate模型:

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
Run Code Online (Sandbox Code Playgroud)

然后,您可以非常容易且相对快速地聚合上述数据以生成每周/每月/每年的平均值.

要获得每周平均值列表,您可以执行以下操作:

SELECT WEEK(date), AVG(price) FROM table GROUP BY WEEK(date);
Run Code Online (Sandbox Code Playgroud)

对于其他一些示例,以下查询将返回星期日的平均价格:

SELECT AVG(price) FROM table WHERE DAYOFWEEK(date) = 1;
Run Code Online (Sandbox Code Playgroud)

或者可以获得一年中第8周的平均每日价格:

SELECT AVG(price) FROM table WHERE WEEK(date) = 8;
Run Code Online (Sandbox Code Playgroud)

获得月度或年度平均值也很容易:

SELECT MONTH(date), AVG(price) FROM table GROUP BY MONTH(date);
Run Code Online (Sandbox Code Playgroud)

如果上述聚合计算成本太高,我只会选择更多的非规范化选项,例如你提出的两个选项.