查看原文
其他

【数据蒋堂】第36期:JOIN延伸:维度概念

2017-12-26 蒋步星 数据蒋堂

谈到数据分析时常常会用到维度这个词,针对数据立方体的钻取、旋转、切片等操作都是围绕维度进行的,几乎所有的数据分析人员都知道并会运用这个术语,但要问及它的定义,却几乎没有人能给出来。

通俗来讲,我们把用来分类的属性(字段)称为维度,比如地区、年度、产品类型等;而另外一些用于聚合运算的属性则称为测度,比如销售额、产量、考试成绩等。维度不能做聚合运算,比如计算地区合计是没有意义的;测度则不能用于分类,比如按销售额分类也没什么业务意义。我们通常就是用是否”可用于分类“来判定一个属性是不是维度,但这其实只是对于维度性质的描述,并不能作为定义。

我们基于关系数据库来讨论这个问题,先简单回顾一下基本概念。

设有一个关系数据库,其中有若干数据表,表的数据结构由字段构成,表的数据由记录构成。

数据表的某些字段被指定为主键,需要满足这样的条件:表中所有记录在这些字段上的取值是互不相同的。也就是说,可以用主键值来唯一确定相应的记录。数据表可以没有主键,但有只能有一套。构成主键的字段称为主键字段。

每个数据表可以有多套外键,外键也是该数据表的某些字段,其取值总是在另一个表(可能是本表)的主键取值范围内。这里的另一个表被称为外键指向表,简称外键表,构成外键的字段被称为外键字段。

现在,我们定义:在关系数据库中,不是外键字段的主键字段被称为维度,维度所在的表称为维表,维度可以用维表的主键字段来标识。顺便地,我们定义即不是主键字段也不是外键字段的字段为测度。从这个定义上看,显然不可能某个字段即是维度又是测度。

需要说明的是,我们这里所说的主键外键是指逻辑意义上的概念,也就是在数据的E-R结构设计中的主外键。有时为了性能而在物理数据结构中并不真地建立主键和外键,这种情况不在我们的考虑范围内。

先从一些例子来理解维度的定义。

看这两个同维表:

employee   员工表

id

员工编号

name

姓名

salary

工资

...


manager   经理表

id

员工编号

allowance

岗位津贴

...



我们会在manager表建立外键,字段为id,指向employee表的主键id。这时,manage.id就即是主键字段也是外键字段,那么它不是维度。而employee.id是主键字段而不是外键字段,那么它就是维度。

再看主子表的情况:

Orders   订单表

id

订单编号

customer

客户

date

日期

...


OrderDetail订单明细

id

订单编号

no

序号

product

订购产品

price

价格

...


OrderDetail.id是主键字段,但也是指向Orders表的外键字段,所以它不是维度。而Orders.id是主键字段但不是外键字段,那么它是维度,OrderDetail.no是主键字段且不是外键字段,它也是维度。

OrderDetail.no这个维度有些特殊,一般来说,不会有另外一个外键字段和它关联了,我们把这种未被指向的维度称为孤维。在查询界面中做维度对齐运算时一般不用列出来孤维。

再来检验这个定义是否和常规的维度观念相符,并且对于不相符的情况要给出合理的解决方案。

对于地区、产品这些常规维度,数据库中都会有对应的地区表、产品表,那么这些维度就对应了这些表的主键字段,符合我们定义。而销售额、产量等属性则不可能对应到某个表的主键,所以确实也不是维度。

但日期(或年度)呢?它显然是个维度,但数据库中并没有一个表以它为主键,似乎不符合我们的维度定义。

事实上,所有用到日期数据类型的数据库在逻辑上都应当有一个日期表,其它数据表的日期型字段均可以视为指向这个日期表的外键。但由于日期的相关信息都可以由日期本身计算出来(年度、月份等),而没有需要单独存储的属性,因此我们通常不会在物理数据库中建立这个日期表。那么,只要在逻辑上恢复这个日期表,日期就符合前面的维度定义了。我们把这种逻辑上应该有但物理上并未建立的表称为假表,假表可以看成是一个单字段无记录的表,这个单字段也就是该表的主键,这样就可以承载没有物理表的维度了。类似地,年度、月份也都可以用假表定义。

