如何解决是否可以为每行数据存储历史配置设置,而无需将所有配置设置塞入每行数据?
背景介绍:我最近被一家水处理公司聘为数据库工程师。我们在全国各地部署水处理机器,机器处理水并将有关进水状态(流量、温度、进水中 X 浓度等)和处理情况的连续数据发送给我们该机器在那个时间点应用于该水。随着时间的推移,现场(及其各种组件)会发生很大变化:机器可能会发生故障并需要更换,可能会使用不同浓度的化学品来填充机器的储罐,其流量计和其他传感器可能会重新校准或设置为了扩大规模,它的化学泵可能会被更换,等等。这些会影响数据的解释:例如,如果在 01/01/2021 12:00:05 将 5 mL 氯添加到进水中,这意味着氯浓度为 5% 或 40% 时两种完全不同的情况集中。
水处理数据点由一个复合键标识,该键由站点 ID 和时间戳组成。如果唯一重要的数据是当前数据,那将很容易,因为我可以将配置设置存储在站点级别,并根据需要将它们拉出数据点。但是我们需要能够正确解释旧数据。因此,我考虑将配置存储在另一个表中,跟踪每个时间段内每个站点的所有设置,但是不可能在数据点的连续时间戳和配置的开始/结束日期之间创建外键 - 最接近的事情将是某种范围检查,例如“Datapoint.TimeStamp BETWEEN Configuration.Start AND Configuration.End”。因此,我看到的唯一其他选项是将每个数据点的每个配置设置与每个数据点一起存储,但考虑到有多少配置设置以及生成了多少数据点,这似乎是一个糟糕的解决方案,尤其是因为大多数设置都没有甚至经常改变。
那么,有没有办法以完全标准化的方式存储每行数据的历史配置,或者是将所有设置塞入每个数据点的唯一可能解决方案?
解决方法
如果我理解你的要求:
1 - 一个水数据点由一个由站点 ID 和时间戳组成的组合键标识:
- 站点 ID
- 时间戳ID
2 - 发生故障时,水数据点可以有多种配置,例如:
- 配置 ID
- 开始日期
- 结束日期
让我们考虑一个 DataPoint
具有特定日期的以下信息:
DataPoint SiteID TimeStampID
1001 101 01-02-2021 09:00:01
1001 101 01-02-2021 10:20:31
1001 101 01-02-2021 17:45:00
那天,从 11:01:20 开始,到 11:34:22 结束。
ConfigurationID DataPoint StartDate EndDate
155 1001 01-02-2021 11:01:20 01-02-2021 11:34:22
,
我接受的原始答案似乎已被删除。对于以后来这里的人,我打算采用的解决方案如下:
我将创建一个配置表来保存以下格式的设置:
_SiteID_ _Start_ _End_ <various settings fields>
318 "2021-01-01 12:22:03" "2021-02-10 09:08:26" ...
其中主键是 (SiteID,Start,End)
。 SiteID
是 ID
表的整数 Site
的外键,Start
是配置开始生效的日期,End
(默认: NULL
) 是配置不再有效的日期。为了让用户(和我自己)保持良好和简单,并防止在应该插入新配置行时对旧配置设置进行任何意外更新,我将禁止 UPDATE
和 { {1}} 对除 root 之外的所有用户的配置表进行操作,而是创建一个存储过程来“更新”给定 DELETE
的配置。存储过程将采用用户指定的任何新参数,复制用户未从该站点的最新配置中指定的任何参数(即,具有相同 Site
和 {{1} } 结束日期),将最近配置行的 SiteID
NULL
日期覆盖为新行的 NULL
日期,最后使用指定的 End
创建新行日期。
注意:每个配置都存储 Start
日期和 Start
日期,因为配置可能不一定是连续的,即“尽快当配置过期时,还有另一个配置在该配置过期的确切时间开始”,因为如果客户在一段时间内不需要我们的服务,水处理设备的部署有时会在它们之间存在很大差距。如果不存储配置的 Start
日期,我们将不得不假设每个配置持续到下一个配置开始,或者直到现在,如果没有存储以后的配置。因此 End
日期被存储,因此我们永远不会认为“站点 A 被配置为从 2020 年 1 月到 2021 年 6 月具有 XYZ 设置”,因为自 2020 年 5 月以来站点 A 甚至没有一台机器。将 End
日期与 End
日期一起显式存储还可以避免需要依赖其他配置数据行中的值来了解如何解释给定配置数据行的麻烦。
感谢最初给我这个答案的灵感的人,我不知道为什么你的答案被删除了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。