0
点赞
收藏
分享

微信扫一扫

Mysql-05--多表设计--范式--表关系


多表设计

设计表时,先确定表存储那类的信息,学生表,定义类,数据类型,约束

范式

为了建立冗余较小,结构合理的数据库,设计数据库时必须遵循一定的规则

目前有五种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)

一般的数据库满足第三范式就行.

第一范式

  • 确保每列保持,原子性,不可再分
  • Mysql-05--多表设计--范式--表关系_java

第二范式:

  • 由主键, 其他字段依赖于主键

第三范式

  • 消除传递依赖,方便理解,可以看作消除冗余
  • Mysql-05--多表设计--范式--表关系_mysql_02

表之间的关系

  • 一对一 一个学生只能对应一个年级
  • 一对多
  • 多对一 多个学生对应一个年纪
  • 多对多

外键

外键:引用另外一个数据表的某条记录

外键列类型与主键列类型保持一致

数据表之间的关联/引用关系主要依靠具体的主键(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 外键约束名​

注意事项:

  1. 当表中没有对应的记录时,不能将记录添加到从表
  2. 不能更改主表中的值而导致从表的记录孤立
  3. 从表存在与主表对应的记录,不能从主表中删除该行
  4. 删除主表前,先删除从表

多对多:

设计一个表关系,用来存储多个表之间的关系

可以拆分为 两个多对一 两个一对多

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)
)


举报

相关推荐

0 条评论