关键数据仓库事实的正确方法 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.
使用人工键可能更有效
在数据仓库中键入 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.
使用人工键可能更有效