首页 > 解决方案 > 用于部分更改数据点的数据库设计,具有历史记录和快照功能?

问题描述

我正在为我正在处理的问题在概念上寻找最佳实践或解决方案。

我有一组数据点(大约 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),因为在给定时间只有一部分值发生了变化,知道哪些值发生了变化很重要。也许我错了?

/克里斯

标签: sqldatabase-designnosqltime-series

解决方案


查看SQL Server 时态表引擎,这可能是您的解决方案。这种方法允许运行问题中提到的查询,例如

SELECT * 
FROM my_data   
FOR SYSTEM_TIME AS OF '2018-01-01'

但是,示例中的表似乎非常大(可能是非规范化的)。我建议按一些技术或功能特征(垂直分区)对列进行分组,以避免进一步的维护缺陷。


推荐阅读