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