数据库“三大范式”及“事务性”详解

本文涉及的产品
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
简介: 数据库“三大范式”及“事务性”详解

 

image.gif编辑

目录

什么是范式

第一范式(1NF)

第二范式(2NF)

第三范式(3NF)

BC范式(BCNF)

数据库的事务性

事务处理

事务ACID属性


Hello,小伙伴们大家好!我是灰小猿,一个超会写bug的程序猿!

在进行比较正规的项目开发的时候,通常会根据需求设计相应的数据库,而这些数据库则通常需要考虑数据库的冗余性和简洁性,数据库三大范式就是对关系数据库设计结构的一个规定。

什么是范式?

当一个关系中的所有分类都是不可再分的数据项时,该关系是规范化的。不可再分的数据项,即不存在组合数据项和多项数据项。一个低一级的关系模式,通过模式分解可以转换为若干高一级范式的关系模式的集合,这个过程就叫规范化。二维数据表可以分为5级范式为1NF、2NF、3NF、4NF、5NF。第一范式满足最低的要求条件,第五范式满足最高要求的条件。并且在数据库设计中我们要秉承以更高范式设计标准的原则设计和开发数据库。

那么接下来我和小伙伴们简单介绍一下数据库中常用的三大范式:

第一范式(1NF)

概念:数据库中所有元素都是不可再分的,确保元素的原子性

从概念上我们其实也很好理解,第一范式所说的就是每一列中的属性值都是不可再分的。打个比方如下表:

院系

人数

男生

女生

软件学院

1652

689

计算机学院

1264

489

大数据学院

653

534

人数列中的属性是可以再次分割成男生和女生人数的,这就不满足了数据库设计的第一范式中的“每一列的属性值都是不可再分的”。

那么对于这样的设计,如何使非规范式设计转换为规则的第一范式呢?

其实很简单,只需要将可再分的子属性单独拿出成列即可。

如上表变成第一范式设计:

院系

男生

女生

软件学院

1652

689

计算机学院

1264

489

大数据学院

653

534

第二范式(2NF)

概念:在第一范式的基础上,所有非主属性都完全依赖于主码。

换句话说就是:在满足第一范式的前提下,确保每一个实例或者每一行都可以被唯一的标识,

但是值得注意的是:符合第二范式的关系模型可能还存在数据冗余、更新异常等问题。同时这也是第二范式所存在的一些缺陷和问题。

那么什么样的数据表才是属于满足第一范式而不满足第二范式的呢?

比如这个数据表:

职工号

姓名

职称

项目号

项目名

1

张三

程序员

111

C开发

2

李四

软件设计师

222

Java开发

3

王五

高级架构师

333

大数据开发

如表所示:姓名由职工号唯一确定(职工号—>姓名)、职称由职工号唯一确定(职工号—>职称)、但是项目名由项目号唯一确定(项目号—>项目名),这样在该表中,项目名就不能由职工号唯一推出,这样就不满足了第二范式的“所有非主属性完全依赖于主码”

对于这样的数据表,想要将其转换成满足第二范式,需要将不能够被唯一标识出的属性单独成表,对于上表,就是将项目信息单独成表,员工信息单独成表。

第三范式(3NF)

概念:关系模型满足第二范式,所有非主属性对任何候选关键字都不存在传递依赖。

也可以说是:属性不依赖于其他非主属性,属性直接依赖于主键

即每个属性都跟主键有直接关系而不是间接关系,像:a-->b-->c。

例如下表所示结构:

学号

姓名

年龄

性别

所在院校

院校地址

院校电话

111111

张三

21

软件学院

惠济区

123456

222222

李四

22

计算机学院

金水区

123455

333333

王五

23

大数据学院

二七区

123444

如上表这样一个表结构,就存在上述关系。 学号--> 所在院校 --> (院校地址,院校电话)。我们应该拆开来,如下:

(学号,姓名,年龄,性别,所在院校)--(所在院校,院校地址,院校电话)

