关键数据仓库事实的正确方法 Table

Proper Way to Key Data Warehouse Fact Table

在数据仓库中键入 FACT table 时,最好使用来自外部的主键 table 还是企业使用的唯一键或标识符?

例如(见下图),假设您有两个维度 tables "DimStores" 和 "DimCustomers" 以及一个名为 "FactSales" 的 FACT table。两个维度 table 都有一个整数数据类型的索引主键字段,名称为 "ID"。它们还有一个索引的唯一业务键字段,该字段是一个名为 "Number".

的字母数字文本数据类型

通常您会使用维度 tables 的主键作为 FACT table 中的外键。但是,我想知道这是否是最好的方法。

通过使用主键,为了查找或计算 FACT table 中的事实,您可能必须始终对主键进行连接查询并使用业务键作为你的查找。原因是因为大多数用户不会知道在 FACT table 中进行查找的主键值。但是,他们可能会知道业务密钥。因此,要使用该业务键,您必须执行连接查询才能建立关系。

既然业务键无论如何都被索引了,那么在 FACT table 中将其用作外键会更好吗?这样您就不必进行联接而直接进行查找或计算?

我猜这归结为连接查询是否那么昂贵?假设您正在处理十亿条记录 FACT table 和包含数千万条记录的维度。

示例 tables:

DimStores:
+------------+-------------+-------------+
| StoreId    | StoreNumber | StoreName   |
+------------+-------------+-------------+
| 1          | S001        | Los Angeles |
| 2          | S002        | New York    |
+------------+-------------+-------------+

DimCustomers:
+------------+----------------+--------------+
| CustomerId | CustomerNumber | CustomerName |
+------------+----------------+--------------+
| 1          | S001           | Michael      |
| 2          | S002           | Kareem       |
| 3          | S003           | Larry        |
| 4          | S004           | Erving       |
+------------+----------------+--------------+

FactSales:
+---------+------------+------------+
| StoreId | CustomerId | SaleAmount |
+---------+------------+------------+
| 1       | 1          |      0  |
| 1       | 2          |      0  |
| 2       | 3          |      0  |
| 2       | 4          |      0  |
+---------+------------+------------+

在上面要获得洛杉矶商店的总销售额,我必须这样做:

Select Sum(SaleAmount) 
From FactSales FT 
Inner Join DimStores D1 ON FT.StoreId = D1.StoreId
Where D1.StoreNumber = 'S001'

如果我使用 "StoreNumber" 和 "CustomerNumber" 字段作为外键而不是 "FactSales" table。我不必执行连接查询,而是可以直接执行此操作:

Select Sum(SaleAmount) 
From FactSales
Where StoreNumber = 'S001'

您使用人工主键的原因是将数据仓库与业务决策隔离开来。

您的业务增长。现在您拥有 1000 多家商店。商店的钥匙变了。你是怎么处理的?

如果存储密钥分布在整个数据仓库中,这是一个痛苦的操作。如果存储键只是维度 table 上的一个属性,那么这很容易。

我还应该注意到,在许多情况下,维度可能是类型 2 维度——这意味着它们会随着时间而变化。例如,客户可以更改他们的名字,但您可能想知道他们在特定时间点的名字。

还有第三个原因。人工主键通常是整数。这些比字符串(特别是可变长度的字符串)更适合索引。性能差异很小,但这是使用主键的原因。事实上,如果键是字符串并且比整数长,那么根据 space.

使用人工键可能更有效