多维数据模型

一、概述

  多维数据模型是最流行的数据仓库的数据模型,多维数据模型最典型的数据模式包括星型模式、雪花模式和事实星座模式,本文以实例方式展示三者的模式和区别。

二、星型模式(star schema)

  星型模式的核心是一个大的中心表(事实表),一组小的附属表(维表)。星型模式示例如下所示:

 

三、雪花模式(snowflake schema)

  雪花模式是星型模式的扩展,其中某些维表被规范化,进一步分解到附加表(维表)中。雪花模式示例如下图所示:

从图中我们可以看到地址表被进一步细分出了城市(city)维。supplier_type表被进一步细分出来supplier维。

四、事实星座模式(Fact Constellation)或星系模式(galaxy schema)

  数据仓库由多个主题构成,包含多个事实表,而维表是公共的,可以共享,这种模式可以看做星型模式的汇集,因而称作星系模式或者事实星座模式。本模式示例如下图所示:

如上图所示,事实星座模式包含两个事实表:sales和shipping,二者共享维表。

五、总结

  事实星座模式是数据仓库最长使用的数据模式,尤其是企业级数据仓库(EDW)。这也是数据仓库区别于数据集市的一个典型的特征,从根本上而言,数据仓库数据模型的模式更多是为了避免冗余和数据复用,套用现成的模式,是设计数据仓库最合理的选择。当然大数据技术体系下,数据仓库数据模型的设计,还是一个盲点,探索中。

展开阅读全文

多维数据模型设计

12-06

之前发了一篇多维数据模型设计的帖子,可能我没把问题描述清楚,所以没人回复。现在我将问题再详细描述一下,洗完能得到各位牛人的帮助。rn现在公司有个关于报表平台的开发。附件中有个表样,不知道该如何存储,如何设计数据模型。先描述一下表样吧:rn表头行方向的我们称之为维度:公司、项目、预算项;rn表头列方向的我们称之为指标:实际和预算2项,实际、预算都有:面积、均价、金额三指标。还有差异比较及分析下的:本期增减额、年度完成率、本期完成率、是否需要差异分析等。rn我们现在的想法是这样的:rn设计一个事实数据表zgtj_tb_data_x 与一个组合维度表zgtj_tb_indx_x再加上若干个维度表sys_mid(项目、公司、预算项等维度)。rn他们的结构以及他们之间的关系是这样的:rnzgtj_tb_data_x:id,indx_id,FD_0,FD_1,FD_2.... --ID 主键;indx_id关联组合维度主键;FD_* 表示事实数据表中的事实数据字段(指标的概念,如:实际金额、实际面积、实际均价、预算金额、预算面积......);rnzgtj_tb_indx_x:id,unit_code,prj_code,b_type_code,time_id --ID 主键;unit_code公司单位code;prj_code项目code;b_type_code预算项code;time_id时间周期rn维度表有:rnsys_unit_mid单位维度 unit_code,unit_name........rnsys_prj_mid项目维度 prj_code,prj_name.......rnsys_b_type_mid预算项维度 b_type_code,type_name....rnsys_date_mid时间周期维度 time_id,sys_year,sys_month,sys_week,sys_day....rnzgtj_tb_indx_x表结构是不固定的,它的结构取决于当前报表相关的维度,如:单位、项目、预算项、时间周期等。rnzgtj_tb_indx_x_rel维度关联表 mid_code,mid_name,mid_table,sup_mid,mid_lvl。分别表示:维度code、维度名称、维度表、上级维度、维度级次rnzgtj_tb_indx_x_rel维度关联表作用:rn1、对zgtj_tb_indx_x表结构的一个描述,描述zgtj_tb_indx_x表中的维度项与实际维度表的一个对应关系rn2、维度项之间的级次关系。如:单位维度下包含项目维度,项目维度下包含预算项。rnrn上面介绍的现在数据模型。rnrn下面说一下数据存储以及展示:rn实际数据表zgtj_tb_data_x主要存FD_*的值,我这里把预算与实际分开都当指标处理的,其实也可以把它当做维度处理的(加一个预算类型维度,分实际与预算)。rn数据在库里存储大家还是看数据表截图吧,这样更直观。rnrn数据展示sql:rn[code="java"]rnselect rna.f_price as '均价',rna.f_size as '面积',rna.f_cost as '金额',rnb.b_unitcode as b_unitcode,rnb.prd_code as prd_code,rnb.prd_type as prd_type,rnc.sys_yearrnfrom zgtj_tb_data_x arnleft join zgtj_tb_indx_x b on b.sys_id = a.sys_id rnleft join sys_date_mid c on c.date_id = b.date_id rnwhere c.sys_year=2007 or c.sys_year=2008rnorder by rnc.sys_year,b_unitcode,prd_code,prd_typern[/code]rnrn数据展示时分2部分:rn先通过一个或者多个sql语句取出报表中第一列的数据--维度项的数据,然后执行取事实数据的sql(上面贴的sql),假如结构集有18条数据,因为一次查的是本年和上年的数据,所以可以确定本年与上年各9条数据(先不考虑数据行空的情况,如果无数据可以用join将NULL的数据也取出),将结果集分成2个list,按行循环分别填充到上年预算与本年预算对应的列上。rnrn现在的问题:这么能将查询的结果集与报表上数据对应呢?如:写sql一次查出多列的数据,然后再按列的方式将数据写到报表上,这样按列写,以什么来确定列的位置呢。(注:这里的列数是不固定的,一个事实数据表中包含的列,先定义在一个数据表里的,报表的行数也是不定的,行数由各维度表的数据决定)。rnrn上面是我考虑的一些问题,大家可以先对我的作法提出建议。我也没考虑考虑清楚,希望大家谈谈自己看法。期待更佳的存储方案。rnrn写了这么多,对数据模型设计有兴趣的希望大家能看完。谢谢!。rnrn怎么贴图片啊?[img=http://http://www.javaeye.com/upload/attachment/57034/2fbac079-a244-366f-b44c-d643a0926dd6.jpg][/img]rnrn[img=http://www.javaeye.com/upload/attachment/57058/a5cea87b-a2a0-381c-b09c-a2933da381c4.jpg][/img]rnrn[img=http://www.javaeye.com/upload/attachment/57060/102c0c7b-e654-322d-a840-07f0cfa8d467.jpg][/img]rnrn[img=http://www.javaeye.com/upload/attachment/57062/2c7a1763-e75f-3e53-aba7-485732c90d52.jpg][/img]rnrn[img=http://www.javaeye.com/upload/attachment/57064/da559b6b-4c0e-3159-a0fa-5b65a346004c.jpg][/img]rnrn谢谢大家了,大家也可以去javaeye讨论:rn[url=http://www.javaeye.com/topic/288224]http://www.javaeye.com/topic/288224[/url]rnrn 论坛

没有更多推荐了,返回首页