事实表中的外键

Posted

技术标签:

【中文标题】事实表中的外键【英文标题】:Foreign Keys in Fact Tables 【发布时间】:2020-11-14 23:08:08 【问题描述】:

将所有数据合并到一个事实表中是否更常见,例如:

-- MOVIE_SALE -- 
Year
Studio
Studio_CEO
Studio_Location
Studio_...
Movie_Name
Movie_Copyright
Movie_PrimaryLanguage
Amount

或者,对于包含该组信息的其他表的外键是否更常见和更好的做法,例如:

-- MOVIE_SALE -- 
Year
Studio_ID
Movie_ID
Amount

为什么一种方式比另一种更受欢迎?

【问题讨论】:

【参考方案1】:

假设(基于您添加到问题中的标签)您询问的是 Kimball 维度建模,您给出的第一个示例不是有效的事实表,而第二个示例是。因此,毫无疑问,哪个可能是首选,因为第一个示例不是要考虑的候选对象。

更新 1

关于为什么这不是一个有效的事实表的问题的长答案(我希望这不会像它绝对不应该的那样显得傲慢)是你需要读一本书关于维度建模:The Definitive Guide to Dimensional Modeling。鉴于您的问题是关于维度建模的一些非常基本的概念,因此解释维度建模的工作原理对于本论坛来说太大了。

简短的回答是,在大多数情况下,事实表只能包含两种类型的列:

    维度的外键 措施

为了完整起见,它可能包含的另外两种类型的列是:

    审核列 - 您选择添加以跟踪记录活动的任何内容 退化维度:没有任何其他相关属性的单个属性,而这些属性通常会放在一个维度中

希望这有帮助吗?

【讨论】:

您能否解释一下为什么第一个不是有效的事实表?【参考方案2】:

最好将数据建模为星型模式。

在您的情况下,事实表是 MovieSales。您的维度是日期、工作室和电影。

通常情况下,事实表中会包含更多数据,因此您不希望重复每一行的元数据。

【讨论】:

以上是关于事实表中的外键的主要内容,如果未能解决你的问题,请参考以下文章

如何在Laravel中查看外键中的表字段

SQL中怎么向外键中插入数据

从刀片中的外键获取数据

在休眠 ORM 中使用一个强制外键和一个可选外键中的列

如何从对象的外键中获取对象的值?

此表中的外键约束有啥问题?