为什么通过数据仓库建模在维度表中使用序列号和版本号

问题描述 投票:0回答:1

在维度建模的背景下,作为典型情况,在维度表中使用代理键来跟踪行的变化是很棒的(http://www.kimballgroup.com/2006/07/design-tip-81-事实表代理键/)。

代理键有三种常见的实现方式 1)序列号 2)版本号 3)哈希键(数据仓库使用)

我的问题是:为什么在我见过的大多数维度建模中,序列号是首选。

data-modeling data-warehouse dimensional-modeling data-vault
1个回答
3
投票

我认为普遍使用序列号有几个原因,但我不认为这在所有情况下都是一种明显优越的做事方式。

序列号

优点

  • 序列号很简单。它们是如此简单,以至于对于大多数目的而言,考虑其他任何事情都是浪费时间。不要让任何人告诉您这不是我们使用它的原因。
  • 序列号保证唯一。
  • 序列号尽可能小(窄)。
  • 序列号不编码任何信息,因此无论您更改内容甚至维度粒度都没有关系,只要事实知道即可。这很重要,因为维度的粒度很容易改变,因此您不应该将代理键与有意义的数据一起使用(这就是代理键的要点,至少在 Kimball-ian DW 中)

缺点

  • 序列号本质上是浪费空间 - 如果您可以在其中编码信息,即使将其设置为更大的列,也可以节省空间。不过请参阅上面的优点...
  • 我记得看到一些关于序列号的帖子,有时会因为页面锁定而导致写入性能不佳,但现在找不到了。这可能会导致加载缓慢。

版本号

我以前没有见过这样的例子,谷歌搜索似乎出现了这个问题以及一些将其附加到现有字段的参考,所以我假设你正在谈论将版本附加到序列或哈希值,或其他一些标识符。

优点

  • 您可以访问数据的版本号
  • 这可能是一种唯一化自然键的方法,以便您可以将其用作 DW 维度键

缺点

  • 最大的缺点是,如果不将其从密钥中删除,就无法访问这些数据。为什么不把它作为一个单独的列呢?
  • 自然键在 DW 中通常是不好的做法,所以如果这是你的动机,你可能需要重新考虑你的方法。

哈希

如果您不打算使用序列号,这可能是我的首选。但我认为需要一些非常具体的情况

优点

  • 非常适合类型 2 缓慢变化的维度 - 您不必将哈希存储在单独的列中,因此可以节省空间
  • 将信息编码到代理键中的少数情况之一并不意味着为了未来的发展而搬起石头砸自己的脚。

    缺点

  • 如果你使用类型1缓慢变化的维度,你就是搬起石头砸自己的脚。更新了属性?尝试在不删除一半数据库的情况下更新主键,看看能走多远。

  • 很大。这会使您的事实表变大,从而使您的数据库变大。如果您使用基于列的压缩,具有讽刺意味的是,尺寸越大,这就会成为一个更大的问题(在某种程度上......)

结论

所以这取决于您的情况,但是序列号非常容易实现,并且在几乎所有情况下其缺点几乎完全可以忽略不计,以至于它是一个舒适的默认值。因此,选择另一个选项通常属于“你必须解释为什么这样做”的类别。

© www.soinside.com 2019 - 2024. All rights reserved.