数据库设计范式(MySQL为例)

目前数据库设计中存在着五中设计范式:第一范式(1NF),第二范式(2NF),第三范式(3NF),巴斯.科德范式(BCNF),第四范式(4NF),第五范式(5NF)。数据库设计的最低要求是要满足第一范式,在此基础上再满足上一级范式。范式的级别越高,数据设计的就是越合理。通常数据库的设计满足第三范式就可以了。

第一范式

第一范式(1NF)是指在关系模型中,对域添加的一个规范要求,所有的域都应该是原子性的,即数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。即实体中的某个属性有多个值时,必须拆分为不同的属性。第一范式要求数据库中的表都是二维表。

通俗的理解: 字段还可以再分吗?如过不能,则是符合1NF的设计。

USE sampledb;
CREATE TABLE student(
    学号 VARCHAR(64),
    学生姓名 VARCHAR(100),
    年龄 INT(64),
    性别 VARCHAR(20),
    地址 VARCHAR(100)
);

这里写图片描述
修改后满足第一范式


CREATE TABLE student_1NF(
    学号 VARCHAR(64),
    学生姓名 VARCHAR(100),
    年龄 INT(64),
    性别 VARCHAR(20),
    省 VARCHAR(20),
    市 VARCHAR(20),
    区 VARCHAR(20),
    详细地址 VARCHAR(50)
);

这里写图片描述

第二范式

第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。
第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。简而言之,第二范式就是在第一范式的基础上属性完全依赖于主键。
简单的解释,比如你和一个女生约会建立一张表,不用每条约会记录都记录她的身高、体重,将身高体重单独的存在一张表中供查询即可。

存在以下表,采用双主键(学号, 课程名称)
这里写图片描述
存在依赖(学号, 课程名称) → (姓名, 年龄, 成绩, 学分)
问题分析
数据冗余:同一门课程由n个学生选修,”学分”就重复n-1次;同一个学生选修了m门课程,姓名和年龄就重复了m-1次。
更新异常:
1)若调整了某门课程的学分,数据表中所有行的”学分”值都要更新,否则会出现同一门课程学分不同的情况。
2)假设要开设一门新的课程,暂时还没有人选修。这样,由于还没有”学号”关键字,课程名称和学分也无法记录入数据库。
删除异常 :假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同时,课程名称和学分信息也被删除了。很显然,这也会导致插入异常。
问题解决
把选课关系表SelectCourse改为如下三个表:
学生:Student(学号,姓名,年龄,性别,系别,系办地址、系办电话);
课程:Course(课程名称,学分);
选课关系:SelectCourse(学号,课程名称,成绩)。

第三范式(在2NF基础上消除传递依赖)

第三范式(3NF)是第二范式(2NF)的一个子集,即满足第三范式(3NF)必须满足第二范式(2NF)。第三范式(3NF)要求一个关系中不包含已在其它关系已包含的非主关键字信息。
简单的理解:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。 打个比方,比如评论表,如果你将用户ID,用户头像都放在这留言表中,就是不合适的了。用户头像是依赖于用户ID,而不依赖该评论。

接着看上面的学生表Student(学号,姓名,年龄,性别,系别,系办地址、系办电话),关键字为单一关键字”学号”,因为存在如下决定关系:
(学号)→ (姓名,年龄,性别,系别,系办地址、系办电话)
但是还存在下面的决定关系:
(学号) → (系别)→(系办地点,系办电话)
即存在非关键字段”系办地点”、”系办电话”对关键字段”学号”的传递函数依赖。
它也会存在数据冗余、更新异常、插入异常和删除异常的情况。
根据第三范式把学生关系表分为如下两个表就可以满足第三范式了:
学生:(学号,姓名,年龄,性别,系别);
系别:(系别,系办地址、系办电话)。

BC范式

在第三范式的基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递依赖则符合BC范式。也就是说如果是符合关键字,则复合关键字之间也不能存在函数依赖关系。

供应商商品ID供应商联系人商品数量
饮料一厂1张三10
饮料一厂2李四20
饮料二厂1王五10

存在下列关系因此不符合BCNF要求:
(供应商)–>(供应商联系人)
(供应商联系人)–>(供应商)
并且存在数据操作异常及数据冗余。
解决方式将一张表拆成两张表:

供应商商品ID商品数量
饮料一厂110
饮料一厂220
饮料二厂110
供应商供应商联系人
饮料一厂张三
饮料一厂李四
饮料二厂王五
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值