再观察年龄这种属性,它有可能用于分类(每个年龄的人数),又可能用于聚合(某部门人员的平均年龄),从性质上看,它似乎即是维度又是测度?这就与我们的定义相悖了。

其实,我们在用年龄分类统计时并不是用年龄值本身,而是年龄段,年龄本身应该是个实数值,这是不能用于分类的。也就是说,年龄是测度,而通过年龄计算出来的年龄段才是个维度。这时候,我们要引入维函数概念,维函数以某个字段值为参数,返回某个维度的取值。通过维函数可以把测度转换成维度,在它的帮助下,我们就可以保持维度的严格定义,同时又不和常规观念矛盾。

这里的维度定义是基于外键概念的,而我们知道,外键实际上定义了表之间的JOIN关系。从这个意义上讲,维度是被JOIN定义的!

  正文结束  





 课程视频(可点击底部阅读原文观看)

https://edu.hellobi.com/course/197/lessons  (主题二)

 近期文章

【数据蒋堂】第35期:JOIN提速 - 有序归并

【数据蒋堂】第34期:JOIN提速 - 外键指针的衍生

【数据蒋堂】第33期:JOIN提速 - 外键指针化

【数据蒋堂】第32期:JOIN简化 - 意义总结

【数据蒋堂】第31期:JOIN简化 - 维度对齐

【数据蒋堂】第30期:JOIN简化 - 消除关联

【数据蒋堂】第29期:JOIN运算剖析

【数据蒋堂】第28期:迭代聚合语法

【数据蒋堂】第27期:非常规聚合

【数据蒋堂】第26期:再谈有序分组

【数据蒋堂】第25期:有序分组

【数据蒋堂】第24期:非等值分组

【数据蒋堂】第23期:还原分组运算的本意

【数据蒋堂】第22期:有序遍历语法

【数据蒋堂】第21期:常规遍历语法

【数据蒋堂】第20期:从SQL语法看离散性

【数据蒋堂】第19期:从SQL语法看集合化

【数据蒋堂】第18期:SQL用作大数据计算语法好吗?

【数据蒋堂】第17期:SQL的困难源于关系代数

【数据蒋堂】第16期:SQL像英语是个善意的错误


    关于数据蒋堂    

《数据蒋堂》的作者蒋步星,从事信息系统建设和数据处理长达20多年的时间。他丰富的工程经验与深厚的理论功底相互融合、创新思想与传统观念的相互碰撞,虚拟与现实的相互交织,产生出了一篇篇的沥血之作。此连载的内容涉及从数据呈现、采集到加工计算再到存储以及挖掘等各个方面。大可观数据世界之远景、小可看技术疑难之细节。针对数据领域一些技术难点,站在研发人员的角度从浅入深,进行全方位、360度无死角深度剖析;对于一些业内观点,站在技术人员角度阐述自己的思考和理解。蒋步星还会对大数据的发展,站在业内专家角度给予预测和推断。静下心来认真研读你会发现,《数据蒋堂》的文章,有的会让用户避免重复前人走过的弯路,有的会让攻城狮面对扎心的难题茅塞顿开,有的会为初入行业的读者提供一把开启数据世界的钥匙,有的甚至会让业内专家大跌眼镜,产生思想交锋。



蒋步星,清华大学计算机硕士,著有《非线性报表模型原理》等

1989年中国国际奥林匹克数学竞赛团体冠军成员,个人金牌

2000年创立润乾公司,首次在润乾报表中提出非线性报表模型,完美解决了中国式复杂报表制表难题,目前该模型已经成为报表行业的标准。

2008年开始研发不依赖关系型数据的计算引擎,历经多个版本后,于2014年集算器正式发布。有效地提高了复杂结构化大数据计算的开发速度和运算效率。

2016年荣获中国电子信息产业发展研究院评选的“2016年中国软件和信息服务业 • 十大领军人物”。

2017年创办数据领域技术讲堂《数据蒋堂》,专注数据、每周一期。

2017年获得中国大数据产业生态大会评选的“2017年度中国数据大工匠”


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存