mysql三范式和反三范式_数据库三范式和反三范式

要说数据库什么最抽象,我觉得就是这个三范式,不是很好理解,但是表在设计的时候又必须要知道这么一个规则。

首先使用最简洁的话说说这三范式:

第一范式(1NF:The First Normal Form):每一列不能再分割。

第二范式(2NF:The Second Normal Form):满足1NF条件下,每一列非主键列要完全依赖主键,不能只依赖联合主键中的一部分(因为主键可能是联合主键,有多列的,必须所有字段都用上 )

第三范式(3NF:The Third Normal Form):满足2NF条件下,非主键的列不能依赖于非主键的列;

看到这三句话肯定不理解,于是,我们用图来理解一下

1.第一范式

简单的来说就是不能建立下面这样的表,可以看到地址这一列是可以分割的;

一般只要是关系型数据库建立的表都会满足第一范式的。

5614a903db605fbde59e50b6cefa3569.png

2.第二范式

看下面这个表,这里联合主键是(学号,科目),只有确定了这两个值,才能确定其他的列;比如分数,如果只依赖学号,那么当学号为1的时候,分数有两个,不能唯一确定;如果只依赖科目,当科目为语文的时候,分数也对应有两个;

17e10ed2a1f0858cc36cc306b664886b.png

注意上面这个表中的姓名,它只是依赖学号的,根据学号就可以找对唯一对应的姓名,所以这时非主键列 “姓名”  部分依赖于联合主键“学号,科目”,不是完全依赖,所以不满足第二范式;

我们需要将姓名这一列给提取出来,下表所示,对于完全依赖主键的放在一张表中,展示依赖一部分主键的放在另外一张表中;

b50a52266da93c30fed19054d9aa4d3f.png

3.第三范式

什么叫做非主键列不能依赖非主键列呢?看着就看不懂...

不要急,我们再看一张表:

a76ba07c8465e208db78b5e68423fd56.png

我们可以知道系名可以依赖学号,毕竟一个学生肯定对应着唯一的系,但是系主任呢?系主任肯定是依赖于系名的,不可能依赖某个学生吧,所以有这样的一个依赖关系:学号->系名->系主任,系主任间接依赖于主键,这是不满足第三范式的;

所以我们需要将系主任给拿出来,单独弄一张表:

b1c9f36866813f09bf071000abe0d38b.png

以上就是我对三范式的理解,看了一些视频和找了一些博客总结一下的吧,其实可以使用更加专业的话来说三范式的,有兴趣的可以看看这个老哥的博客,传送门╮(╯_╰)╭ ,这个就比较专业了,哈哈

4.反三范式

按理来说按照三范式设计数据库之后,可以避免冗余数据,使得数据库结构很精简;但是有时这样的设计会使得查询表的时候需要进行关联查询,比如上面说第二范式的时候,姓名那里就不需要单独弄张表出来;

单独弄张表出来,如果有个需求要查询一个学生的名字,科目和分数,你就需要关联查询一下;但是不单独弄张表出来,你只需要查询一次就够了;

所以适当的冗余数据是可以接受的,而且可以提高查询效率,不应该为了遵守三范式而创建设计表,应该衡量自己项目的实际需要,在三范式和反三范式之间做权衡。

我这里也就是大概讲了一下我的理解,肯定有的地方不是很正确,哈哈哈,实际的项目中表肯定是非常复杂的,那就要多分析了╮(╯_╰)╭

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值