我在设计事实数据表和类型 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。
有没有办法绕过这个限制,或者我理解错误?
顺便说一句,这是我第一次在这里提问,所以如果有任何不清楚或遗漏的地方,请告诉我!
编辑:列名是通用的虚拟名称。实际的同名更具描述性。
我相信你误解了SurrogateKey的概念。相反,这里的Row_Key属性更有意义。 我建议去看书来理解代理键。您可能需要在流程中进行大量更改。