《分析服务从入门到精通读书笔记》第一章、维度数据仓库(4)
简介
商业智能系统将维度数据仓库作为数据存取层。数据仓库存储在关系型数据库管理系统(RDBMS)中,打一个非常简单的比方,你可以将关系数据库简单地想作一系列的表格。每个表格有行和列,就行Excel电子表格一样。在维度数据仓库中,维度存储在维度表中,度量值被称作事实并存储于事实表(fact table)中。
目的
介绍数据仓库中的维度表和事实表的概念及逻辑模型
内容
一、事实表
在维度数据仓库中,存储度量值的详细值或事实的表称作事实表。表1.14给出了FactSales事实表前几行的概念视图,它存储了按照州、产品和月份划分的销售量和销售额。
表1.14 FactSales事实表
州 | 产品 | 月份 | 销售量 | 销售额/美元 |
OR | Hitch Rack | 2011年1月 | 1 | 120.00 |
OR | Mountain-500 Silver,40 | 2011年1月 | 1 | 565.00 |
OR | Mountain-500 Silver,48 | 2011年1月 | 1 | 552.50 |
WA | Mountain-500 Silver,48 | 2011年1月 | 1 | 552.50 |
OR | Hitch Rack | 2011年2月 | 2 | 240.00 |
WA | Hitch Rack | 2011年2月 | 4 | 480.00 |
在这个事实表的几行实例中,前三列(州、产品和月份)是键列。键列的值将事实表每行中的事实和每个维度表中的一行联系起来。剩下的两列(销售量和销售额)包含了数值事实。事实表中的每一列通常是键列或者是事实列,但也有可能是其他用于参考的列,例如,订单号或发票号。
对于每个度量值,事实表中都有一个列,不同的事实表有不同的度量值。销售事实表可能有两个度量值列:一个销售额,另一个是销售量。工作车间事实表可能有三个度量列:一个是生产量,一个是分钟数,另一个是残次品数。
事实表中的行都必须处在同一个细节级,并和同一个维度集相关。在表1.14所示的FactSales事实表中,每一行都要包含月度数据,同时也要有关于州和产品的值。如果公司按季度对每个产品子类设置的销售额度,则该数据必须存储于不同的事实表。事实表存储的详细程度也被称作事实表的粒度(granularity)。和事实表相关的维度被称作事实表的维数(dimensionality)。具有不同粒度或不同维数的事实必须分别存储于不同的事实表中。一个数据仓储通常可以有多个事实表。
表1.14中的示例行说明了一个事实表的概念布局。实际上,事实表都会使用被称为维度键(dimension key)的整数来表示维度成员,而不是采用描述性的名称。例如,如表1.15所示的事实表,“州”列被“州键”列所代替。同时1 和2 代替了 OR 和WA。类似的,产品和月份列被维度列所代替,同时这些列中的值被维度键值代替。这样做是因为一个事实表所包含的行数量常常很大(在一个中等大小的数据仓库中,事实表可能动辄拥有数以亿计的数据行),使用整数维度键值能显著的减少事实表的大小。
表1.15 FactSales表
州键 | 产品键 | 月份键 | 销售量 | 销售额/美元 |
1 | 483 | 201101 | 1 | 120.00 |
1 | 591 | 201101 | 1 | 565.00 |
1 | 594 | 201101 | 1 | 552.50 |
2 | 594 | 201101 | 1 | 552.50 |
1 | 483 | 201102 | 2 | 240.00 |
2 | 483 | 201102 | 4 | 480.00 |
在事实表中使用整数维度键值时,维度成员的标签必须被存入另一个表——维度表。事实表中的每个维度键都有一个维度表。
二、维度表
维度表用一行来表示每个维度的键属性成员。键属性有两列:一列包含整数维度键,另一列包含属性标签。
下面这张表是一个简化版本
表1.16 DimProduct维度表
产品键 | 产品 |
483 | Hitch Rack |
596 | Mountain-500 Black,40 |
598 | Mountain-500 Black,44 |
599 | Mountain-500 Black,48 |
591 | Mountain-500 Silver,40 |
593 | Mountain-500 Silver,44 |
594 | Mountain-500 Silver,48 |
604 | Road-750,44 |
605 | Road-750,48 |
在数据仓库中,对每一个维度成员而言,在维度表中都包含一个唯一的键属性值。在关系型数据库术语中,键属性称作主键(primary key column)。事实表中的每个维度列都和一个维度表中的主键列相对应。在维度表中只出现一次的键值可能咋事实表中出现多次。即使主外键关联关系。例如,在表1.16中产品Hitch Rack所对应的产品键(483)只在维度表的一行中出现。但可以出现在事实表中的多行。这被称作一对多的关系(one-to-many relationship)。在事实表中,维度键列(在一对多关系中的“多”的一方)被称作外键列(foreign key column)。关系数据库使用匹配的主键列(在维度表中)和外键列(在事实表中)的值将事实表和维度表中对应的记录连接。
维度表通常用额外的列来包含维度中的其他属性成员。表1.17显示了一份包含产品、子类、类别、颜色、尺寸和标价等属性的产品维度表。
表1.17 DimProduct维度表
产品键 | 产品 | 子类 | 类别 | 颜色 | 尺寸 | 标价 |
483 | Hitch Rack | 自行车货架 | 配件 | 120.00 | ||
596 | Mountain-500 Black,40 | 山地自行车 | 自行车 | 黑色 | 40 | 539.99 |
598 | Mountain-500 Balck,44 | 山地自行车 | 自行车 | 黑色 | 44 | 537.99 |
599 | Mountain-500 Black,48 | 山地自行车 | 自行车 | 黑色 | 48 | 534.99 |
591 | Mountain-500 Silver,40 | 山地自行车 | 自行车 | 银色 | 40 | 565.00 |
593 | Mountain-500 Silver,44 | 山地自行车 | 自行车 | 银色 | 44 | 561.00 |
594 | Mountain-500 Silver,44 | 山地自行车 | 自行车 | 银色 | 48 | 552.50 |
604 | Road-750 Black,44 | 公路自行车 | 自行车 | 黑色 | 44 | 540.00 |
605 | Road-750 Black,48 | 公路自行车 | 自行车 | 黑色 | 48 | 540.00 |
许多维度属性可用来对维度记录进行分组,并对每组中相关的事实进行汇总。例如,Product维度记录能被分为Bikes(自行车)和Accessories(配件)两类,每种分类的销售量都能计算出来。能用于创建分组的属性是可聚合的(aggregatale),其汇总值被称为聚合值(aggregate)。聚合值这术语比汇总值(summary value)更通用。汇总值暗指该值是通过对个体值累加得到的。。一旦计算除了聚合值,就可以得到个体值的累加,同时也可以计数,求最大值、最小值和平均值,或对单独的值进行其他计算。
并非所有的属性值都是可聚合的。例如,用价格属性创建分组并计算每个价格对应的销售量将使没有意义的,因为价格有许多不同的值。顾客维度通常包含了许多不同聚合的属性:接到地址、电话号码、电邮地址等。这些不可聚合的属性称为成员属性(member property)。将成员属性添加到已经存在一个可聚合属性的报表中,其目的是提供额外信息,例如,报表可以用可聚合“顾客”属性来显示销售,并列出“电话号码”和“电邮地址”成员属性。