当我问我们的数据库设计人员为什么我们的 Fact 表没有 PK 时,我被告知即使选择了所有列,表中也没有一组列可以唯一标识一条记录。当我建议我们在这种情况下创建一个身份列时,我被告知“我只是在浪费空间而且不需要它。”
我的感觉是,源系统中的每个表都应该有一个PK,即使它是一个标识列。鉴于数据仓库 (DW) 是来自其他系统的数据的接收者,如果无法绑定(bind)各个记录,我将如何确保 DW 中的数据准确反射(reflect)源系统中的内容?如果你有一个失控的加载程序,它搞砸了数据并且已经运行了一周,你将如何在没有某种独特约束来比较的实时事务源系统中调和这些差异?
最佳答案
数据仓库不一定是关系数据存储,尽管您可以选择使其成为一个,因此关系定义不一定适用。
仅当您想对需要唯一标识符的数据执行某些操作时才需要主键(例如将其跟踪到源,但这并不总是必需或必要甚至可能的);并且数据仓库中的数据通常可以以不需要主键的方式使用。具体来说,您可能不需要将行彼此区分开来。最常用于构造聚合值。
时间不是构建数据仓库表的必要维度。
这可能在心理上不舒服,浪费空间是一个小问题,但你的同事是正确的——PK 不是必需的。
关于database-design - 数据仓库中的事实表是否需要代理主键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/930246/