1

考虑一个带有事实表的维度模型,例如(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表的外键,然后添加检查约束以按维度限制吗?还是参照完整性要求我放弃更多而只接受所有单独的相同表?

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

4

1 回答 1

1

您已经陈述了这些关键考虑因素

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

考虑到您追求快速读取性能,我会选择“大桌子”设计。诚然,大表设计对于事务系统来说是可怕的,但这不是一个。大表是指 TABLE(DIM1VALUE, DIM2VALUE, DIM3VALUE, DIM4VALUE....DIMNVALUE, FACTVALUE)

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

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

现在,如果您的维度表数量过多,您可以将大表拆分为基于逻辑用法进行分组的组,例如,如果维度中的 10 个属性始终一起使用,则将它们放在 BIGTABLE1 中,依此类推.

于 2009-09-10T21:28:51.643 回答