MySQL增加范式关系_mysql关系(二维表)的设计规范,范式

范式,NF,normal format,就是指对表的结构的要求!

目的:1,规范结构!2,减少数据冗余!

第一范式,1NF,字段原子性

要求字段不能再分,要求字段的原子性

2357724e715371b8046750b75c9ec5b2.png

第二范式,2NF,非部分依赖

增加唯一主键即可!ID

范式的要求,是逐渐递增!

在满足 了 第一范式的前提下,不能出现部分依赖!

部分依赖指的是:普通字段对 主键 是完全依赖的,而不应该是依赖主键的一部分!

依赖:可以通过那个字段去决定另一个字段

因此,出现主键部分依赖的前提是,出现复合主键!

d90811d9bec0fdd23de25d3ad96762a5.png

其中代课时间,开始和结束时间,没有部分依赖!称之为完全依赖于主键:

但是,性别,依赖于讲师 字段 即可!

讲师字段是主键的一部分!因此称之为性别 部分依赖于 主键

ff51b4f8e3fefbf72195c62b27b482d1.png

因此,该表不符合第二范式!

怎么做?

消灭复合主键即可!增加一个唯一字段的主键即可。增加一个与业务逻辑毫无关系的,唯一的ID主键,int unsigned primary key auto_increment

bee3b98022ba994625799630cc7aafef.png

第三范式,3NF,非依赖传递

在满足第二范式的前提下,取消传递依赖,就是第三范式!

传递依赖:如果字段B对字段A有依赖,而字段C对字段B存在依赖。则出现了传递依赖!

讲师依赖于ID,而性别依赖于讲师。

班级依赖于ID,而教室依赖于班级。

c3e9314885033cf628fbb69b2124f08e.png

称之为传递依赖!

解决,要保证所有的字段都完全依赖于主键,而不依赖于其他字段!

将独立的实体信息,使用独立的关系(二维表)进行保存!

分别增加讲师,班级表,将代课信息内的讲师和班级信息拆分出:

e4da356204a6efe714766ffb09d328de.png

总结:

每个实体建立一个表,为每个表增加一个主键ID即可!

一个实体表应该如何设计

实体之间的关系的设计

多个是体表应该如何设计!

实体之间存在哪些关系?

班级,学生两类实体!

一对多,多对一,1:N, N:1

班级,讲师两类实体!

多对多,M:N

学生常用信息,学生不常用信息

一对一,1:1

如何设计?

多对一,一对多

在多的那端(那个表内),增加一个字段,用于保存于当前记录相关联的一端记录的主键!

0af3772f4a2c3da01b6182d98ade7799.png

多对多

edef3bad4258d8c52149aee5603c2204.png

增加一个专门管理关联的表,使 班级与讲师都与关连表存在联系。从而 是两个实体间有多对多的关系!

e58f71ab8f08146700efbdad1b00fde1.png

因此,一个多对多,会拆分成两个多对一!

一对一

3b24bb060d3da2c5daf9fcc65c05e8e1.png

可见,两个表之间存在相同的主键ID即可!

外键约束

约束的作用,是用于保证数据的完整性或者合理性的工具!

外键:foreign key,当前表内,指向其他表的主键的字段,称之为外键!

6e3d2a1668163f08c73f1eec73a786f6.png

外键约束:用于限制相关联的记录在逻辑上保证合理性的约束称之为外键约束!

约束,不是字段。

建立班级表

97fc2a2a8d0080238d7d43b402994fc5.png

再创建学生表

99b59a5df6246a8397491e737e1354bf.png

看看删除班级的情况:

f2230dba2e01f6b45231816b0ed0031b.png

出现了不合理数据:

此时,可以通过增加外键约束 的方式,来限制以上的操作!

增加外键

alter table 表名 add constraint 约束的名字 foreignkey 外键索引名字 (外键字段名) references 关联表名 (关联字段) [操作]

744d1e08b3657fec77b1b56820d924f5.png

再删除个试试:

95ff5e1bab1254ed497b4a55127ed7e7.png

注意:如果当前的数据,已经不符合所见约束关联,则创建失败!

删除外键

alter table table_name drop foreign_key 外键名字!

可以通过 show create table 查看约束的名字:

c16c555ff554cd3d6e8c8995a6dfb1f2.png

注意,外键约束与索引的关系:

如果需要在某个字段上,增加外键约束,那么需要该字段也同样有索引!如果该字段上,没有索引,此时,mysql会自动在该字段上增加一个普通索引!

a840cd79dcd9e663ccdf07c5386ddc34.png

可以选择指定外键约束的名字:

d06682fa8cf018c1fa1a107b99043eac.png

注意上面的外键约束自动建立的索引的名字,与外键的名字相同!

总结:在创建时:

1,外键 与 相应关联表的主键类型

2,已有数据,必须满足约束条件才可以!

3,可以使用constraint 关键字,为外键约束起名字!

约束操作

在对 父表(被关联的表)做操作时,有三种行为:

1,严格限制,拒绝操作。restrict

2,置 null,set null

3,级联操作,cascade

以上三个行为操作,会在主表记录被 删除或者 更新时被使用!

on delete set null

on update cascade

8943d99612cacabfae4dfa724e52cf03.png

d306ecc4050fbb516e5a0b4c657a60bd.png

更新时的级联操作:

只有在关联表的主键发生变化时,才会影响到从表的关联字段的变化!

f56399888b16f96e1406c3dc0d541a73.png

主表:被关联的

从表:发出关联的!

应该注意的问题:

关于,外键约束,只能在当前的 mysql的的 innodb 表类型(引擎)下才会生效!

4b87d4c74c14f07197853329696a20f1.png

外键,站在 php程序的角度,用到的不多!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值