数据库仓库设计:事实表和维度表

11
我正在使用关系型数据库构建一个简易的数据仓库。我已确定需要记录以下关键“属性”:

  • 性别(真/假)
  • 人口统计分类(A,B,C等)
  • 出生地点
  • 出生日期
  • 体重(每天记录):所记录的事实

我的要求是能够运行允许我执行“OLAP”查询的查询,这些查询使我能够:

  • “切片和切块”
  • 在数据上“钻取”
  • 一般地,能够从不同的角度查看数据

阅读了这个主题领域后,普遍的共识似乎是最好使用维度表来实现这一目标,而不是规范化的表。

假设这种说法是正确的(即解决方案最好使用事实和维度表实现),我想在这些表的设计中寻求一些帮助。

“自然”(或明显)的维度包括:

  • 日期维度
  • 地理位置

这些维度具有分层属性。然而,我在如何对以下字段进行建模时遇到了困难:

  • 性别(真/假)
  • 人口统计分类(A,B,C等)

我在这些字段上的困惑是:

  1. 它们没有明显的分层属性可以帮助聚合(据我所知),这表明它们应该在事实表中。
  2. 它们大多是静态或很少改变的 - 这表明它们应该在维度表中。

也许我使用的启发式方法太粗糙了?

我将举一些关于我希望在数据仓库中进行的分析类型的例子 - 希望这些例子能进一步澄清问题。

我想通过性别和人口统计分类聚合和分析数据 - 例如回答以下问题:

  • 不同人口统计分类下男女的体重如何比较?
  • 哪种人口统计分类(男性和女性)显示本季度最大的增长?

等等。

有人能否澄清性别和人口统计分类是否属于事实表,还是像我怀疑的那样属于维度表?

并且假设它们是维度表,有人可以详细说明表结构(即字段)吗?

“明显”的模式:

CREATE TABLE sex_type (is_male int);
CREATE TABLE demographic_category (id int, name varchar(4));

可能不是正确的。

4个回答

10

不确定为什么您认为使用RDBMS是穷人的解决方案,但希望这可以帮助您。

weight_model_01.png

dimGeography和dimDemographic表是所谓的微小维度;它们允许根据人口统计和地理位置进行分段,而无需连接dimUser,并且在测量时捕获用户当前的人口统计和地理位置。

顺便说一下,在DW领域中,verbose -- Gender = 'female',AgeGroup = '30-35',EducationLevel = 'university'等。


3
星型模式查询是 SQL 中 Venn 图的交集点的等效表示。正如您的样例查询所显示的那样,SEX_TYPE 和 DEMOGRAPHIC_CATEGORY 是您想要搜索的集合,因此必须作为维度进行处理。
至于表结构,我认为您对 SEX_TYPE 的设计是错误的。首先,更容易、更直观地设计基于...
where sex_type.name = 'FEMALE'

than

where sex_type.is_male = 1

此外,在现实世界中,性别并不是布尔类型。大多数应用程序应该收集未知和跨性别信息,特别是对于涉及健康/医学的应用程序而言更为重要。此外,如果你有女性同事的话,这将避免一些不愉快的办公室争吵。
编辑:
“我正在考虑如何处理数据库中不存在的新性别类型和人口统计类别的情况。”
在数据仓库中不使用外键曾风靡一时。但它们提供了有用的元数据,查询优化器可以用来推导最有效的搜索路径。这在处理大量数据和即席查询时尤为重要。除非你的源系统提供通知,否则处理新维度值总是困难的。这实际上取决于你的设置。

谢谢反馈。现在我知道SEX_TYPE和DEMOGRAPHIC_CATEGORY是维度了。这对我来说是一个新领域,所以我可能需要问一些你认为很幼稚/愚蠢的问题,请耐心等待。从上面看,我的理解是我需要在事实表中拥有FKs,并且这些FKs是SEX_TYPE和DEMOGRAPHIC_CATEGORY中的PKs。您能否确认一下?(我正在考虑如何处理数据库中尚未存在新性别类型和人口统计类别的情况)。 - morpheous

3
通常,所有数字量和度量都是事实表中的列。然后其他所有内容都是维度属性。它们属于哪个维度相当实用,取决于数据。
除了您已经收到的建议之外,我没有看到提到退化维度。在这些情况下,诸如发票号码或每个事实不同的序列号时间戳之类的东西需要存储在事实中,否则维度表将与事实表成为1-1关系。
在您的案例中,一个关键的设计决策可能是与年龄相关的数据分析(如果研究正在进行)。因为人们的年龄随着时间的推移而改变,他们将在某个时候转移到另一个年龄组。根据群组是否在研究开始时固定,这可能决定您想要如何聚合。我并不一定是说您应该有一个组维度,并通过它获得年龄,而是您可能需要在ETL期间确定正确的年龄/人口统计维度。但这取决于最终使用(或通过从事实表链接的两个维度角色来容纳两者 - 最初的人口统计数据永远不会更改,而当前的人口统计数据将随时间而变化)。
地理位置可能也适用于类似的情况。虽然您可以通过分析随时间变化的当前地理位置来跟踪一个人的地理位置,但维度DW的重点是将所有相关维度直接链接到事实(在规范化模型中,您可能会通过Entity-Relationship模型的网络派生这些内容 - 这些内容在ETL时被锁定)。这种冗余使得传统关系数据库管理系统中的维度模型分析更快。
请注意,这很多情况不适用于像Teradata这样的大规模并行DW,因为它们不适合星型模式 - 它们喜欢将所有数据归一化并链接到相同的主索引,因为它们使用主索引将数据分布到处理单元上。

1
你打算使用什么OLAP / 表示层工具?这些工具通常具有自己的功能,支持构建立方体、层次结构、聚合等。
正常形式通常是灵活和高效数据仓库的最可靠基础,尽管为了支持特定的报告要求,Marts有时会被去规范化。在没有其他信息的情况下,我建议你确保你的数据库至少符合Boyce-Codd /第5正常形式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接