数据库设计三范式

本文详细阐述了数据库设计中的第一、二、三范式的基本概念及其应用,通过具体实例展示了如何通过规范化避免数据冗余、更新异常等问题,帮助读者更好地理解和运用数据库规范化原则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

l  第一范式(1NF):(字段不可再分)数据库表中的字段都是单一属性的,不可再分。

原表1

image

应修改成如下:

修改后的表

image

l   第二范式(2NF):(消除部分函数依赖)在满足第一范式的基础上,数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。(另外,所有单关键字的数据库表都符合第二范式,因为不可能存在组合关键字。)

原表2

image

学分完全依赖课程名称;姓名、年龄完全依赖学号;成绩依赖学号和课程

这样的后果是:

(1) 数据冗余:同一门课程由n个学生选修,"学分"就重复n-1次;同一个学生选修了m门课程,姓名和年龄就重复了m-1次。

(2) 更新异常:若调整了某门课程的学分,数据表中所有行的"学分"值都要更新,否则会出现同一门课程学分不同的情况。

(3) 插入异常:假设要开设一门新的课程,暂时还没有人选修。这样,由于还没有"学号"关键字,课程名称和学分也无法记录入数据库。

(4)删除异常:假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同时,课程名称和学分信息也被删除了。很显然,这也会导致插入异常。

修改后如下:

学生表

image

课程表

image

成绩表

image

l第三范式(3NF):(消除传递函数依赖)在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖,指的是如果存在"A  B  C"的决定关系,则C传递函数依赖于A。也就是说表中的字段和主键直接对应不依靠其他的中间字段

原表3

image

可以看出表中的学院地点依赖于学院,学院依赖于学号,学院电话同理。所以这不符合第三范式,这样的结果同样会造成上述不良后果

(1) 数据冗余:同一个“学院”由n个学生,“学院地点”和“学院电话”就重复n-1次。

(2) 更新异常:若调整了某学院的地点,数据表中所有有关行的“学院地点”值都要更新,否则会出现同一学院但是地点却不同的情况。

(3) 插入异常:假设要增加一个新学院,暂时还没有人报考。这样,由于还没有“学号”关键字,相关数据将无法记录入数据库。

(4) 删除异常:假设一批学生已经毕业,这些学生信息记录就应该从数据库表中删除。但是,与此同时,学院、学院地点和学院电话信息也被删除了。很显然,这也会导致插入异常。

修改后如下:

学生表

image

学院表

image

结束语:通过运用三个范式可以使你的数据库更加准确、高效。但是在关系数据库中,还有多值依赖,联接依赖的问题,从而提出了第四范式,第五范式等更高一级的规范化要求,那些我们以后再谈。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值