维度建模:如何创建没有代理主键的表?
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。
【讨论】:
以上是关于维度建模:如何创建没有代理主键的表?的主要内容,如果未能解决你的问题,请参考以下文章