可扩展的表结构,用于定期更新的统计数据,这些统计数据会随着时间的推移而聚合

Ven*_*rix 6 database-design

我每 30 秒收到一次统计数据,我想将这些数据存储在我的数据库中,以便以后进行分析。例如,每 30 秒我就可以收到过去 30 秒内商店售出的橙子数量。后来,我想从数据库中检索这些数据,并使用它来生成图表,显示过去 24 小时、过去 x 周、过去 x 个月和过去 x 年商店出售的橙子数量等信息。

如果我只是将所有内容都转储到一张表中,它似乎会增长得非常快,特别是如果您有很多数据源(存储)。我的想法是可以对数据进行平均,以便随着时间的推移减少粒度。也就是说,保留过去几个小时的详细记录(每 30 秒在数据库中记录一次),然后可能是过去几周平均 15 分钟的时间跨度,然后保留过去几个月每天的平均值,等等.

通过这种方式,您将拥有大量最近的记录、大量相对较旧的记录和一些旧记录。然而,所有数据仍然存在,它只是在几天或几个月内汇总并平均为一个条目,而不是 30 秒。

这种方法有意义吗?有没有更好的方法?我如何将它组织成一张桌子?会是多张桌子吗?SQL(可能是 MySQL)是一个很好的选择还是会更好?对此的任何想法将不胜感激!

Joe*_*own 6

坦率地说,我总是对丢弃细节感到紧张。出于这个原因,我会尝试找到一种方法来保持(或至少存档)最细粒度的数据。这样,如果您的汇总要求发生变化,您始终可以返回源数据并重新计算适当的汇总统计信息。

至于您计算不同年龄不同时间的平均值的方法,这是一种公平的做法,在某种程度上可以满足许多组织的需求。

虽然您在几周后不关心每 30 秒的时间段肯定是真的,更不用说一年后了,但您从什么时候开始停止增加报告时间段?你是停在几天还是几周?(或几个月?或季度?)

一旦过了几天,您就会遇到许多组织所依赖的逐年比较的问题。我见过一些数据仓库,其中预先计算了多个时期。无论您是这样做还是只选择一个“最长的时间段”(例如几天),这取决于您如何在快速访问和冗余数据之间进行权衡。

关于“我将如何将其组织成表格?” 最好的方法是拥有所代表时期的开始和结束日期/时间(精确到秒),以及该时期的平均计数。为方便起见,您还可以包含一个描述句点长度的分区属性,例如“m”、“h”、“d”、“w”、“M”、“q”、“y”或任何有意义的东西为您的总结。


Dav*_*Rix 5

您肯定希望保留您收集的所有数据,因为它对于长期的详细趋势非常有用,即使可能需要一段时间才能浏览所有数据。此外,在将数据汇总到粒度较小的表时,不要AVERAGE()将收集的数据 -始终 SUM()COUNT()您正在汇总的行 - 这允许您在需要时更高级别地汇总数据,并且您可以计算任何级别的平均值欲望。

记住...

你不能平均平均值...

在数据结构方面,我将采用以下方法;

  • detailed_data - 一个表格,用于保存您拥有的最细粒度的数据
  • minute_data - 以分钟级汇总的数据
  • hour_data - 以小时级别汇总的数据
  • day_data - 等等
  • week_data - 等等
  • month_data - 等等

在你的情况下我会做什么很大程度上取决于你如何接收统计数据,但我可以看到有几个简单的选择。

选项 1 - 创建存储过程来存储数据

这将是首选选项,因为您可以创建单独的存储过程来添加、更新和删除主表中的数据,然后该存储过程可以处理所有其他数据表的更新和汇总。

选项 2 - 在数据表上创建触发器

您可以使用触发器,以便在将数据添加到detailed_data表中时,它会自动将自身汇总到minute_data表中,然后触发对hour_data表的更新,依此类推。这样做的缺点是在删除或更新统计数据时,您可能必须创建一些非常聪明的触发器 - 但它是可行的。

分析什么

当您有这样汇总的数据时,您可以在任何您想要的级别对其进行分析,并且您可以将日期/时间信息加入维度表以获得更好的分析和过滤级别 - 有关更多信息,请参阅我对这篇文章的回答/sf/ask/227491421/