数据仓库灵魂30问之数仓有哪几种建模思想?
范式建模
范式建模在实际的应用中有:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)、第五范式(5NF)
在企业范式建模中,一般追求三范式,即:
- 属性不可分割
- 不存在部分函数依赖
- 不存在传递函数依赖
属性不可分割
假设有表如下:
班级 | 物品 |
---|---|
3年E班 | 30张桌子 |
3年E班 | 30张椅子 |
很显然这个表不符合第一范式,因为列中的数据不是原子数据项,可以再分割。修改后如下:
年级 | 班级 | 数量 | 物品 |
---|---|---|---|
3 | E | 30 | 桌子 |
3 | E | 30 | 椅子 |
不存在部分函数依赖
有表如下:
学号 | 姓名 | 系名 | 系主任 | 课名 | 分数 |
---|---|---|---|---|---|
1022211101 | 李小明 | 经济系 | 王强 | 高等数学 | 95 |
1022211101 | 李小明 | 经济系 | 王强 | 大学英语 | 87 |
1022211101 | 李小明 | 经济系 | 王强 | 普通化学 | 76 |
1022211102 | 张莉莉 | 经济系 | 王强 | 高等数学 | 72 |
1022211102 | 张莉莉 | 经济系 | 王强 | 大学英语 | 98 |
1022211102 | 张莉莉 | 经济系 | 王强 | 计算机基础 | 88 |
1022211101 | 高芳芳 | 法律系 | 刘玲 | 高等数学 | 82 |
1022211101 | 高芳芳 | 法律系 | 刘玲 | 法学基础 | 82 |
假设这个表中学号与课名为主键,那么分数完全依赖于学号与课名,但是姓名,系名,系主任不完全依赖于学号与课名,那么修改如下:
表一:
学号 | 课名 | 成绩 |
---|---|---|
1022211101 | 高等数学 | 95 |
1022211101 | 大学英语 | 87 |
1022211101 | 普通化学 | 76 |
1022211102 | 高等数学 | 72 |
1022211102 | 大学英语 | 98 |
1022211102 | 计算机基础 | 88 |
1022211101 | 高等数学 | 82 |
1022211101 | 法学基础 | 82 |
表二:
学号 | 姓名 | 系名 | 系主任 |
---|---|---|---|
1022211101 | 李小明 | 经济系 | 王强 |
1022211102 | 张莉莉 | 经济系 | 王强 |
1022211101 | 高芳芳 | 法律系 | 刘玲 |
不存在传递函数依赖
在表二中,我们可以通过学号推导学生属于那个系,然后推导出系主任,但是我们不能直接通过系主任推导出学号。这就表示学号+学生姓名+系名与系名+系主任是两对信息,传递依赖的是系名,所以可以修改为:
表三:
系名 | 系主任 |
---|---|
经济系 | 王强 |
法律系 | 刘玲 |
表四:
学号 | 姓名 | 系名 |
---|---|---|
1022211101 | 李小明 | 经济系 |
1022211102 | 张莉莉 | 经济系 |
1022211101 | 高芳芳 | 法律系 |
维度建模
维度建模就简单说一下就是事实表+维度表的不同组合方式。事实表是存放事实的表,维度表是存放维度的表,相关概念可以去什么是事实,什么是维度看。
目前组合方式主要有三种:
- 星型模型
- 雪花模型
- 星座模型
星型模型
核心一个事实表,连接着多个只有一个层次维度表。
雪花模型
雪花模型与星型模型的区别在于维度表的层次。
星座模型
星座模型与其他两个模型的区别在于事实表的数量,而星座模型也是最贴切数据仓库的模型。毕竟维度表可以复用,所以星型模型和雪花模型与星座模型不冲突。
在数据仓库建模中使用维度建模而不使用范式建模的原因是为了减少join,减少join就是减少shuffle,可以带来直观的性能提升。
在数据仓库的建设中,层次越向上越趋向于星型模型。
Data Vault
Data Vault模型是一种中心辐射式模型,其设计重点围绕着业务键的集成模式。这些业务键是存储在多个系统中的、针对各种信息的键(最好是主**),用于定位和唯一标识记录或数据。
Data Vault由中心表(Hub),链接表(Link)和卫星表(satellite)组成。
Data Vault是面向细节的,可追踪历史的,一组有连接关系的规范化的表的集合。 这些表可以支持一个或多个业务功能。
它是一种综合了第三范式(3NF)和星型模型优点的建模方法。