那么对于这样的设计,如何使非规范式设计转换为规则的第一范式呢?
其实很简单,只需要将可再分的子属性单独拿出成列即可。
如上表变成第一范式设计:
院系 | 男生 | 女生 |
软件学院 | 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)。
**原子性:**事务的原子性表示事务执行过程中,把事务作为一个工作单元处理,一个工作单元可能包括若干个操作步骤,每个操作步骤都必须完成才算完成,若因任何原因导致其中的一个步骤操作失败,则所有步骤操作失败,前面的步骤必须回滚。
**一致性:**事务的一致性保证数据处于一致状态。如果事务开始时系统处于一致状态,则事务结束时系统也应处于一致状态,不管事务成功还是失败。
**隔离性:**事务的隔离性保证事务访问的任何数据不会受到其他事务所做的任何改变的影响,直到该事务完成。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
![img](https://img-blog.csdnimg.cn/img_convert/66ce019c442012889942eecce97aedae.jpeg)
最后
给大家送一个小福利
附高清脑图,高清知识点讲解教程,以及一些面试真题及答案解析。送给需要的提升技术、准备面试跳槽、自身职业规划迷茫的朋友们。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
链图片转存中…(img-bTtATLpV-1713710242149)]
附高清脑图,高清知识点讲解教程,以及一些面试真题及答案解析。送给需要的提升技术、准备面试跳槽、自身职业规划迷茫的朋友们。
[外链图片转存中…(img-VtzF69k0-1713710242149)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!