Database 存储事件以进行报告

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 |

在数据库中存储事件发生的最佳方式是什么,这样您就可以快速获取事件报告?ie(事件总数、日期范围之间的事件数)

现在我有两个数据库表,一个保存事件的所有单独时间戳,这样我可以查询日期范围,另一个保存总计数,这样我可以快速提取该数字进行计数

表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,以保存日期计数,它应该更有效,因为我的日期范围查询只在整个日期上进行,而不是时间戳(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就很好了。性能始终是特定设计的一个很好的理由。您是否对实时或更晚的报告更感兴趣?您应该接受答案或澄清问题您是否对实时或更晚的报告更感兴趣?您应该接受答案或澄清问题