如何在6型SCD维度表上实施参照完整性?

时间:2018-08-08 11:32:09

标签: sql sql-server foreign-keys scd

我在设计事实表和6型SCD维度表之间的主键和外键关系时遇到了困难。

维度表具有以下定义:

CREATE TABLE DimTable
(
surrogate_key           INT,
row_key                 INT IDENTITY (1,1),
natural_key             INT NOT NULL,
current_value           INT NOT NULL,
historic_value          INT NOT NULL,
is_current              BIT NOT NULL,
record_start_date_id    INT NOT NULL,
record_end_date_id      INT NOT NULL

-- Primary Key
CONSTRAINT pk_dimtable_surrogate_key_row_key PRIMARY KEY (surrogate_key, row_key);  

有关数据外观的示例:

surrogate_key | row_key | natural_key | current_value | historic_value | is_current | record_start_date_id | record_end_date_id
-------------------------------------------------------------------------------------------------------------------------------
121           | 2591227 | 123456      | 20090807      | 20090807       | 0          | 20180807             | 99991231
121           | 2591228 | 123456      | 20140807      | 20090807       | 0          | 20180807             | 99991231
121           | 2591229 | 123456      | 20141107      | 20140807       | 1          | 20180807             | 99991231
122           | 2591230 | 456789      | 20090807      | 20090807       | 1          | 20180807             | 99991231  

据我对wikipedia page的了解,我应该能够通过PK / FK关系强制执行参照完整性,但是该表中的主代理密钥不是唯一的,因此我不知道如何指向surrogate_id在我的事实表中添加到FK约束下的surrogate_key。

有什么办法可以解决此限制,还是我理解错误的说明?

顺便说一句,这是我第一次在这里提问,所以如果有任何不清楚或遗漏的地方,请告诉我!

编辑:列名是通用虚拟名。实际的姓氏更具描述性。

1 个答案:

答案 0 :(得分:0)

我相信您误解了SurrogateKey的概念。相反,这里的Row_Key属性使SurrogateKey更具意义。 我建议您阅读一本书以了解代理密钥。您可能需要在过程中进行很多更改。