维度表和域表是一回事吗?

all*_*ode 6 sql data-modeling

我想我知道域表是什么(它基本上包含其他列可以包含的所有可能值),并且我在维基百科中查找了维度表。不幸的是,我很难理解他们在那里的描述,因为他们用另一段行话来解释它:“事实表”,它被解释为“由业务流程的度量、指标或事实组成.” 对我来说,这是非常重复的,这没有帮助。有人可以用简单的英语解释这个吗?

bti*_*lly 6

精简版:

  • 代表您从事实表中提取的数据,以使事实表更小。
  • 维度表示您预先聚合的轴以加快查询速度。

这是一个简单的英文长版本:

你从一些事实开始。例如,您的公司收到的每笔销售,包括日期、产品、价格、地理位置、客户名称——无论您的完整信息组合是什么——对于每笔销售。你可以把这些事实放在一个巨大的表格中。

您想要运行的大量查询原则上是对事实表的一些相当简单的查询。但是,您的事实表非常庞大。您需要更快地进行查询。


(1) 让它更快的第一个技巧是将数据移出它以便它更小。因此,您可以获取“长文本”的每一列,将其可能的值放入域表中,并将原始列替换为该表中的 id。这将使您的事实表更小,如果需要,您仍然可以获取原始数据。这使得查询所有行的速度更快,因为它们占用的数据更少。

如果您有一个足够小的数据集,查询整个事实表的速度可以接受,那很好。但是很多公司的数据太多了,所以他们必须变得更聪明。


(2) 使其更快的第二个技巧是预先计算查询。这是执行此操作的一种方法。确定一组维度,然后沿维度维度组合进行预计算。

例如客户名称是一个维度,一些查询是针对每个客户名称的,而另一些则是针对所有客户的。因此,您可以将预先计算的事实添加到事实表中,这些事实具有跨所有客户的预聚合数据,并且客户名称已成为一个维度。

维度的另一个不错的候选者是地理位置。您可以添加按县、州和所有位置汇总的汇总记录。此汇总是您完成客户名称聚合之后完成的,因此它会自动记录给定邮政编码中所有客户的总销售额。

重复任意数量的其他维度。

现在,当有人提出查询时,很有可能可以重写他们的查询以利用您的预聚合维度来仅查看一些预聚合的事实,而不是所有的单个销售记录。这将大大加快查询速度。

在实践中,这最终会导致比您真正需要的更多的预聚合。因此,构建数据仓库的人会做一些聪明的事情,让他们在预先聚合没有人想要的组合所花费的精力与必须在运行中计算本可以提前完成的组合所花费的运行时精力之间进行权衡。

如果您想深入了解此主题,可以从http://en.wikipedia.org/wiki/Star_schema开始。