首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >数据仓库中代理键与组合键的比较

数据仓库中代理键与组合键的比较
EN

Stack Overflow用户
提问于 2014-05-14 14:32:59
回答 3查看 2.4K关注 0票数 1

在数据仓库(DW)中,我们有维度和事实表。维键作为外键迁移到facts表中,因此在facts表中形成表中复合主键。当然,有时不需要所有的外键来创建唯一的主键,因为在大多数情况下,唯一性是由很少的外键定义的。

但是,我想知道为什么事实表没有代理键作为主键,就像维度表一样?首先,在对DW (非聚集索引-某种最佳实践)中的主键进行索引时,在索引中使用一列还是五列更好?我知道DW系统不太关心索引保留的磁盘数量,但对我来说,每次使用代理键而不是复合外键都是合乎逻辑的。

有人能解释一下为什么这不是标准实践吗?

EN

回答 3

Stack Overflow用户

发布于 2014-05-14 17:31:14

这是因为很少通过维度以外的任何东西引用事实数据表。

票数 0
EN

Stack Overflow用户

发布于 2014-05-17 12:40:12

数据仓库的效率与其加载数据并在以后访问数据的能力一样有效。正如Ronnis所解释的;我们很少需要在事实表中引用组合键组合的能力来执行任何操作;在加载时,如果我们有一个主键,那么加载需要更长的时间,如果我们需要通过主键访问记录,这是很好的;否则这是浪费时间。

考虑以下事实

代码语言:javascript
运行
复制
CustomerId
Date
PartId
NumberofOrders
OrderQuantity
InvoiceAmount

键为CustomerId、Date、PartId

为键的组合添加一条记录不会影响对该事实表所做的任何分析,因此拥有一个主键可能是多余的。

考虑以下事实

代码语言:javascript
运行
复制
CostCenterId
DivisionId
Month
DepartmentId
OpeningBalance
Credits
Debits

有两种类型的设计是可能的;一种是当您只需要此组合的一条记录时;在这种情况下,您将定义一个主键

另一种设计也是可能的;在处理事务时,在每月初创建期初余额记录,将期初余额填充为零,在这种情况下,您可以有多条记录

底线是确保您有一个可管理的记录数量来汇总,更重要的是确保您的加载速度更快。

我希望这能解释不使用主键的设计趋势

票数 0
EN

Stack Overflow用户

发布于 2020-10-20 02:47:42

取决于您最常使用的报告/应用程序用例。在大多数数据仓库中,最终都会使用dim表中的代理键作为FK。事实上,您可能有重复的(部分行),并且出于完全合法的原因。因此,除非您确实需要,否则通常不会定义PK。

根据您的RDBMS技术及其在索引、PK /主索引端的能力,您将定义一个最适合您的数据仓库的最佳PDM (物理数据模型)。例如,在Teradata中,我将在用于我的目的的事实表中定义一个主索引(而不是PK),并且其中可能没有完整的组合键。在我们将每个事件记录为事务的事件事实表或网络活动事实表中,事件ID将足以作为主索引,以确保数据的最佳分布,从而获得更好的性能。如果大多数报告用例根据客户id或产品id或站点id或任何经常使用的ID查询此表,则可以定义单独的索引来优化报告。然后,您可以在这样的ID上定义类似的索引,只要它出现在其他事实或维度中,就可以为您提供最佳访问路径。

这在很大程度上取决于您的用例、rdbms功能和访问路径设计,以便巧妙地定义PDM。

如果是代理键,请参考我的帖子作为指南Managing surrogate keys in a data warehouse

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23647226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档