考虑一个带有事实表的维度模型,例如(fk_dim1value, fk_dim2value, ..., value)列fk_X是对应平凡维度表的外键dim1value (id, value), dim2value (id, value),等。
这些事实和维度表是从不同的来源自动收集的,所以它们有很多......而且它们是多余的:所有维度值表在结构上都是相同的(id, value),表示没有进一步语义的文本值的简单集合(唯一的区别是在各种事实表中引用它们的不同外键)。稍后可能会出现不那么琐碎的维度类型,但不同类型维度的集合仍然很小。
所以我想将维度表合并到一个引用 table 的表中dimvalue (fk_dim, dimvalue_id, value),并且仅在每个维度中是唯一的。然后自然主键是复合的:.fk_dimdimension (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表的外键,然后添加检查约束以按维度限制吗?还是参照完整性要求我放弃更多而只接受所有单独的相同表?
(约束对写入性能的影响并不重要;读取性能是设计目标。)