为了建立结构合理,数据冗余较小的表,所以数据表在设计时通常要遵循一定的规则,也就是范式
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)
);
【MySQL----数据表设计三大范式】
最新推荐文章于 2024-05-21 15:08:44 发布