1

在维度建模的上下文中,作为典型案例,在维度表中有代理键来跟踪行的变化是很棒的( http://www.kimballgroup.com/2006/07/design-tip-81-fact-表代理键/)。

代理键的实现常用的三种方式 1) 序列号 2) 版本号 3) 散列键(数据保险库使用)

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

非常感谢

4

1 回答 1

3

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

序列号

优点

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

缺点

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

版本号

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

优点

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

缺点

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

哈希

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

优点

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

    缺点

  • 如果您使用的是类型 1 缓慢变化的尺寸,那么您只是在自找麻烦。更新了属性?尝试在不删除一半数据库的情况下更新主键,看看你能走多远。

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

结论

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

于 2016-04-21T23:23:55.623 回答