【MySQL----数据表设计三大范式】

为了建立结构合理,数据冗余较小的表,所以数据表在设计时通常要遵循一定的规则,也就是范式

1、第一范式
保证数据表每一列的原子性,每一列下面的数据不能再拆分
creat table student(
id int primary key,
name varchar(20),
contact varchar(20) #联系方式
);
以上表的设计违反了第一范式,因为contact字段还可以再分
creat table student(
id int primary key,
name varchar(20),
tel varchar(20), #电话方式
wechat varchar(20), #微信
qq varchar(20)  #qq号
);

2、第二范式
非主键字段不能部分依赖主键字段,确保表中每一列要和主键列之间直接关联
一般违反第二范式都是出现在有联合主键的表中
#创建一张表,存储多个学生的多门学科成绩
学生id:1,2,3,4.。。。。。
学科id:1001,1002,1003,1004,,,,

学生id    学科id   学生姓名    学科名称     分数
1		1001 	张三		语文		  78
1		10012	张三		数学		  78
2		1001 	李四		语文		  78
2		1002	李四		数学		  78
2		1003 	李四		英语		  78

create table studentScore(
stuId int,
subId int,
stuName varchar(20),
subName varchar(20),
score int,
primary key(stuId,subId)  #联合主键
);

以上表的设计违反了第二范式,因为stuName列只跟stuId直接关联,而跟subId不关联,
subName列只跟subId直接关联,而跟stuid不直接关联

以上表应该改为:
学生表:
学生id      		学生姓名
1			张三
2			李四
学科表
 学科id      		学科名称
1001			语文
1002			数学
1003			英语
中间表
id 			学生id 		学科id		分数
1			1			1001		78
2			1			1002		78
3			2			1001		78
4			2			1003		78
5			2			1004		78

#查询张三的语文成绩
#查询李四的所有学科成绩
#查询李四的所有学科平均成绩
#查询有语文成绩的学生人数








3、第三范式
确保表中每一列要和主键列之间直接关联,而不是间接关联关系,非主键字段和主键字段之间不能存在传递依赖

#创建一张表,存储学生和他的学校信息
create table student(
id int primary key,
stuName varchar(20),
schoolName varchar(20),
schoolAddr varchar(20)
);

以上表的设计违反了第三范式,因为schoolName和schoolAddr两列与主键直接没有直接关联关系

以上表改为:
#学生表:create table student(
id int primary key,
stuName varchar(20),
sch_id #学生所属学校
);

学校表
create table school(
id int primary key,
stuName varchar(20),
schoolName varchar(20),
schoolAddr varchar(20)
);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

God Zhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值