首页
登录 | 注册

数据仓库设计小知识之一个属性的维度设计

我们通常在数据仓库的设计中碰到这种问题:在维度设计中如果这个维度只有一个属性,那我们面临的选择是为这个属性单独创建一个维度,还是将这个维度的属性直接放在事实表中作为事实表的一部分?

假设这里有一个维度,通常在设计上至少会有两列(DimKey 和 DimAttribute 属性),事实表通过 DimKey 关联到这个维度。首先,在查询阶段多表的 JOIN 关系比较单表的查询在效率上肯定要低一些,我们来看下下面的这个例子:

CREATE DIM_TABLE
(
 DIM_KEY  INT PRIMARY KEY IDENTITY(1,1),
 DIM_ATTR NVARCHAR(20)
)

CREATE FACT_TABLE
(
 DIM_KEY INT FOREIGN KEY REFERENCES DIM_TABLE(DIM_KEY),
 MEASURE DECIMAL(18,2)
)

一个典型的星型结构的查询如下:

SELECT D.DIM_ATTR,
       SUM(F.MEASURE) AS TOTAL
FROM FACT_TABLE AS F
INNER JOIN DIM_TABLE AS D
ON F.DIM_KEY = D.DIM_KEY
GROUP BY D.DIM_ATTR

如果把这个属性直接放在 FACT 表中,结果和查询如下:

CREATE TABLE FACT_TABLE_2
(
 DIM_ATTR INT FOREIGN KEY REFERENCES DIM_TABLE(DIM_KEY),
 MEASURE DECIMAL(18,2)
)

SELECT SUM(MEASURE) AS TOTAL
FROM FACT_TABLE_2
GROUP BY DIM_ATTR

我们的查询和聚合更加简单,从查询效率上来说要更好一些。但是我们通常又为什么会选择将这个单独的属性还是放在维度表中,这里有以下几个原因是我们需要考虑的:

1. 如果事实表非常庞大的话,使用 DIM_KEY INT 类型 4 Bytes 相对于 DIM_ATTR 的 NVARCHAR(20) 类型可以明显的减少事实表的体积。

2. 如果这个属性值在源业务系统发生改变的话,就意味着我们要更新事实表中所有与该属性相关的属性值。

3. 有可能今天这个维度确实只有一个属性,但是谁又能确保这个维度以后不会添加别的相关的属性呢?

数据仓库的设计是一个迭代的开发过程,开发一年,维护若干年,如果我们可以考虑到以上原因,就可以很清楚的考虑到在设计阶段是否有必要将单一属性挑选出来作为维度来设计了。

更多 BI 文章请参看 BI 系列随笔列表 (SSIS, SSRS, SSAS, MDX, SQL Server) 如果觉得这篇文章看了对您有帮助,请帮助推荐,以方便他人在 BIWORK 博客推荐栏中快速看到这些文章。


相关文章

  • 从css 3d说到空间坐标轴
    有一次我们说到掷骰子那个游戏,当时是用了一个steps属性+雪碧图来制作帧动画,这当然颇为不错,但其实一开始我想的不是这样的,我想的是用真的3d和动画去做,这个方案涉及到不少空间的知识,今天来给大伙好好说说,这css 3d到底怎么玩. 先上 ...
  • 页面性能优化-原生JS实现图片懒加载
         在项目开发中,我们往往会遇到一个页面需要加载很多图片的情况.我们可以一次性加载全部的图片,但是考虑到用户有可能只浏览部分图片.所以我们需要对图片加载进行优化,只加载浏览器窗口内的图片,当用户滚动时,再加载更多的图片.这种加载图片的 ...
  • [翻译 EF Core in Action 2.1] 设置一个图书销售网站的场景
    Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Core 书籍.原版地址. 是除了官方文档外另 ...
  •   计算属性是基于响应式依赖进行缓存的,只有在相关响应式依赖发生改变时才会重新求值,这种缓存机制在求值消耗比较大的情况下能够显著提高性能. 一.计算属性初始化   Vue 在做数据初始化时,通过 initComputed() 方法初始化计算 ...
  • [翻译 EF Core in Action 2.2] 创建应用程序的数据库上下文
    Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Core 书籍.原版地址. 是除了官方文档外另 ...
  • 接口
    1.什么是接口 接口是一种引用数据类型.使用interface声明接口,形式 public interface 接口名称{ } 2.接口的特性 [1]接口可以声明属性(c).接口中定义的所有变量都是static final类型的. publ ...

2019 cecdns.com webmaster#cecdns.com
12 q. 0.073 s.
京ICP备10005923号