我正在尝试在扁平的OLTP表上创建维度模型(不在第三正式化范式中)。
有些人认为维度模型表不是必需的,因为报告的大部分数据都来自单个表。但是该表包含比我们需要的更多列,例如300列。我应该仍然将扁平表分离为维度和事实,还是直接在报告中使用扁平表。
我正在尝试在扁平的OLTP表上创建维度模型(不在第三正式化范式中)。
有些人认为维度模型表不是必需的,因为报告的大部分数据都来自单个表。但是该表包含比我们需要的更多列,例如300列。我应该仍然将扁平表分离为维度和事实,还是直接在报告中使用扁平表。
2) 数据以列式格式存储。这与SQL Server或Oracle的行式格式完全不同。在列式数据库中,数据以使大型聚合类型查询更加高效的方式存储。这种存储方式部分抵消了维度表的原因,因为在行中存储重复数据(属性)相对高效。
Redshift表通常使用一个列的值(分布键)分布在节点上。或者它们可以随机但均匀地分布,或者Redshift可以在每个节点上进行完全复制(通常仅针对非常小的表)。
因此,在决定是否创建维度时,您需要考虑这是否实际上会带来很多好处。如果数据中有经常更新的列,则最好将其放入另一个较小的表中,而不是更新一个大表。但是,如果数据基本上是追加的(不变的),则创建维度没有任何好处。对数据进行分组和聚合的查询将在单个表上高效执行。
JOINs在Redshift上可能会非常昂贵,除非两个表基于相同的值进行分布(例如用户ID)- 如果它们没有,则Redshift将不得不在节点之间物理复制数据以便运行查询。因此,如果必须有维度,则需要将最大的维度表与事实表分布在相同的键上(记住每个表只能分布在一列上),然后任何其他维度可能需要分布为ALL(复制到每个节点)。