Database 存储事件以进行报告
在数据库中存储事件发生的最佳方式是什么,这样您就可以快速获取事件报告?ie(事件总数、日期范围之间的事件数) 现在我有两个数据库表,一个保存事件的所有单独时间戳,这样我可以查询日期范围,另一个保存总计数,这样我可以快速提取该数字进行计数 表1:Database 存储事件以进行报告,database,postgresql,database-design,data-structures,Database,Postgresql,Database Design,Data Structures,在数据库中存储事件发生的最佳方式是什么,这样您就可以快速获取事件报告?ie(事件总数、日期范围之间的事件数) 现在我有两个数据库表,一个保存事件的所有单独时间戳,这样我可以查询日期范围,另一个保存总计数,这样我可以快速提取该数字进行计数 表1: Event | Total_Count ------+------------ bar | 1 foo | 3 表2: Event | Timestamp ------+---------- bar | 1/1/2010 foo |
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,以保存日期计数,它应该更有效,因为我的日期范围查询只在整个日期上进行,而不是时间戳(2010年1月1日vs 2010年1月1日00:01:12)
即:
更新表2
Event | Date | Total_Count
------+----------+------------
bar | 1/1/2010 | 1
foo | 1/1/2010 | 1
foo | 1/2/2010 | 2
也许有更聪明的方法来解决这个问题?有什么想法吗?我想要一张有你的活动时间戳的表。然后,您的报告只需正确设置
where
子句
或者我在您的问题中遗漏了什么?我只需要一个带有您事件时间戳的表。然后,您的报告只需正确设置
where
子句
还是我在你的问题中遗漏了什么?你的方法似乎很好。我更多地将表2视为详细信息表,而将表1视为汇总表。在大多数情况下,您将只对表2进行插入,而对表1进行插入和更新 更新后的表2可能不会给您带来太多额外的好处。但是,如果一天的聚合对你来说是最重要的,你应该考虑它。
<>你可以考虑在表中添加更多的属性(列)。例如,您可以在表1中添加第一个日期和最后一个日期。您的方法似乎不错。我更多地将表2视为详细信息表,而将表1视为汇总表。在大多数情况下,您将只对表2进行插入,而对表1进行插入和更新 更新后的表2可能不会给您带来太多额外的好处。但是,如果一天的聚合对你来说是最重要的,你应该考虑它。
<>你可以考虑在表中添加更多的属性(列)。例如,您可以在表1中添加第一个日期和最后一个日期。似乎您没有任何要求: 从时间戳更改为日期部分是一件大事。 你不想做一天中的时间分析吗? 比如,如果停止“foo”的发生,那么一天中进行维护的最佳时间是什么 你不担心尺寸吗?你说你有数以百万计的记录(就像那是很多),然后你用一个额外的列扩展每一行。在行数猛增之前,一列并不多,然后你真的必须考虑每一列 因此,要获得过去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'
考虑一下添加一行所需的触发器。。。获取当天和活动的最大值并添加一个。。。每次插入时
不确定您使用的是哪种类型的服务器,但我在285ms内汇总了100万行。所以你将拥有多少百万,需要多少次求和,每次都是相同的日期范围还是完全随机的?似乎你真的没有任何要求: 从时间戳更改为日期部分是一件大事。 你不想做一天中的时间分析吗? 比如,如果停止“foo”的发生,那么一天中进行维护的最佳时间是什么 你不担心尺寸吗?你说你有数以百万计的记录(就像那是很多),然后你用一个额外的列扩展每一行。在行数猛增之前,一列并不多,然后你真的必须考虑每一列 因此,要获得过去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'
考虑一下添加一行所需的触发器。。。获取当天和活动的最大值并添加一个。。。每次插入时
不确定您使用的是哪种类型的服务器,但我在285ms内汇总了100万行。所以你会有多少百万,需要多少次求和,每次都是同一个日期范围还是完全随机的?一张表不起作用。在一个高流量的网站上,将有数百万条记录,查询总数,即使有一些非常好的索引,也会花费很长的时间。一个表不起作用。在一个高流量的网站上,将有数百万条记录,查询总数,即使有一些非常好的索引,也需要很长时间。我喜欢你的其他想法,可能会派上用场。我正在考虑更新表2,b/c,否则该表将保存数百万条记录。因此,对一个范围进行查询仍然需要很长时间,但如果我知道每天的总金额,我认为查询可能会发生得更快,这很好。那么,使用更新后的表2就很好了。性能始终是特定设计的一个很好的理由。我喜欢你的其他想法,可能会派上用场。我正在考虑更新表2,b/c,否则该表将保存数百万条记录。因此,对一个范围进行查询仍然需要很长时间,但如果我知道每天的总金额,我认为查询可能会发生得更快,这很好。那么,使用更新后的表2就很好了。性能始终是特定设计的一个很好的理由。您是否对实时或更晚的报告更感兴趣?您应该接受答案或澄清问题您是否对实时或更晚的报告更感兴趣?您应该接受答案或澄清问题