事实表和维度表

  
解释1:

事实表就是按某个分析领域组合的数据表
纬度表则是这个领域上的分析指标的组合表

解释2:

简单点说;
事实表就是交易表。
维度表就是基础表。
用来解释事实表中关键字纬度的具体内容。


解释3:

事实数据表
数据仓库架构中的中央表,它包含联系事实与维度表的数字度量值和键。事实数据表包含描述业务(如银行事务或产品销售)内特定事件的数据。

维度表
数据仓库中的表,其条目描述事实数据表中的数据。维度表包含创建维度所基于的数据。

再举个实际的例子。银行对存款记账,A表中存放实际数据,包括账号、所属机构号、存款金额等,B表存放机构号和机构名称的对应关系。则A是事实表,B是维表。

事实表
   每个数据仓库都包含一个或者多个事实数据表。事实数据表可能包含业务销售数据,如现金登记事务
所产生的数据,事实数据表通常包含大量的行。事实数据表的主要特点是包含数字数据(事实),并且这些数字信息可以汇总,以提供有关单位作为历史的数据,每个事实数据表包含一个由多个部分组成的索引,该索引包含作为外键的相关性纬度表的主键,而维度表包含事实记录的特性。事实数据表不应该包含描述性的信息,也不应该包含除数字度量字段及使事实与纬度表中对应项的相关索引字段之外的任何数据。
   包含在事实数据表中的“度量值”有两中:一种是可以累计的度量值,另一种是非累计的度量值。最有用的度量值是可累计的度量值,其累计起来的数字是非常有意义的。用户可以通过累计度量值获得汇总信息,例如。可以汇总具体时间段内一组商店的特定商品的销售情况。非累计的度量值也可以用于事实数据表,单汇总结果一般是没有意义的,例如,在一座大厦的不同位置测量温度时,如果将大厦中所有不同位置的温度累加是没有意义的,但是求平均值是有意义的。
   一般来说,一个事实数据表都要和一个或多个纬度表相关联,用户在利用事实数据表创建多维数据集时,可以使用一个或多个维度表。
维度表
   维度表可以看作是用户来分析数据的窗口,纬度表中包含事实数据表中事实记录的特性,有些特性提供描述性信息,有些特性指定如何汇总事实数据表数据,以便为分析者提供有用的信息,维度表包含帮助汇总数据的特性的层次结构。例如,包含产品信息的维度表通常包含将产品分为食品、饮料、非消费品等若干类的层次结构,这些产品中的每一类进一步多次细分,直到各产品达到最低级别。
   在维度表中,每个表都包含独立于其他维度表的事实特性,例如,客户维度表包含有关客户的数据。维度表中的列字段可以将信息分为不同层次的结构级。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/success_dream/archive/2007/10/30/1856710.aspx

 

数据仓库的物理模型较常见的操作型数据库的物理模型有很大不同。最明显的区别是:操作型数据库主要是用来支撑即时操作,对数据库的性能和质量要求都比较高,为了防止“garbage in,garbage out”,通常设计操作型数据库的都要遵循几个范式的约束,除非少数情况下为了性能进行妥协,才可能出现冗余。而数据仓库的建立并不上为了支撑即时操作,或者说,数据仓库的数据是来源于即时操作产生的数据,而不是直接来源于即时操作。所以它的数据质量是由操作性系统来保证的,而不是由几个范式来保证的。而且为了更好的跟踪历史信息,以及更快的产生报表,数据仓库的物理模型中存在着大量冗余字段。

数据仓库的物理模型分为星型和雪花型两种。所谓星型,就是将模型中只有一个主题,其他的表中存储的都是主题的一些特征。比如货物销量的主题仓库中,每次出售记录是事实表,而时间,售货员,商品是维度,都和事实表有联系,组织起来就是星型。而如果更细化来看,商品是有种类,产地,价格等特征的,从这个角度来看,有两个主题,一个是商品出售,一个是商品本身。组织起来就是雪花型。实际项目中,由于操作型系统业务的复杂性导致本身产生了大量的数据,所以,组织起来也以雪花型居多。

