考虑一个带有事实表的维度模型,例如(fk_dim1value, fk_dim2value, ..., value)
列fk_X
是对应平凡维度表的外键dim1value (id, value), dim2value (id, value),
等。
这些事实和维度表是从不同的来源自动收集的,所以它们有很多......而且它们是多余的:所有维度值表在结构上都是相同的(id, value)
,表示没有进一步语义的文本值的简单集合(唯一的区别是在各种事实表中引用它们的不同外键)。稍后可能会出现不那么琐碎的维度类型,但不同类型维度的集合仍然很小。
所以我想将维度表合并到一个引用 table 的表中dimvalue (fk_dim, dimvalue_id, value)
,并且仅在每个维度中是唯一的。然后自然主键是复合的:.fk_dim
dimension (dim_id, name)
dimvalue_id
(fk_dim, dimvalue_id)
事实表外键列现在都引用同一个表,dimvalue (fk_dim, dimvalue_id, value)
......但当然,每一列都与特定维度相关联,因此仍应仅限于具体引用该维度的值(统一表的水平分区dimvalue
)。
有没有(明智的)方法可以做到这一点?
我的意思是类似于“半复合”外键,即对复合 PK 的“切片”的单列引用,其他列具有固定值。一个“完全复合”的 FK 将是FOREIGN KEY (col1, col2) REFERENCES dimvalue (fk_dim, dimvalue_id)
,但这里fk_dim
是固定的,因此键的“家”侧只是一列,引用dimvalue
主键的第二列;类似的东西FOREIGN KEY (fk_dim7value) REFERENCES dimvalue (fk_dim=7, dimvalue_id)
。
这样的事情可能吗?还是我在最后一段中迷失了方向?我应该放弃整个dimvalue
表的外键,然后添加检查约束以按维度限制吗?还是参照完整性要求我放弃更多而只接受所有单独的相同表?
(约束对写入性能的影响并不重要;读取性能是设计目标。)