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

标签 sql data-modeling

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

最佳答案

精简版:

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


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

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

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

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

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

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

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

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

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

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

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

    You can start with http://en.wikipedia.org/wiki/Star_schema if you want to dig deeper on this topic.

    关于sql - 维度表和域表是一回事吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6192396/

    相关文章:

    iphone - 如何在 iPhone 中格式化 SQLite 日期?

    mysql - 如何在MySQL中实现具有共同属性的两个实体?

    ruby-on-rails - 我应该使用什么样的数据模型来存储历史数据?

    spring-boot - 如何使用 spring data cassandra 创建一组用户定义类型?

    sql - 从多个表中获取组合行

    sql - Postgresql 序列与串行

    rdf - 如何从原始数据(CSV)创建本体?

    sql - 如何设计对具有添加关系的单个数据库表的循环引用?

    mysql - 如何将列中多次出现的“同名”显示为行中的单个名称

    sql - 无法绑定(bind)多部分标识符的原因