(07)MySQL:表与表的关系

文章详细阐述了MySQL中三种主要的表关系:一对一,一对多(多对一),以及多对多,包括它们的数据关系、建表原则和使用场景。一对一关系要求从表外键列不能重复,适合于将常用和不常用信息分表存储。一对多关系中,从表的外键可以重复,常用于如母亲和孩子的关系。多对多关系则需要创建中间表来维护两个表之间的关联,如老师和学生的关系。
摘要由CSDN通过智能技术生成

1.一对一:从表外键列不能重复

数据关系:一张表的一条记录一定只能与另外一张表的一条记录进行对应;反之亦然。
建表原则:从表的外键指向主表的主键,形成主外键关系
主表
 主键:具有唯一性
从表
 主键:具有唯一性
 外键:外键列不能重复(要么外键唯一,要么外键是主键)
使用场景
有学生表:姓名,性别,年龄,身高,体重,婚姻状况,籍贯,家庭住址,紧急联系人
ID(P)姓名性别年龄身高体重婚姻状况籍贯<家庭住址/td>紧急联系人
1
2
表设计成以上这种形式:符合要求。其中姓名,性别,年龄,身高,体重属于常用数据;但是婚姻状况,籍贯,家庭住址,紧急联系人属于不常用数据。如果每次查询都是查询所有数据,不常用的数据就会影响效率,实际又不用。
解决方案:将常用的和不常用的信息分离存储,分成两张表
常用信息表
ID(P)姓名性别年龄身高体重
1
2
不常用信息表
ID(P)婚姻状况籍贯家庭住址紧急联系人
1
2
一个常用表中的一条记录,永远只能在一张不常用表中匹配一条记录;反过来,一个不常用表中的一条记录在常用表中也只能匹配一条记录:一对一关系。
在实际的开发中应用不多,因为一对一可以创建成一张表。

2.一对多 (多对一):从表外键列可以重复

数据关系:一张表中有一条记录可以对应另外一张表中的多条记录;但是反过来,另外一张表的一条记录只能对应第一张表的一条记录。这种关系就是一对多或者多对一。
建表原则:从表的外键指向主表的主键,形成主外键关系
主表
 主键:具有唯一性
从表
 主键:具有唯一性
 外键:外键列可以重复(在多的一方创建一个字段,字段作为外键指向一的一方的主键)。
使用场景:母亲和孩子
母亲与孩子的关系:母亲、孩子两个实体
妈妈表
ID(P)姓名年龄性别
1
2
孩子表
ID(P)姓名年龄性别
1
2
以上关系:一个妈妈可以在孩子表中找到多条记录(也有可能是一条);但是一个孩子只能找到一个妈妈:是一种典型的一对多关系
但是以上设计:解决了实体问题,没有解决关系问题(孩子找不出妈妈,妈妈也找不出孩子)。
解决方案:在孩子表中增加一个字段指向妈妈表,因为一个孩子只能有一个妈妈
妈妈表
ID(P)姓名年龄性别
1
2
孩子表
ID(P)姓名年龄性别妈妈ID
1
2

分类和商品:一个分类对应多个商品,一个商品只能属于某一个分类。
部门和员工:一个部门可以有多个员工,一个员工只能属于某一个部门。

3.多对多:需要创建中间表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键

数据关系:一张表中(A)的一条记录能够对应另外一张表(B)中的多条记录;同时B表中的一条记录也能对应A表中的多条记录:多对多的关系。
建表原则:需要创建中间表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键。
主表(A表、B表)
 主键:具有唯一性
从表(中间表)
 主键:中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键。
应用场景:老师和学生
老师表
T_ID(P)姓名性别
1A
2B
学生表
S_ID(P)姓名性别
1张三
2小芳
以上设计:实现了实体设计,但是没有维护实体关系。
一个老师教过多个学生,一个学生也可以被多个老师教过。
解决方案:新增加一张中间表,用于维护两张表之间的关系
中间表
ID(P)T_ID(老师)S_ID(学生)
111
212
321
422
增加中间表之后,中间表与老师表形成了一对多的关系,而且中间表是多表,维护了能够唯一找到一表的关系;同样的,学生表与中间表也是一个一对多的关系。一对多的关系可以匹配到关联表之间的数据。

学生找老师:找出学生id->中间表寻找匹配记录(多条)->老师表匹配(一条)
老师找学生:找出老师id->中间表寻找匹配记录(多条)->学生表匹配(一条)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值