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

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

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

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

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

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

!NOTE\] 3NF范式: i.原子性。每个属性必须唯一,不具有多义性(不能拆分成其他几列) ii.必须存在主键。每个非主属性必须完全依赖于主键,而非主键的一部分。 iii.消除传递依赖。另外非主键列必须直接依赖于主键,不能存在传递依赖

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

1、唯一性

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

2、查询性能

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

3、关联性

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

4、数据完整性

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

5、表约束

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

给数仓带来的问题

1、管理成本

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

2、存储空间

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

3、查询效率

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

总结

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

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

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

相关推荐
数据知道1 分钟前
如何使用 httpx + SQLAlchemy 异步高效写入上亿级图片链接与MD5到 PostgreSQL
数据库·postgresql·httpx
PeterClerk1 分钟前
数据挖掘方向 CCF 期刊推荐(数据库 / 数据挖掘 / 内容检索)
数据库·人工智能·深度学习·数据挖掘·计算机期刊
littlegirll2 分钟前
一个KADB使用gpbackup迁移数据的脚本
数据库·数据迁移·kadb·gpbackup
alonewolf_9914 分钟前
Redis Stack全面解析:从JSON存储到布隆过滤器,打造高性能Redis扩展生态
数据库·redis·json
正在走向自律8 小时前
金仓数据库KingbaseES中级语法详解与实践指南
数据库·oracle·kingbasees·金仓数据库·信创改造
Gofarlic_oms19 小时前
Windchill用户登录与模块访问失败问题排查与许可证诊断
大数据·运维·网络·数据库·人工智能
我是小疯子669 小时前
Python变量赋值陷阱:浅拷贝VS深拷贝
java·服务器·数据库
Zoey的笔记本9 小时前
2026告别僵化工作流:支持自定义字段的看板工具选型与部署指南
大数据·前端·数据库
静听山水9 小时前
docker安装starrocks
数据库
学编程的小程10 小时前
从“兼容”到“超越”:金仓KESBSON引擎如何借多模融合改写文档数据库规则
数据库