假设我们正在存储1000个设备的数据,这些设备每10秒收集一种类型的数据。每个设备可以位于不同的时区。快速查询以可视化数据的能力非常重要。我们可以询问系统问题如下:
1. For a specific device, I want the last 7 days of data grouped by day totals for my local timezone.
2. For a specific device, I want the last year's data grouped by month totals for my local timezone.
以UTC格式存储所有数据似乎是最干净的方法,但在要求本地数据分组时变得棘手。例如,每个时区的一天分组具有不同的偏移量。因此,如果我们要说日,月,年“桶”,它们都会相对于UTC进行分组,这对于询问除UTC本身以外的时区的问题是没有用的。
如果我们以分钟和小时“桶”对数据进行分组(忽略关闭时间不到一小时的时区,例如IST +5:30),我们可以使用小时“桶”来构建答案。以上问题。对于问题2,每个分组将有12个分组,最多744小时“桶”。
使用分钟和小时的方法(忽略不到一小时关闭的时区,例如IST +5:30)“水桶”看起来像一个体面的设计?有没有人用不同的建议设计类似的东西?
答案 0 :(得分:1)
是的,通过偏移创建存储桶是合理的设计,这通常发生在数据仓库中(例如)。
虽然以1小时为增量进行分组意味着忽略了许多真实的地方。正如您所指出的,印度是一个使用:30
偏移的位置。如果您想覆盖世界上的每个现代时区,您实际上需要扣除15分钟段,因为有几个段落:30
或:45
偏移。
当然,如果您发现可以接受错误,那么您可以使用您可以容忍的任何粒度。从理论上讲,你可能会超过一个小时 - 你只会有更大的误差。
如果您想考虑不同的方法,可以使用设备的本地时间以date-time-offset
形式存储该值。索引这样的值时,大多数数据库都会转换为UTC,因此您可能还需要一个计算列来提取和索引本地时间部分。然后,您可以按当地时间分组,而不必知道如何与UTC联系。这种方法的缺点是数据固定在其原始时区。您无法轻松重新组合以推断出不同的时区。虽然这些是现实世界中的实际设备,但这通常不是问题。