维度建模:如何创建没有代理主键的表?

Posted

技术标签:

【中文标题】维度建模:如何创建没有代理主键的表?【英文标题】:Dimensional Modeling: how to create a table without Surrogate Primary Keys? 【发布时间】:2018-11-08 16:36:58 【问题描述】:

据我了解,事实表中没有主键,放置代理键在某种程度上是浪费空间。因此,外键组合是事实表的主键。

但我可能无法做到这一点,因为唯一键可能会在事实表中重复,例如同一个人在同一天在同一家餐厅支付了两次费用。在这种情况下,主键不再是唯一的......

有没有办法在不添加代理键的情况下解决这个问题?

提前致谢!

【问题讨论】:

这听起来像是一个事务表,而不是事实表。而在事务表中,你应该有时间。 @GordonLinoff 我有一个时间维度,但如果是同时呢? 。 .事实表包含共享维度值的事物的摘要。不应该有重复。如果您不想要摘要,那么它不是事实表。如果你想要一个事务表,那么你仍然应该有区分它们的 some 属性。如果没有时间,那么收银员什么的。 @NicolasTang - 你应该问的问题是“我如何区分合法的多次出现和重复?”。这是一个 ETL 问题,而不是表设计问题。如果您可以确定这些记录是有效的,则不需要它们是唯一的。 (旁注:一般情况下,事实表中不应该有主键 - 仅在维度中)。 无论我们是否写过一本书,我们都可以发表意见。在事实表等维度建模概念的定义上,我倾向于与 Kimball 一起使用,这样就不会那么混乱了。 【参考方案1】:

如果您要构建这样的表,强烈建议使用主键或唯一键组合,但如果您避免添加 PK,则可能需要添加唯一交易编号,以便您可以将客户编号和交易编号组合为组合键。

【讨论】:

【参考方案2】:

InnoDB,如果您不提供 PK,将为您提供一个。但它是 6 个字节并且是隐藏的。与 4 字节代理 INT 相比,它更大!

检查数据;可能存在一个“自然”PK,它是一个列或列的组合。

一般来说,对于 DW,我在 Fact 表上的唯一索引是 PK。然后我使用“汇总表”进行大量访问。这些更小更快。在极端情况下,我将清除旧的 Fact 行(通过DROP PARTITION),但“永远”保留在汇总表上。这样可以控制磁盘空间,同时几乎不会丢失任何有用的数据。

底线:为每个表提供一个显式 PK。

【讨论】:

以上是关于维度建模:如何创建没有代理主键的表?的主要内容,如果未能解决你的问题,请参考以下文章

维度建模疑点

如何在维度模式中建模父子关系表

搭建数据仓库第08篇:逻辑建模–5–维度建模核心之一致性维度2

同一实体具有不同业务键的维度

维度建模(星型雪花星座)

慢慢改变尺寸