具有主键和外键的事实表

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

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

Informix 如何更加有效的创建主键和外键

如何在 Clickhouse 中使用主键和外键的功能?

oracle中 主键和外键是啥意思?啥地方采用呢?

oracle中 主键和外键是啥意思?啥地方采用呢?

SQL 外键名称问题

主键和外键的复合键不能建立关系