所以就满足了属性直接依赖于主键

BC范式(BCNF)

在概念上:BC范式又叫做修改后的第三范式,是在3NF的基础上消除主属性对于码的部分与传递函数依赖

为什么叫修改后的第三范式,由此就可以说明第三范式在某种情况下同样也是存在一定的缺陷的。那么到底存在怎样的缺陷并且如何修改呢?

我们以一个实际的数据表实例来说明:

对于一个仓库管理系统,现有若干个仓库, 每个仓库只能有一名管理员,一名管理员只能在一个仓库中工作;一个仓库中可以存放多种物品,一种物品也可以存放在不同的仓库中。每种物品在每个仓库中都有对应的数量。

仓库名

管理员

物品名

数量

一号仓

张三

手机

12

一号仓

张三

电脑

20

二号仓

李四

电机

35

二号仓

李四

空调

26

那么关系模式 仓库(仓库名,管理员,物品名,数量) 属于哪一级范式?

我们来对它分析一下:

已知函数依赖集:仓库名 → 管理员,管理员 → 仓库名,(仓库名,物品名)→ 数量

码:(管理员,物品名),(仓库名,物品名)

主属性:仓库名、管理员、物品名

非主属性:数量

由于不存在非主属性对码的部分函数依赖和传递函数依赖。所以此关系模式属于3NF。

现在我们对上述数据表进行一些操作:

1、在一号仓添加一个新的物品“平板”,

那么我们需要输入的数据是(仓库名、管理员名、物品名、数量),这个时候大家会不会有一个发现,我在仓库中存放数据,我只需要知道把该物品放到了哪一个仓库就行了,为什么还要输入管理员名呢?这样是不是就显得有些麻烦了。

2、给二号仓换一个管理员“王五”,

这个时候我们要做的应该是将每一条二号仓的数据中的管理员名这个属性,都要修改成“王五”,这样是不是就很麻烦了。

