范式总共有六种范式,分别是第一范式、第二范式、第三范式、巴斯-科德范式、第四范式、第五范式,越高的范式数据库的冗余越低,但是数据库的IO更复杂(原来从一个表中可以查找,现在需要从多个表查询),因此一般情况之下,我们使用第三范式就可以了
上面这个表就不符合第一范式,因为学校是一个对象,学校还可以再分,并且学校无法用基本数据类型表示。
学校信息的每一行种,每一列都不能再进行拆分,此时已满足第一范式。
但是每一列都可以使用sql内置基本数据类型表示,数据冗余非常大
上述表中
要求学生表中记录学生所属的学院,在满足第二范式的基础上对学生表做出修改。 -上述描述中由两个实例,一个是学生,一个是学院
实体-关系图(Entity-Relationship Diagram)简称E-R图,也称作实体联系模型、实体关系模型,是⼀种⽤于描述数据模型的概念图,主要⽤于数据库设计阶段。
E-R图包含了以下三种基本成分: • 实体:即数据对象,⽤矩形框表⽰,⽐如⽤⼾、学⽣、班级等。 • 属性:实体的特性,⽤椭圆形或圆⻆矩形表⽰,如学⽣的姓名、年龄等。 • 关系:实体之间的联系,⽤菱形框表⽰,并标明关系的类型,并⽤直线将相关实体与关系连接起
-关系一般包括四种: 1对1,1对多,多对多,没有关系(不考虑)
• ⼀个⽤⼾实体包含的属性有:⽤⼾昵称,真实姓名,⼿机号,邮箱地址,性别,学校 • ⼀个账⼾实体包含的属性有:登录⽤⼾名,密码 • ⽤⼾实体与账⼾实体是⼀对⼀的关系,⽤E-R图表⽰如下
• ⼀个学⽣实体包含的属性有:真实姓名,学号,年龄,性别,⼊学时间 • ⼀个班级实体包含的属性有:班级名,学⽣⼈数 • ⼀个班级中有多个学⽣,所以班级实体与学⽣实体是⼀对多的关系,反过来说学⽣实体与班级实体 是多对⼀着么,⽤E-R图表⽰如下
• ⼀个学⽣实体包含的属性有:真实姓名,学号,年龄,性别,⼊学时间 • ⼀个课程实体包含的属性有:课程名 比特就业课 • ⼀个学⽣可以选修改多⻔课程,⼀⻔课程也可以被多名学⽣选修改,所以学⽣与课程之间是多对多 关系,⽤E-R图表⽰如下:
• 对于多对多关系,可以使⽤中间表进⾏录,⽐如⼀个学⽣参加了某⼀⻔课程的考试得到了相应的成绩,⽤E-R图表⽰如下:
实体间⼀对⼀关系只需要在其中⼀个实体中添加对另⼀个实体的关联字段即可
# 在⽤⼾实体中添加对账⼾实体的关联
drop table if exists users;
create table users (
id bigint primary key auto_increment,
name varchar(20) not null,
nickname varchar(20),
phone_num varchar(11),
email varchar(50),
gender tinyint(1),
account_id bigint//account里的id
);
drop table if exists account;
create table account (
id bigint primary key auto_increment,
username varchar(20) not null,
password varchar(32) not null
);
# 在账⼾实体中添加对⽤⼾实体的关联
drop table if exists users;
create table users (
id bigint primary key auto_increment,
name varchar(20) not null,
nickname varchar(20),
phone_num varchar(11),
email varchar(50),
gender tinyint(1)
);
drop table if exists account;
create table account (
id bigint primary key auto_increment,
username varchar(20) not null,
password varchar(32) not null,
users_id bigint//user表里的id
);
分别创建学⽣表和班级表,在学⽣表中添加⼀列与班级表建⽴关联关系
# 班级表
drop table if exists class;
create table class (
id bigint primary key auto_increment,
name varchar(20)
);
# 学⽣表
drop table if exists student;
create table student (
id bigint primary key auto_increment,
name varchar(20) not null,
sno varchar(10) not null,
age int default 18,
gender tinyint(1),
enroll_date date,
class_id bigint
);
学⽣可以选修多⻔课程,每⻔课程考试后会产⽣⼀个成绩,两个表之间没有办法直接建⽴关系,所以 要⽤到⼀个记录成绩的中间表
# 学⽣表
drop table if exists student;
create table student (
id bigint primary key auto_increment,
name varchar(20) not null,
sno varchar(10) not null,
age int default 18,
gender tinyint(1),
enroll_date date,
class_id bigint,
foreign key (class_id) references class(id)
);
# 课程表
drop table if exists course;
create table course (
id bigint primary key auto_increment,
name varchar(20)
);
# 分数表
drop table if exists score;
create table score (
id bigint primary key auto_increment,
score float,
student_id bigint,
course_id bigint,
foreign key (student_id) references student(id),
foreign key (course_id) references course(id)
);