具有主键和外键的事实 Table

Fact Table with Primary Key and Foreign Keys

我一直在浏览 Kimball-The-Data warehouse-Tookit 第 3 版以了解事实和维度;我无法理解以下段落信息。谁能给我可能的理解:

事实table一般都有自己的主键,由外键的一个子集组成。此键通常称为复合键。每个具有复合键的 table 都是一个事实 table。 Fact tables 表示多对多关系。其他都是维度tables。 通常有一些维度一起唯一标识每个事实 table 行。在确定了整个维度列表的这个子集之后,其余维度在事实 table 行的主键的上下文中采用单个值。换句话说,他们一起去兜风。

感谢您抽出宝贵的时间。

为了完全理解这一点,我们可能需要将其分解并通过几张图片帮助我们。

让我们从第一个定义开始:

  • 事实上table通常有自己的主键,由外键的一个子集组成。此键通常称为复合键。

在这个非常简单的图表中,我们可以看到有一个事实 table (Fact_Sales) 本身没有自己的主键,而是一组指向维度 tables(确实有主键)。 sales(Date_Id/Store_Id/Product_Id)中的这组外键是一个组合键,作为事实table的主键。这给我们带来了定义:

  • 每个具有复合键的 table 都是事实 table。

下一个定义:

  • 事实 table 表示多对多关系

同样,正如在示例的 ERD 中所见,事实 table Fact_Sales 也可以被视为表示多对多的联结 table Dim_Store 和 Dim_Product 之间的关系,即一个商店可以销售许多产品,一个产品可以在许多商店销售。

现在,如果 table 不是上面定义的事实 table 那么我们来看下一个定义:

  • 其他都是维度tables

好的,到目前为止一切顺利,让我们继续后续的定义:

  • 通常有一些维度一起唯一标识每个事实 table 行。

随着我们使模型变得更加复杂,我们可能会达到事实的外键集成为唯一键的程度。例如,如果我们添加了另一个维度 Dim_Customer 并因此向 Fact_Sales 添加了一个新的外键,那么我们将得到复合键作为 (Date_Id/Store_Id/Product_Id/Customer_Id),也可以说我们将时间添加到维度日期(这可能会带来单独的讨论,但为了分析起见,我们假设我们在日期维度中有它)然后这个组合密钥将是唯一的,因为不可能在同一时间向同一商店的同一客户出售同一商品。

最后,是时候进一步扩展我们的模型了,所以我们将转向这样的雪花模式:

最后一句:

  • 在确定整个维度列表的这个子集后,其余维度在事实 table 行的主键的上下文中采用单个值。换句话说,他们一起去兜风。

意味着一旦我们通过它的外键(事实table行的主键)识别对应于事实的维度,例如在上图中这些将是Date_Id/Store_Id/Product_Id,其他维度由维度 tables 外键唯一标识;例如,Dim_Geography 是由 Dim_Store 通过其外键 Geography_Id

邀请的“going along for the ride”

图片出处: 英文维基百科的 SqlPac,CC BY-SA 3.0 https://creativecommons.org/licenses/by-sa/3.0,来自 Wikimedia Commons