2010-07-26 50 views
0

在数据库中存储事件发生的最佳方式是什么,以便您可以快速提取报告?即(发生的总次数,日期范围之间的发生次数)。存储报告事件

现在我有两个数据库表,一个持有该事件的所有单个时间戳 - 这样我就可以在一个日期范围查询,以及一个持有的总计数,所以我可以很快扳指编号为理货

表1:

Event | Total_Count 
------+------------ 
bar | 1 
foo | 3 

表2:

Event | Timestamp 
------+---------- 
bar | 1/1/2010 
foo | 1/1/2010 
foo | 1/2/2010 
foo | 1/2/2010 

是否有这个问题更好的方法?我想转换表2,以保持日期统计,它应该更有效率,因为我的日期范围查询只在整个日期进行,不是时间戳(1/1/2010 vs 1/1/2010 00 :01:12) 即:

更新表2

Event | Date | Total_Count 
------+----------+------------ 
bar | 1/1/2010 | 1 
foo | 1/1/2010 | 1 
foo | 1/2/2010 | 2 

或许那里有解决这一问题的一个更明智的方式?有任何想法吗?

+0

你对实时或以后的报告更感兴趣吗? – 2010-07-27 11:13:54

+0

稍后报告 – veilig 2010-07-27 12:27:24

+0

你应该接受一个答案或澄清问题 – 2010-10-28 14:56:35

回答

1

你的方法看起来不错。我将表2更多地视为细节表,而将表1视为汇总表。大多数情况下,您只会插入表2,并在表1中插入和更新。

更新后的表2可能不会给您带来额外的好处。但是,如果白天的汇总对您来说最重要,那么您应该考虑它。

您可能会考虑在表中添加更多属性(列)。例如,你可以一个FIRST_DATE,和最后日期添加到表1

+0

我喜欢你的其他想法,可能会派上用场。 我正在考虑更新的表2,b/c表中将保存数百万条记录,否则。因此对范围进行查询仍然需要很长时间,但是如果我知道每天的总金额,我认为查询可能发生得更快 – veilig 2010-07-26 18:57:49

+0

这太棒了。与更新后的表2一起使用会很好。性能始终是特定设计的一个很好的理由。 – bobs 2010-07-26 20:59:35

1

我只想为您的活动的时间戳一个表。那么你的报告只是正确地设置你的where子句...

或者我错过了你的问题中的东西?

+0

一张桌子不会工作。在一个高流量的网站上,将会有数百万条记录和查询总数,即使有一些非常好的索引,也会走向长久。 – veilig 2010-07-26 18:52:18

1

好像你真的没有任何要求:

从时间戳更改为只日期部分是一个大问题。 你不想做一个时间分析? 像什么是一天的最佳时间做维护,如果这停止“富”发生。

而你不担心尺寸?你说你有数百万条记录(就像那么多),然后你通过一个额外的列来扩展每一行。一列不是很多,直到行数高涨,然后你真的不得不考虑每一列。

因此,要获得事件的总和最近3天,你宁愿做这个

SELECT SUM(totcnt) FROM (
SELECT MAX(Total_count) as totcnt from table where date = today and event = 'Foo' 
UNION ALL 
SELECT MAX(Total_count) from table where date = today-1 and event = 'Foo' 
UNION ALL 
SELECT MAX(Total_count) from table where date = today-2 and event = 'Foo' 
) 

是啊,这看起来比>

SELECT COUNT(*) FROM table WHERE DATE BETWEEN today-2 and today and event = 'foo' 

更加容易,想想它的触发将需要添加一行...获取当天和事件的最大值,并添加一个...每次插入时?

不知道你有什么样的服务器,但我总结了285万行100万行。所以...你会有多少数百万,你需要多少次才能算出它们,并且每次都是相同的日期范围或完全随机的?