合并相同的表但保持单独的引用完整性

时间:2009-09-09 17:13:58

标签: sql database postgresql foreign-keys referential-integrity

考虑使用(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) ...但当然每列都与特定维相关联,因此仍应限于特定引用该维的值(统一表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表,然后添加检查约束来限制维度吗?或者参照完整性是否要求我放弃更多并且只接受所有单独的相同表格?

(约束对写入性能的影响并不重要;读取性能是设计目标。)

1 个答案:

答案 0 :(得分:1)

您已经说明了这些关键注意事项

  • 从不同系统收集数据因此我得出结论这是一个“报告”表而不是“操作”或“交易”类型系统
  • 每个事实表每行包含1个业务数据,即“值”列
  • 您的事实表似乎只包含一个“度量”或“事实”
  • 写性能无关紧要,只有读性能才是目标。这证实了我的结论,即这是一个“报告”表

考虑到你在快速读取性能后,我会选择“大桌面”设计。对于交易系统来说,大表设计是可怕的,但这不是一个。用大表我的意思是 表(DIM1VALUE,DIM2VALUE,DIM3VALUE,DIM4VALUE ...... DIMNVALUE,FACTVALUE)

无论如何,您的维度表只有1列业务数据,因此请跳过查找。索引每一列(事实值除外),然后测试查询的性能。

加载大表时,您可以检查数据质量的值,并标记/寻址超出预期范围的值。

现在,如果维度表的数量过多,您可以将大表拆分为分组基于逻辑用法的组,例如,如果维度中的10个属性始终一起使用,则将它们保存在BIGTABLE1中,等等。