我正在尝试在平面OLTP表(而不是3NF)上创建维模型。
有些人认为维度模型表不是必需的,因为报告的大部分数据都呈现单表。但是这个表包含的不仅仅是我们需要的300列。我是否仍应将平台分成尺寸和事实,或者直接在报告中使用平台。
答案 0 :(得分:4)
您已经询问了有关数据仓库数据库建模的一般性问题,这将为您提供可能不适用于您正在使用的数据库平台的一般性答案 - 如果您想要答案,那么您将会能够使用然后我建议更具体。
问题标签表明您正在使用Amazon Redshift,该数据库的答案与SQL Server和Oracle等传统关系数据库不同。
首先,您需要了解Redshift与常规关系数据库的区别:
1)它是一个Massively Parallel处理(MPP)系统,由一个或多个节点组成,数据分布在这些节点上,每个节点通常完成回答每个查询所需的部分工作。数据在节点之间分布的方式变得很重要,目的通常是以相当均匀的方式分配数据,以便每个节点为每个查询执行大约相等的工作量。
2)数据存储在columnar format中。这与SQL Server或Oracle的基于行的格式完全不同。在列式数据库中,数据的存储方式使得大型聚合类型查询更加高效。这种类型的存储部分地否定了维度表的原因,因为在行中存储重复数据(attibutes)相对有效。
Redshift表通常使用 one 列(分配键)的值分布在节点上。或者,它们可以是随机但均匀分布的,或者Redshift可以在每个节点上制作完整的数据副本(通常只使用非常小的表格)。
因此,在决定是否创建维度时,您需要考虑这是否真的会带来很多好处。如果数据中的列经常更新,那么最好将它们放在另一个较小的表中,而不是更新一个大表。但是,如果数据主要是附加(不变),则创建维度没有任何好处。查询分组和聚合数据将在单个表上有效。
除非两个表分布在相同的值(例如用户ID)上,否则在Redshift上JOIN会变得非常昂贵 - 如果它们不是Redshift,则必须在节点周围物理复制数据才能运行查询。因此,如果您必须拥有维度,那么您将希望在与事实表相同的密钥上分发最大维度表(记住每个表只能分布在一个列上),那么可能需要分发任何其他维度为ALL(复制到每个节点)。
我的建议是坚持使用单个表,除非您迫切需要创建维度(例如,如果有列经常更新)。