mysql 表关系传递,Mysql-05--多表设计--范式--表关系

多表设计

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

范式

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

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

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

第一范式

确保每列保持,原子性,不可再分

c1961b9e831e71dcc1af1d2b61eb88be.png

第二范式:

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

第三范式

消除传递依赖,方便理解,可以看作消除冗余

b0305bf121e1b1becf24345b9fcb71a4.png

表之间的关系

一对一 一个学生只能对应一个年级

一对多

多对一 多个学生对应一个年纪

多对多

外键

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

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

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

)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值