造成此问题的原因:存在着主属性对于码的部分函数依赖与传递函数依赖。(在此例中就是存在主属性【仓库名】对于码【(管理员,物品名)】的部分函数依赖。

解决办法就是要在 3NF 的基础上消除主属性对于码的部分与传递函数依赖。

即将上表拆分成两个表,一个仓库物品表、一个仓库管理员表

仓库物品表

仓库名

物品名

数量

一号仓

手机

12

一号仓

电脑

20

二号仓

电机

35

二号仓

空调

26

仓库管理员表

仓库名

管理员名

一号仓

张三

二号仓

李四

这样在对上述操作时,就很好的避免了问题的出现,这样的数据库设计规则就属于BC范式

数据库的事务性

除了数据库设计三大范式之外,事务处理也是保证数据完整性的重要手段。事务是单独的工作单元,该单元可以包含多个操作以完成一个完整的任务。锁是在多用户环境中对数据访问的限制。事务和锁确保了数据的完整性。

事务处理

提交commit,当所有的操作步骤都被完整执行后,称该事务被提交。

回滚rollback,由于某一操作步骤执行失败,导致所有步骤都没有被提交,则事务必须回滚,即回到事务执行前的状态。

事务ACID属性

事务处理的特性,每一个事务都有他们所共有的特性,叫做ACID特性,分别是原子性(atomicity),一致性(consistency)、隔离性(Isolation),持久性(Durability)。

原子性:事务的原子性表示事务执行过程中,把事务作为一个工作单元处理,一个工作单元可能包括若干个操作步骤,每个操作步骤都必须完成才算完成,若因任何原因导致其中的一个步骤操作失败,则所有步骤操作失败,前面的步骤必须回滚。

一致性:事务的一致性保证数据处于一致状态。如果事务开始时系统处于一致状态,则事务结束时系统也应处于一致状态,不管事务成功还是失败。

隔离性:事务的隔离性保证事务访问的任何数据不会受到其他事务所做的任何改变的影响,直到该事务完成。

持久性:事务的持久性保证加入事务执行成功,则它在系统中产生的结果应该是持久的。

好了,关于数据库设计的三大范式以及数据库的事务性的讲解就先和大家分享到这里,其中有不足和需要更正的地方还希望各位大佬指正。

觉得不错记得点赞关注哟!

灰小猿陪你一起进步!

image.gif编辑

相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps 
目录
相关文章
|
15天前
|
存储 数据库
数据库设计三范式
三范式设计的最终目的都是为了减少我们的工作量,所以说,尽管三范式是一种很好的指导规范,但在实际应用中,我们也不需要太局限在三范式中,更多的是应该从项目中出发,设计出合理的表结构。
|
5天前
|
SQL 数据库 数据安全/隐私保护
SQL Server数据库Owner导致事务复制log reader job无法启动的解决办法
【8月更文挑战第14天】解决SQL Server事务复制Log Reader作业因数据库所有者问题无法启动的方法:首先验证数据库所有者是否有效并具足够权限;若非,使用`ALTER AUTHORIZATION`更改为有效登录名。其次,确认Log Reader使用的登录名拥有读取事务日志所需的角色权限。还需检查复制配置是否准确无误,并验证Log Reader代理的连接信息及参数。重启SQL Server Agent服务或手动启动Log Reader作业亦可能解决问题。最后,审查SQL Server错误日志及Windows事件查看器以获取更多线索。
|
2月前
|
存储 关系型数据库 MySQL
MySQL数据库进阶第六篇(InnoDB引擎架构,事务原理,MVCC)
MySQL数据库进阶第六篇(InnoDB引擎架构,事务原理,MVCC)
|
28天前
|
存储 SQL 关系型数据库
数据库事务:确保数据完整性的关键20
【7月更文挑战第20天】事务是数据库操作的基本逻辑单位,确保数据一致性。ACID原则包括:原子性(操作全成或全败),一致性(事务前后数据合法性),隔离性(并发操作互不影响),持久性(提交后更改永久保存)。MySQL的InnoDB引擎支持事务,通过undo log实现回滚,redo log确保数据持久化。开启事务可使用`BEGIN`或`START TRANSACTION`,提交`COMMIT`,回滚`ROLLBACK`。
148 70
|
1月前
|
存储 关系型数据库 数据库
关系型数据库设计范式:深入理解与实践
【7月更文挑战第20天】关系型数据库设计范式是数据库设计中的重要指导原则,它通过一系列规范来减少数据冗余、提高数据一致性和优化查询性能。在实际应用中,我们应该根据具体需求和数据特点,灵活选择和应用不同的范式级别,以构建高效、可靠和可扩展的数据库系统。同时,也需要注意范式设计带来的挑战和限制,根据实际情况进行权衡和调整。
|
1月前
|
SQL 关系型数据库 MySQL
乐观锁在分布式数据库中与事务隔离级别结合使用
乐观锁在分布式数据库中与事务隔离级别结合使用
|
14天前
|
缓存 关系型数据库 MySQL
MySQL调优秘籍曝光!从索引到事务,全方位解锁高可用秘诀,让你的数据库性能飞起来!
【8月更文挑战第6天】MySQL是顶级关系型数据库之一,其性能直接影响应用的高可用性与用户体验。本文聚焦MySQL的高性能调优,从索引设计到事务管理,逐一解析。介绍如何构建高效索引,如联合索引`CREATE INDEX idx_order_customer ON orders(order_id, customer_id);`,以及索引覆盖查询等技术。
40 0
|
1月前
|
存储 Java 数据库连接
数据库三范式详解及应用
数据库三范式详解及应用
|
1月前
|
存储 Java 数据管理
数据库三范式设计与规范化过程详解
数据库三范式设计与规范化过程详解
|
30天前
|
存储 SQL 关系型数据库
MySQL设计规约问题之在数据库设计中,为什么要适当考虑反范式的表设计
MySQL设计规约问题之在数据库设计中,为什么要适当考虑反范式的表设计