2014-10-31 86 views
0

我有一个(SQL Server)数据库,用于跟踪表上的更改;客户的要求是能够查看任何时间点的“图片”,并指定要求的日期。 我到目前为止所做的是在Log trigger的想法之后实施HistoryTable,并使用数据库触发器来存储历史数据。数据库记录有关n-m关系变化的信息

现在,需求发生了变化,我需要为原始表添加多对多(n-m)关系。当然,链接的数据集(n-m关系)也应该“版本化”,并随着时间的变化而变化为原始表格。

我的第一个想法是将n-m关系与主表中的“伪ID”相关联,即:正常(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 

在这个例子中,纳米关系没有版本1和2之间变化,但在第3版改变。

这是正常的,但我的问题是:

  • 每当纳米关系版本的变化,我怎么能得到一个新的RELID是在表中独特之处?
  • 另一种选择:我可以将n-m关系同时引用到ID和RelID(确实是唯一的)吗?
  • 有没有比我更聪明的解决方案?

预先感谢您的任何帮助

回答

1

这种情况听起来像它可以很容易地适应缓慢变化维度的数据仓库的概念。通常,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缓慢变化的维度是对数据仓库中的行进行版本控制的可靠和真实的方法,可以应用于任何需要历史版本记录的地方。

+1

我发现你的答案符合[this](http://stackoverflow.com/questions/19719110/data-warehouse-slowly-changing-dimensions-with-many-to-many-relationships)在SO上的相关答案。顺便说一下,所附的[文章](http://www.cibis.org.je/index.php/blog/2010/02/18/modelling-loading-a-slowly-changing-many-to-many-关系/)也是一个非常有趣的阅读。谢谢。 – Nova 2014-11-20 07:55:12