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

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

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

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

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

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

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

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

1、唯一性

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

2、查询性能

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

3、关联性

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

4、数据完整性

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

5、表约束

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

给数仓带来的问题

1、管理成本

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

2、存储空间

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

3、查询效率

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

总结

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

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

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

相关推荐
yangSnowy5 分钟前
MySQL 分布式锁实现方案
数据库·分布式·mysql
倔强的石头1068 分钟前
关系数据库替换用金仓:从 Oracle 到 KingbaseES 的迁移实战
数据库·oracle·kingbase
Leo.yuan9 分钟前
制造业五大模式解析:OEM、ODM、OBM、JDM、CMT
大数据·数据库·信息可视化
铬仁10 分钟前
kettle 9.2 连接达梦DM Database Server 64 V8
数据库·etl
松涛和鸣17 分钟前
69、Linux字符设备驱动实战
linux·服务器·网络·arm开发·数据库·驱动开发
2501_9419820518 分钟前
企微自动化开发:安全与效率的平衡术
数据库·mysql·企业微信
阿里-于怀19 分钟前
Kubernetes 官方再出公告,强调立即迁移 Ingress NGINX
java·大数据·数据库·ingress nginx
玄同76525 分钟前
数据库全解析:从关系型到向量数据库,LLM 开发中的选型指南
数据库·人工智能·知识图谱·milvus·知识库·向量数据库·rag
枫叶丹433 分钟前
时序数据库选型指南:在大数据浪潮中把握未来,为何Apache IoTDB值得关注?
大数据·数据库·apache·时序数据库·iotdb
小虾米vivian37 分钟前
达梦使用dmfldr和外部表导入txt数据(windows环境)
java·服务器·数据库