数据研发基础 | 数仓中需要主键吗

俗话说,周一周一奄奄一息。昨天去演唱会嗨过头了,今天上班脑袋里还在:你不是真正的快乐。废话,谁上班会快乐!但是时间紧任务重,这周有个项目ddl,不得不专注下来开始建模。一思考,脑袋就打结了,在第一步确定数据粒度就出了点小问题。又要能下钻到提交每个报告的状态、类型,又要能在看板侧计算未提交报告的人数。为了保证所有指标都能计算出来,粒度必须保证最小,人月粒度过于粗糙,无法保留报告状态。报告粒度粒度最小,但是无法计算某些人数指标。如果将两者杂糅,模型的粒度太模糊,并且用什么做唯一标识主键呢?

最后在小本本上列了所有指标才琢磨出来,对当月未提交报告的人可以维护一个虚拟报告号,这样保证粒度最小,同时人数指标也便于计算了。

突然想到,之前建模的时候从来没有规定必须设定主键,但是数据库的表主键是必要的,那么数仓中到底需不需要主键呢?

--------学习区--------

主键的来源于数据库中第二范式(2NF):要求数据库表中每个实例或记录必须可以唯一地区分,要选一个标识唯一区分实体,这就是主键。

!NOTE 3NF范式:

i.原子性。每个属性必须唯一,不具有多义性(不能拆分成其他几列)

ii.必须存在主键。每个非主属性必须完全依赖于主键,而非主键的一部分。

iii.消除传递依赖。另外非主键列必须直接依赖于主键,不能存在传递依赖

传统数据库中的主键的必要性:

1、唯一性

主键必须保证表中的每一行都有唯一的标识。这样可以避免数据冗余和不一致性。

2、查询性能

数据库系统通常会使用主键来加速数据检索。主键通常会被索引,这样可以更快速地找到特定行的数据,提高查询效率。

3、关联性

主键常常用于建立表与表之间的关系。在关系数据库中,一个表的主键通常与其他表中的外键建立关联,这种关系对于数据的一致性和完整性非常重要。

4、数据完整性

主键的存在有助于确保数据的完整性。主键要求每一行都有一个唯一标识,这可以防止重复或无效的数据插入。

5、表约束

主键通常用作表的约束,确保表中的数据满足特定的条件。这有助于维护数据的质量和一致性。

给数仓带来的问题

1、管理成本

传统数据库需要频繁的事务操作,但是数仓主要存储大量历史数据,维护主键会给引擎带来压力。

2、存储空间

前面提到主键自动建立索引可以加快查询,但是索引会膨胀,带来存储压力,降低磁盘存储和计算效率,数据量大地数仓中尤为明显。在目前的开发中,我还没有使用过数仓的索引,希望以后有机会学习。

3、查询效率

数仓是OLAP(在线分析处理) 不是OLTP(在线事务处理) ,场景多为分析类的,所以很多数据库引擎会使用列存。而主键是面向对象==(行存)==的,反而会降低列存的查询优势。而且查询时又要逐条校验主键的唯一性,就算有索引加速,在大表中也可能会产生性能问题。通过避免使用主键,可以简化数据仓库的设计和维护。

总结

主键是传统关系型系统的产物,因为数仓的特性,需要酌情使用主键。应用中需要在便利性和性能、存储间找到一个平衡。

通过合理设计表结构、选择合适的约束条件和优化性能,可以在不使用主键的情况下,确保数据的唯一性和完整性。例如,在订单系统中,可以使用订单ID和产品ID的组合键来唯一标识每一行记录,而无需单独的主键字段。通过这种方式,可以确保数据的唯一性和完整性,同时避免了单一主键带来的复杂性。

所以正式开发前一定要好好建模,符合维度建模规范,确保表结构能够满足业务需求,同时具备良好的性能和可扩展性。

相关推荐
GIS数据转换器11 分钟前
无人机车载巡检系统
大数据·数据库·人工智能·数据挖掘·数据分析·无人机
AOwhisky8 小时前
MySQL 学习笔记(第四期):SQL 语言之多表查询
linux·运维·网络·数据库·笔记·学习·mysql
小红卒8 小时前
mysql之udf提权
数据库·mysql·网络安全
Trouvaille ~9 小时前
【Redis篇】Redis 哨兵(Sentinel):高可用自动故障转移
数据库·redis·缓存·中间件·sentinel·高可用·哨兵
qfljg9 小时前
oracle 迁移到postgres
数据库·oracle
giaz14n9X9 小时前
Redis 分布式锁进阶第五十七篇
数据库·redis·分布式
剑神一笑10 小时前
Linux ls 命令深度解析:从目录遍历到颜色输出的实现原理
linux·服务器·数据库
Maynor99610 小时前
Codex API 网关迁移与流量优化实战
数据库·oracle
WyCAGy8ij10 小时前
Redis 分布式锁进阶第二篇讲解
数据库·redis·分布式
南极企鹅10 小时前
MySQL的两大支柱:undo Log&redo log
数据库·mysql·oracle