数据蒋堂 | JOIN延伸 - 维度概念

简介:

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

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

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

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

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

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

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

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

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

看这两个同维表:

87847dd14346ba4d834ba4d388a197031bbb6c4b

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

再看主子表的情况:

ab130e13b83a98bd9fd75ead0cd2c9c8bd720913

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

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

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

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

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

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

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

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

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


原文发布时间为:2017-12-28

本文来自云栖社区合作伙伴“数据派THU”,了解相关信息可以关注“数据派THU”微信公众号

相关文章
|
存储 Prometheus Cloud Native
Grafana 系列文章(十):为什么应该使用 Loki
Grafana 系列文章(十):为什么应该使用 Loki
|
11月前
|
消息中间件 存储 数据采集
《数据中台隐性故障的排查逻辑与工程化避坑策略》
本文围绕数据中台建设中的三类隐性故障展开复盘,基于特定数据处理框架、分布式存储系统及混合计算环境,拆解故障排查与解决路径。首先解决用户活跃报表偶现数据缺失问题,通过优化任务调度与数据分区校验避免跨时段数据漏采;其次攻克实时推荐接口高峰期空数据难题,通过匹配计算并行度与缓存优化提升数据处理效率;最后修复离线仓库用户留存率重复统计故障,重构分区合并脚本并建立数据质量巡检机制。文中还提炼“现象锚定-链路拆解-根源验证”排查方法论,为数据中台开发者提供工程化避坑指南。
358 7
|
8月前
|
存储 前端开发 安全
技术的金字塔:理解我们构建数字世界的不同层次
技术的金字塔:理解我们构建数字世界的不同层次
422 118
|
7月前
|
UED
【实战原型】商城类电商购物 APP 网购原型
一款基于Axure 9打造的高保真电商APP原型,涵盖选品、购物车、结算、个人设置等全链路核心流程,融合淘宝、京东等主流平台设计精髓。具备丰富交互与细节功能,支持产品演示、需求评审与团队协作,是极具实战价值的电商设计利器。(238字)
331 0
|
10月前
|
机器学习/深度学习 人工智能 资源调度
MicroNAS:面向MCU的零样本神经架构搜索——论文阅读
MicroNAS是一种专为微控制器单元(MCU)设计的零样本神经架构搜索(NAS)框架,无需训练即可通过理论驱动的性能指标评估网络架构。相比传统NAS方法,其搜索效率提升高达1104倍,同时兼顾精度与硬件效率,适用于边缘计算场景。该框架结合神经切线核(NTK)条件数、线性区域计数及硬件感知延迟模型,实现快速、高效的架构搜索,为资源受限设备上的AI部署提供了新思路。
551 2
MicroNAS:面向MCU的零样本神经架构搜索——论文阅读
|
10月前
|
云安全 人工智能 自然语言处理
|
9月前
|
缓存 API Python
如何通过API获取拼多多商品详情数据?
注册开放平台账号,获取client_id与client_secret,调用鉴权接口换取access_token(有效期24小时)。通过GET请求查询商品详情,需传goods_id和access_token。响应包含商品名称、价格、销量及SKU库存等信息。注意处理code非0的错误,控制请求频率≤100次/分钟,建议指数退避重试。Python示例使用requests实现。
1036 0
|
11月前
|
前端开发 Java 关系型数据库
基于springboot的二手车交易系统
本系统基于B/S架构,采用VUE前端与SSM框架后端结合MySQL数据库,实现二手车交易管理。系统利用Java语言开发,具备良好的扩展性与稳定性,旨在提升二手交易管理效率,满足用户对信息查询与管理的需求。
|
11月前
|
存储 消息中间件 分布式计算
zookeeper
ZooKeeper 是专为分布式系统设计的协调服务,提供一致性、可靠性与有序性支持,常用于服务注册、配置管理、分布式锁等场景。其核心基于 ZAB 协议保障数据同步与集群一致性,采用树形结构存储数据,并通过 Watcher 机制实现事件通知。架构上包含 Leader、Follower 和 Observer 三种角色,兼顾写一致性与读扩展性,是分布式系统的重要基础组件。
492 0