我有一个(SQL Server)数据库,在该数据库中,我正在跟踪表上的更改;客户的要求是能够看到任何时间点的“图片”,指定请求的日期。到目前为止,我所做的是按照HistoryTable的思想,使用数据库触发器来存储历史数据,从而实现一个日志触发器。
现在,需求发生了变化,我需要在原始表中添加一个多到多(n-m)关系。当然,链接的数据集(n关系)也应该是“版本化”的,随着时间的推移而改变为原始表。
我的第一个想法是用主表中的“假ID”引用not关系,即:一个普通(int)字段,而不是主键(它不会随时间变化)。通过这种方式,我可以随着时间的推移更改ID,例如:
第1版:
Version 1
ID RelID Data
5 5 Version 1
Version 2
ID RelID Data
5 5 Version 2
Version 3
ID RelID Data
5 6 Version 3在本例中,n关系在版本1和版本2之间没有变化,但在版本3中发生了变化。
这很好,但我的问题是:
预先感谢您的帮助
发布于 2014-10-31 08:19:22
这个场景听起来很容易适应数据仓库的概念,即缓慢变化的维度。通常,2型缓慢变化的尺寸被认为是最有用的.这些记录每个版本的行的开始日期和结束日期,当前行只存储结束日期的NULL。
基本上,您将向桥接表中添加其他列,以记录该行版本的开始日期和结束日期。在EndDate是NULL的地方,您知道这是当前的行版本。
所以你的桌子看起来会是:
ID | RelID | StartDate | EndDate
----+-------+------------+------------
05 | 06 | 2014-10-01 | NULL
05 | 05 | 2014-09-10 | 2014-10-01
05 | 03 | 2014-09-10 | NULL从这些数据可以看出,ID 05与RelID 05相关,直到2014-10-01年,然后才与RelID 06相关,并且仍然与RelID 03相关。
然后,当您需要当前的关系数据时,您可以简单地说
SELECT *
FROM Table
WHERE EndDate IS NULL如果你回顾历史,你可以说
SELECT *
FROM Table
WHERE @selectionDate BETWEEN StartDate AND COALESCE(EndDate,GETDATE())如果不了解更多关于数据结构的信息,我就无法判断这是否适合您试图解决的问题。但是通常,多到多的关系需要在两个实际记录表之间建立一个桥接表来创建一个正确的关系,而Type-2缓慢变化的维度是数据仓库中对行进行版本控制的一种尝试和真实的方法,同样的概念可以应用于任何需要对记录进行历史版本控制的地方。
https://stackoverflow.com/questions/26669822
复制相似问题