具有主键和外键的事实表
Posted
技术标签:
【中文标题】具有主键和外键的事实表【英文标题】:Fact Table with Primary Key and Foreign Keys 【发布时间】:2021-05-30 00:36:34 【问题描述】:我一直在通过 Kimball-The-Data warehouse-Tookit 3rd edition 了解事实和维度;我无法理解以下段落信息。谁能给我可能的理解:
事实表通常有自己的主键,由外键的子集组成。该键通常称为复合键。每个具有复合键的表都是事实表。事实表表示多对多关系。所有其他都是维度表。 通常有几个维度共同唯一标识每个事实表行。在确定了整个维度列表的这个子集之后,其余维度在事实表行的主键的上下文中采用单个值。换句话说,他们是顺风顺水。
感谢您抽出宝贵的时间。
【问题讨论】:
【参考方案1】:要完全理解这一点,我们可能需要将其分解并用几张图片帮助我们。
让我们从第一个定义开始:
事实表通常有自己的主键,由外键的子集组成。此键通常称为复合键。在这个非常简单的图表中,我们可以看到有一个事实表 (Fact_Sales),它本身没有自己的主键,而是一组指向维度表(确实有主键)的外键。销售中的这组外键(Date_Id/Store_Id/Product_Id)是一个复合键,充当事实表的主键。这给我们带来了定义:
每个具有复合键的表都是事实表。下一个定义:
事实表表示多对多关系再一次,从示例的 ERD 中可以看出,事实表 Fact_Sales 也可以看作是表达 Dim_Store 和 Dim_Product 之间的多对多关系的联结表,即一个商店可以销售许多产品并且一种产品可以在许多商店出售。
现在,如果一个表不是上面定义的 Fact 表,那么我们来下一个定义:
其他都是维度表好的,到目前为止一切都很好,让我们继续下面的定义:
通常有几个维度共同唯一标识每个事实表行。随着我们使模型变得更加复杂,我们可能会达到一个事实的外键集成为唯一键的地步。例如,如果我们添加了另一个维度 Dim_Customer 并因此为 Fact_Sales 添加了一个新外键,那么我们将复合键为 (Date_Id/Store_Id/Product_Id/Customer_Id),也可以说我们将时间添加到维度日期(这可能会带来单独的讨论,但为了进行分析,我们假设我们在日期维度中有它)然后这个复合键将是唯一的,因为不可能在同一时间向同一家商店的同一位顾客出售同一件商品。
最后,是时候进一步扩展我们的模型了,所以我们将转向像这样的雪花模式:
最后一句:
确定整个维度列表的这个子集后,其余维度在事实表行的主键上下文中采用单个值。换句话说,他们顺其自然。意味着一旦我们通过它的外键(事实表行的主键)识别出与事实相对应的维度,例如在上图中,这些维度将是 Date_Id/Store_Id/Product_Id,其他维度由维度唯一标识表外键;例如,Dim_Geography 正在“顺风顺水”,由 Dim_Store 通过其外键 Geography_Id 邀请
图片署名: 英语***上的 SqlPac,CC BY-SA 3.0 https://creativecommons.org/licenses/by-sa/3.0,来自维基共享资源
【讨论】:
感谢 Jayvee 的贡献1以上是关于具有主键和外键的事实表的主要内容,如果未能解决你的问题,请参考以下文章