抽象真实世界的利器

简介: 抽象真实世界的利器

这是我的第15篇原创


之前分享的一篇《如何搭建一个数据仓库》中,有提到数据仓库的各层建模方法是不一样的。其中有朋友就问,这个3NF模型是个啥?

三范式

3NF模型就是第三范式模型。在这里使用三范式的原因,是因为明细数据层只做清洗和转换的工作,结构与业务库(OLTP)的一致,而业务库基本是遵循三范式的。

三范式指的是:

第一范式:保证列的原子性(每一列都是不重复的,不可再拆分的原子列)

上图中,销售下有金额和数量,咱数据库可不能做成多表头的样子,所以只能把表头拆分。地区中含有省市县三级,不是最细的原子粒度,所以也需要拆分。


第二范式:保证行的原子性(每一行都有唯一的主键,其他字段的值与主键一一对应)

上图中,原表的用户id重复出现2次了,原因有2:销售额和销售量出现错行,需要合并;采购两个商品,这两个商品与主键“用户id”不是一一对应的,所以需要拆出一个订单商品表。

上图中的例子,原表描述了用户的销售,以及采购的数据,数据颗粒度不一样,所以需要拆分。所以第二范式也通常可以理解为“每张表只描述一件事情”。


第三范式:保证表的原子性(每张表中的数据不会冗余,一旦有冗余字段,就需要拆一张表出来,用外键与主表关联)

上图中的例子,业务员姓名和类型信息在用户销售表中被冗余了,不符合第三范式,所以需要拆表。1表的用户id是主键,业务员id是外键与2表的业务员id主键关联。

数据库设计

现在的很多开发人员,甚至是数据开发人员都不太遵守三范式了,有些三范式规则甚至被禁用,比如外键。

所有事物的发展都是有规律的,当时提出三范式,是因为我们在进行数据库设计的时候,必须要有一个规则,用来统一所有人的思想,保证数据库设计的通用性和可理解性。三范式就是用来约束所有设计者的。

数据库设计的过程,就是将现实世界抽象到信息系统的过程。使用的工具就是ER图。

我们把所有参与到业务流程中的对象,抽象为“实体”,每个实体有自己的“属性,实体与实体之间产生的动作叫“关系”,用线连接起来。

还是以采购业务流为例,一共可以抽出四个实体,用户、业务员、订单和商品。

业务员有入职时间、业务员id等属性;

用户有联系电话、所在地区等属性;

订单有商品id、商品时间、下单时间等属性;

商品有商品id、商品名称等属性。


业务员维护用户,一个业务员可以维护多个用户,他俩之间的关系就是一对多;用户采购商品,一个用户可以采购多个订单,关系是一对多;一个订单可以下多个商品,一个商品可以被多个订单采购,所以他俩的关系是多对多。

根据这个方法,所有的数据库设计人员就能设计出这四张表:

这四张表遵守第一、第二、第三范式,所有的数据做到了最少的冗余,最大的信息承载量,满足所有业务,不会对增、删、改等任何数据操作有歧义或者带来异常。

结语

不过现在已经进入大数据时代,上述的很多范式均已退化。以前的存储很贵,我们必须要寸土必争。现在存储很便宜,数据量又大,效率又要高,所以普遍采用空间换时间的方法,大量冗余数据,提升效率。尤其是在分布式环境中,要追求数据的一致性,三范式就无法满足。之前提到过禁用外键就是因为外键约束会导致连锁反应,那将会是一场灾难。

相关文章
|
存储 弹性计算 数据管理
阿里云对象存储OSS收费标准:存储、流量和请求等多个计费项详解
阿里云对象存储OSS提供多样化的计费模式,涵盖存储、流量、请求等多项费用。存储费用方面,按量付费标准型为0.09元/GB/月,包年包月则有9元40GB等多种选择。流量费用仅对公网出方向收费,价格区间从0.25至0.50元/GB不等,支持按量付费与流量包抵扣两种方式。更多详情及精准报价,欢迎访问阿里云OSS官方页面。
7233 1
|
运维 应用服务中间件 数据库
自动化运维:使用Ansible简化日常任务
【10月更文挑战第2天】在快速迭代的软件开发周期中,运维工作往往变得重复而繁琐。本文将介绍如何使用Ansible这一强大的自动化工具来简化日常任务,从而提升效率并减少人为错误。从基础配置到复杂部署,我们将一步步展示如何通过编写简单的Playbook来实现自动化管理。
194 3
|
SQL 关系型数据库 MySQL
当并发insert on duplicate key update遇见死锁:更新丢失
数据库死锁问题,是一个老生常谈且很常见的问题,网上也有非常多对于各类死锁场景的解析和复现,但凡和死锁有关,无外乎不涉及数据库隔离等级、索引、以及innodb锁等相关原因。但是我这个案例我搜遍了全网也没能找到比较相似情况。于是我想尽可能的复现出这种情况,找出死锁的原因,找出可能出现的隐患。问题的背景:我们的数据库中的发生死锁的表是具有”多列组合构建的唯一索引“(不包含
21038 4
|
机器学习/深度学习 安全 Shell
必知的技术知识:find用法详解
必知的技术知识:find用法详解
|
搜索推荐 领域建模 调度
(上)原理都懂,就是不会建模?来,顶尖数据模型走一波
(上)原理都懂,就是不会建模?来,顶尖数据模型走一波
|
存储 搜索推荐 数据建模
(下)原理都懂,就是不会建模?来,顶尖数据模型走一波
(下)原理都懂,就是不会建模?来,顶尖数据模型走一波
|
NoSQL Java 关系型数据库
非关系型数据库NoSQL数据层解决方案 之 redis springboot整合与读写操作 2024详解以及window版redis5.0.14下载
非关系型数据库NoSQL数据层解决方案 之 redis springboot整合与读写操作 2024详解以及window版redis5.0.14下载
181 0
|
数据采集 机器学习/深度学习 存储
ETL工程师必知的数据清洗方法【最全】
ETL工程师必知的数据清洗方法【最全】
|
NoSQL 分布式数据库 Redis
数据中台之OneID (ID-Mapping)架构设计细节全解
数据中台之OneID (ID-Mapping)架构设计细节全解
StringBuffer方法
快速学习StringBuffer方法

热门文章

最新文章