那么围绕着主题,该如何设计事实表和维度表呢?也是有规律可循的。

事实表和维度表的分界线

事实表是用来存储主题的主干内容的。以日常的工作量为例,工作量可能具有如下属性:工作日期,人员,上班时长,加班时长,工作性质,是否外勤,工作内容,审核人。那么什么才是主干内容?很容易看出上班时长,加班时长是主干,也就是工作量主题的基本内容,那么工作日期,人员,工作性质,是否外勤,工作内容是否为主干信息呢?认真分析特征会发现,日期,人员,性质,是否外勤都是可以被分类的,例如日期有年-月-日的层次,人员也有上下级关系,外勤和正常上班也是两类上班考勤记录,而上班时长和加班时长则不具有此类意义。所以一般把能够分类的属性单独列出来,成为维度表,在事实表中维护事实与维度的引用关系。

在上述例子中,事实表可以设计成如下
WorkDate  EmployeeID,WorkTypeID,Islegwork,Content,
而时间,员工,工作类型,是否外勤则归为维度表。

总的来看,和其他建立主外键关系的表也都一样。但是维度表的建立是需要有层次的(虽然不是必须,但是也是典型特征),而事实表的建立是针对已经发生的事实的,是历史数据的存档,也就是说是不应该修改的。以测试部测试软件的Bug为例。每个Bug都是一个事实。这个Bug的状态在数据字典里可能设计成新建,转派,修复,拒绝等等。那么在事实表中Bug表中有一个字段为Status。当测试员或者开发人员改变了这个状态的值,事实表中该如何更新呢?是直接更新Status还是什么其他的方式?显然,为了能够追踪这个Bug的历史信息,应该是重新插入一条新的记录。那么这和以往的数据库设计有什么区别呢?可以看出对于原始记录和新插入的记录,其他字段全部是相同的,也就是全部冗余的。如果以BugID作为主键,这时候会发现主键都是冗余的(当然,插入之前只能删除主键)。所以可以看出,事实表一般是没有主键的。数据的质量完全由业务系统来把握。

例如,在AdventureWorks DW数据库中,事实表是类似于如此

事实表中的外键是指向维度表的,那么维度表又有什么特征呢?以时间维度为例

 

可以看出,维度表一般是有主键的。代表该类物质的一个单一个体,其他的字段一般都是有层次关系的,例如2009年2月19日是主键,那么它会有年--月--日这样的层次,为了方便统计,年月日不会在做聚合的时候才计算出来,而是在维护记录时已经计算出来。那么这些字段的冗余是否值得呢?可以这样解释:维度表的数据一般是比较少的,这个少是指相对事实表来讲的。因为事实表是与日俱增,而维度表则增长缓慢,所以绝对数字也不会太大。在事实表和维度表做连接查询的时候,会产生与事实表一样大的数据量,如果还需要group by Year(TimeKey)的话,其一是会增加计算,其二是由于引入了计算,索引会失效。这个代价比引入冗余字段要大的多。以AdventureWorks为例,它总共引入了日历年-月-日,财年-月-日,还有日历年-周-日,财年-周-日等等多个层次。那么它在每个层次不同级别上做聚合都是不需要引入函数来做Year(TimeKey),Month(TimeKey)这样的运算。

总的说来,事实表的设计是以能够正确记录历史信息为准则,维度表的设计是以能够以合适的角度来聚合主题内容为准则。

 

 那么是不是所有实体在数据仓库中,不是存在事实表就是存在维度表中呢?业务逻辑的复杂性往往会导致有些实体既需要存在事实表中,也需要存在维度表中。

例如公司承建的项目,本身是一个事实内容,每个项目有自己的立项时间,需求评审时间,概要、详细设计时间,送测时间,测试通过时间,项目合同额,项目经理,初验时间,终验时间等等一系列属性。我们可以按终验时间来统计一年的收益,

 

tttbbbccc

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值