1

我在设计事实表和类型 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  

根据我对维基百科页面的理解,我应该能够通过 PK/FK 关系强制执行参照完整性,但是主代理键在此表中不是唯一的,因此我不知道如何将事实表中的 surrogate_id 指向具有 FK 约束的 surrogate_key。

有什么办法可以绕过这个限制,还是我理解的描述有误?

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

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

4

1 回答 1

0

我相信你误解了 SurrogateKey 的概念。相反,这里的 Row_Key 属性更适合 SurrogateKey。我建议去读一本书以了解代理键。您可能需要对流程进行大量更改。

于 2018-08-08T12:47:22.500 回答