【发布时间】:2012-12-13 23:07:21
【问题描述】:
这是一个关于在数据库中存储大量数据的难题。
假设我有一个充满机器的设施,每台机器都测量多个数量的时间序列。我会试着用一个玩具例子来解释。
MachineA 测量四个温度和一个湿度。 MachineB 测量一个温度和五个电压。 MachineC 测量风速和风向。测量一直在自动进行。
每台机器同时进行所有自己的测量,但时间间隔和偏移量因机器而异。这意味着一行只能包含一台机器在一个时间戳上进行的测量。
实际上有两千台机器。这意味着为每台机器或机器类型使用单独的表是不切实际的。
一直在添加不同的机器。一组跨越所有可能测量的列是不切实际的,因为如果我添加一个带有咸度测量的MachineD,我不会提前考虑咸度,我必须在一个非常大的表中添加一个新列只供那台机器使用。
典型查询:
-
MachineA在过去 90 天内的最高温度是多少? -
MachineB过去 7 天的所有测量结果是多少? - 在所有有温度测量的机器中,昨天测量的最低温度是多少?
- 对于每台进行温度测量的机器,昨天测量的最低温度是多少?
- 哪些机器具有咸味检测器,在过去一年内也有测量值?
- 根据
MachineC的风速和MachineB的温度,风寒是多少?
如何在这些限制条件下进行组织?
【问题讨论】:
-
如果所有内容都作为数值进行测量,只需存储该值,然后将哪个测量单位存储在单独的列中。该列可以是 ENUM 或字符串,对 有效测量 表具有外部约束。
-
@MikeChristensen,仅仅存储单元是不够的;还必须存储数量的名称(“widget 4 temp”)。您的建议可以适应这一点,但是当我从该数据库中获得一百万行时,大部分传输将用于标签而不是测量,对吗?有没有办法解决这个问题?
-
您可能需要考虑需要支持哪些类型的查询。如果它只是一个巨大的数据日志,您可能可以将所有内容序列化为字符串,或者首先重新考虑使用关系数据库。如果您需要查询某些类型的测量值或某些机器或某些小部件,则需要以支持的方式标准化您的数据。
-
“四个温度和一个湿度”意味着对于所有测量四个温度和一个湿度的机器来说是一样的吗?或者如果不是所有这样的机器,至少对于一组这样的机器?
-
@MikeChristensen,我会更新问题。