数仓中的反三范式操作

三范式是什么

具体可以参考 数据库设计三范式

数仓中反三范式操作有哪些

反1NF: 列不可再分

1NF是对属性的原子性,要求属性具有原子性,即列不可再分解;

数仓中反1NF的典型操作为多值维度、多值属性。

多值维度

对于多值维度, 一种情况是事实表的一条记录在某维表中有多条记 录与之对应。即上卷时,无法一起上卷的维度,会通过存储所有维度的方式进行兜底上卷。

比如对于淘宝交易订单,买家一次 购买了多种商品,如 一 件毛衣和两双袜子,称为交易父订单 : 对于每种商品的交易,称为交易 子订单:此交易父订单有两个子订单与之对应。

假设设计交易父订单事 实表,则对于 此事实表的每 一条 记录,在商品表中都有 一 到多条记录与 之对应。

多值属性

维表中的某个属性字段同时有多个值,称之为“多值属性”。它是多 值维度的另一种表现形式。

一点典型的设计是json字符串,或者是tags,或者是kv设计。

如商品的sku字段: 颜色:红;尺码:42….

反2NF: 属性完全依赖于主键

第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)

反2NF常见的操作为维表合并或事实表合并

在个别独立的业务系统中,如果维度或事实不是很重要,我们可能直接设计为一张较宽的事实表。

如:学生表、课程表、学生选修课程表,假设只有这么一个简单的系统,也不关注学生和课程,那么直接可以把学生表和课程表的属性退化至学生选修课程表进行建设。

反3NF:属性不依赖于其它非主属性

3NF是对字段的冗余性,要求任何字段不能由其他字段派生出来,它要求字段没有冗余,即不存在传递依赖;

数仓中为了易用性考虑,经常会采用维度退化的方式,而维度退化,就是对相关事实表的字段冗余。