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

多表设计

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

范式

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

目前有五种范式:第一范式(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 外键约束名

注意事项:

  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)
)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值