sql - 用于部分更改数据点的数据库设计,具有历史记录和快照功能?
问题描述
我正在为我正在处理的问题在概念上寻找最佳实践或解决方案。
我有一组数据点(大约 500 个)随着时间的推移被用户部分更改。重要的是能够分辨出哪些值在什么时间点发生了变化。数据可能如下所示:
数据随时间变化:
+--------------------------------------------------------------------------------------+
| Date | Value no. 1 | Value no. 2 | Value no. 3 | ... | Value no. 500 |
|------------+---------------+---------------+---------------+-------+-----------------|
| 1/1/2018 | | | 2 | | 1 |
| 1/3/2018 | 2 | 1 | | | |
| 1/7/2018 | | | 4 | | 8 |
| 1/12/2018 | 5 | 3 | | | |
....
必须可以在某个时间点拍摄快照,以获得一组完整的数据点,这些数据点在该特定时间点有效,如下所示:
2018 年 1 月 3 日拍摄的快照将产生:
+---------------------------------------------------------+
| Value 1 | Value 2 | Value 3 | ... | Value 500 |
|-----------+-----------+-----------+-------+-------------|
| 2 | 1 | 2 | 0 | 1 |
2018 年 1 月 9 日拍摄的快照将产生:
+---------------------------------------------------------+
| Value 1 | Value 2 | Value 3 | ... | Value 500 |
|-----------+-----------+-----------+-------+-------------|
| 2 | 1 | 4 | 0 | 8 |
2018 年 1 月 13 日拍摄的快照将产生:
+---------------------------------------------------------+
| Value 1 | Value 2 | Value 3 | ... | Value 500 |
|-----------+-----------+-----------+-------+-------------|
| 5 | 3 | 4 | 0 | 8 |
等等...
我不受特定数据库技术的约束,所以 SQL 或 NoSQL 都可以。可能无法满足 DB 域中的所有要求 - 有些可能必须在代码中解决。但我的主要问题是哪种数据库技术最适合这项任务?
我不太确定这是否适合时间序列数据库(TSDB),因为在给定时间只有一部分值发生了变化,知道哪些值发生了变化很重要。也许我错了?
/克里斯
解决方案
查看SQL Server 时态表引擎,这可能是您的解决方案。这种方法允许运行问题中提到的查询,例如
SELECT *
FROM my_data
FOR SYSTEM_TIME AS OF '2018-01-01'
但是,示例中的表似乎非常大(可能是非规范化的)。我建议按一些技术或功能特征(垂直分区)对列进行分组,以避免进一步的维护缺陷。
推荐阅读
- django - 从Django中的反向关系获取查询集的不同对象
- vue.js - 可以在Vue中渲染子组件吗?
- spring-boot - 如何在spring boot thymeleaf的列表中使用搜索结果列表进行分页
- java - 如果Java继承另一个异常,Java会多次捕获一个异常吗?
- xcode - Xcode 10 - 图像文字不再可用
- google-apps-script - Google Script - 从 text/html 到 application/pdf 的转换失败
- nfc - 创建文件并写入 MIFARE DESFire EV1 卡
- unity3d - 除了在 Unity3D 中使用“Assets/Gizmos”之外,如何使用自定义脚本图标
- delphi - Delphi TadoQuery - 参数类型转换
- java - 如果条件扩展类