背景:我最近被一家水处理公司聘为数据库工程师。我们在全国各地部署水处理机器,机器处理水并将有关进水状态(流量、温度、进水中 X 浓度等)的连续数据发送回给我们,以及有关处理的数据机器在那个时间点应用于那个水。随着时间的推移,场地(及其各种组件)发生了很大变化:一台机器可能会发生故障并需要更换,可能会使用不同浓度的化学物质来填充机器的水箱,它的流量计和其他传感器可能会重新校准或设置为了实现不同的规模,它的化学泵可能会被更换,并且不断地更换。这些会影响数据的解释:例如,
水处理数据点由包含站点 ID 和时间戳的复合键标识。如果唯一重要的数据是当前数据,那么存储配置会很容易,因为我可以将配置设置保留在 Site 表中,并根据需要将它们拉出用于数据点。但我们需要能够正确解释旧数据。因此,我考虑将配置存储在自己的表中,该表将跟踪每个站点在每个时间段内的所有设置,但是不可能在数据点的连续时间戳和开始/结束日期之间创建外键配置 - 最接近的是某种范围检查,例如“Datapoint.TimeStamp BETWEEN Configuration.Start AND Configuration.End”。
那么,有没有办法以完全标准化的方式存储每行数据的历史配置,或者是将所有设置塞进每个数据点的唯一可能解决方案?
这里有一些随机的想法。我猜在该特定点不存在数据点的情况下配置可能会发生变化。首先,我会为这些网站准备一张表格:
现在,您可以让您的表格与之相关
从你的描述中我不清楚你是否应该进一步标准化测量值,所以我会保持原样。
现在您可以将配置添加为:
我也不清楚配置值是否应该进一步规范化,所以我也将保留它
更改配置时,通过将 end_time 设置为 now 来关闭前一个配置,并添加一行 begin_time = now, end_time = null。
@JD 提到了其中一家商业供应商,它支持时态数据作为替代方案。您可能还想看看 IBM Db2 社区版。限制是 100Gb 存储、4 核和 16Gb 内存。如果您有兴趣,可以在ibm-db2-developer-community-edition找到更多信息
特别是对于时态表,您可以在使用时态表的时间旅行查询中找到更多信息
您所描述的内容称为渐变维度(SCD),每个配置项本质上都是测量(事实)的维度。如果您不想切换到支持时态查询的数据库,您仍然可以在 MySQL 中实现其中一种 SCD 方法(无论如何,时态表仍然在幕后工作)。不需要声明为外键,作为连接条件使用也
Datapoint.TimeStamp
没有错。Datapoint.TimeStamp BETWEEN Configuration.Start AND Configuration.End