多表设计
设计表时,先确定表存储那类的信息,学生表,定义类,数据类型,约束
范式
为了建立冗余较小,结构合理的数据库,设计数据库时必须遵循一定的规则
目前有五种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)
一般的数据库满足第三范式就行.
第一范式
确保每列保持,原子性,不可再分
第二范式:
由主键, 其他字段依赖于主键
第三范式
消除传递依赖,方便理解,可以看作消除冗余
表之间的关系
一对一 一个学生只能对应一个年级
一对多
多对一 多个学生对应一个年纪
多对多
外键
外键:引用另外一个数据表的某条记录
外键列类型与主键列类型保持一致
数据表之间的关联/引用关系主要依靠具体的主键(primary key) 和外键(foreign key)建立起来
– 弱关联关系 表与表之间的关系时人为定义的 表结构中并没有实际的联系
– 强关联关系 给外键添加约束 强制让外键对应的主键产生关系 (外键对应的是另一个表的主键)
添加外键
create table score(
cid int not null auto_increment primary key,
score int,
sid int,
CONSTRAINT 约束名 foreign key(sid) references student(sid)
);
alter tale 表名 add [constraint 约束名] froeign key(外键列) REFERENCES 关联表(主键)
删除外键
alter table 表名 drop froeign key 外键约束名
注意事项:
当表中没有对应的记录时,不能将记录添加到从表
不能更改主表中的值而导致从表的记录孤立
从表存在与主表对应的记录,不能从主表中删除该行
删除主表前,先删除从表
多对多:
设计一个表关系,用来存储多个表之间的关系
可以拆分为 两个多对一 两个一对多
CREATE TABLE 1student_1course(
id INT PRIMARY KEY AUTO_INCREMENT,
stu_num INT,
course_id INT,
CONSTRAINT stu_num_fk FOREIGN KEY(stu_num ) REFERENCES 1_student(num),
CONSTRAINT course_id_fk FOREIGN KEY(course_id ) REFERENCES 1_course(id)
)
完成代码
# 多表的设计
/*
设计表时,先确定表存储那类的信息, 学生表, 定义列,数据类型,约束
学生表
老师表
课程表
需要存储不同的信息--只存储一类信息
学生表
名族 年纪
老师
民族,年纪
*/
/*
第一范式
确保每列保持 原子性 不可再分
第二范式
有主键 其他字段依赖于主键
第三范式
消除传递依赖,方便理解,可以看作消除冗余
表之间的关系
一对一 一个学生只能对应一个年级
一丢多
多对一 多个学生对应一个年纪
多对多
`` 设计一个关系表,用来储存多个表之间的关系
*/
## 学生表 年纪表 老师表 课程
/*
学生表
学号 姓名 性别 手机号 年纪编号 (外键) 课程编号
年纪
年纪标号 年纪名称 年纪介绍
课程号
课程编号 课程名称 课程介绍
*/
CREATE TABLE 1_grade(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10),
gdesc VARCHAR(50)
)
SELECT * FROM 1_grade
CREATE TABLE 1_student(
num INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10),
sex VARCHAR(1),
phone VARCHAR(11),
grade_id INT,
reg_time DATETIME
-- 弱关联关系 表与表之间的关系时人为定义的 表结构中并没有实际的联系
-- 强关联关系 给外键添加约束 强制让外键对应的主键产生关系 (外键对应的是另一个表的主键)
ALTER TABLE 1_student ADD CONSTRAINT grade_id_kf FOREIGN KEY(grade_id ) REFERENCES 1_grade(id)
#多对多
#`` 设计一个关系表,用来储存多个表之间的关
# 可以拆分为 两个多对一 两个一对多
CREATE TABLE 1student_1course(
id INT PRIMARY KEY AUTO_INCREMENT,
stu_num INT,
course_id INT,
CONSTRAINT stu_num_fk FOREIGN KEY(stu_num ) REFERENCES 1_student(num),
CONSTRAINT course_id_fk FOREIGN KEY(course_id ) REFERENCES 1_course(id)
)
CREATE TABLE 1_course(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10),
vdesc VARCHAR(10)
)