database-design - 数据仓库中的事实表是否需要代理主键?

标签 database-design business-intelligence

当我问我们的数据库设计人员为什么我们的 Fact 表没有 PK 时,我被告知即使选择了所有列,表中也没有一组列可以唯一标识一条记录。当我建议我们在这种情况下创建一个身份列时,我被告知“我只是在浪费空间而且不需要它。”

我的感觉是,源系统中的每个表都应该有一个PK,即使它是一个标识列。鉴于数据仓库 (DW) 是来自其他系统的数据的接收者,如果无法绑定(bind)各个记录,我将如何确保 DW 中的数据准确反射(reflect)源系统中的内容?如果你有一个失控的加载程序,它搞砸了数据并且已经运行了一周,你将如何在没有某种独特约束来比较的实时事务源系统中调和这些差异?

最佳答案

数据仓库不一定是关系数据存储,尽管您可以选择使其成为一个,因此关系定义不一定适用。

仅当您想对需要唯一标识符的数据执行某些操作时才需要主键(例如将其跟踪到源,但这并不总是必需或必要甚至可能的);并且数据仓库中的数据通常可以以不需要主键的方式使用。具体来说,您可能不需要将行彼此区分开来。最常用于构造聚合值。

时间不是构建数据仓库表的必要维度。

这可能在心理上不舒服,浪费空间是一个小问题,但你的同事是正确的——PK 不是必需的。

关于database-design - 数据仓库中的事实表是否需要代理主键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/930246/

相关文章:

c# - 如何将 ASP.NET 成员/角色用户链接到数据库中的表?

javascript - 寻找有关报告前端以使用 SSAS/SSRS 的建议

data-warehouse - 交易事实表方法

memory-management - SSAS 和 Power BI 在内存使用方面的差异

visual-studio-2013 - 商业智能 - Visual Studio 2013 的 SSDT

MongoDB 模式设计适用于 Tinder 之类的应用程序、嵌入式文档还是单独的集合?

java - 从 JDO 中的关系表获取额外信息

php - 哪种方式在数据库中存储和处理大量数据是合法的?将所有内容存储在一张表中还是通过 id(属性)为每个表创建新表?

mysql - 如何使用关系代数从数据库中获取冗余一致(重复)数据?

sql - 数据聚合 - 每日 SQL 脚本与数据仓库