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) | 姓名 | 性别 | |||||||
1 | A | 男 | |||||||
2 | B | 女 | |||||||
学生表 | |||||||||
S_ID(P) | 姓名 | 性别 | |||||||
1 | 张三 | 男 | |||||||
2 | 小芳 | 女 | |||||||
以上设计:实现了实体设计,但是没有维护实体关系。 一个老师教过多个学生,一个学生也可以被多个老师教过。 |
解决方案:新增加一张中间表,用于维护两张表之间的关系 中间表 | |||||||||
ID(P) | T_ID(老师) | S_ID(学生) | |||||||
1 | 1 | 1 | |||||||
2 | 1 | 2 | |||||||
3 | 2 | 1 | |||||||
4 | 2 | 2 | |||||||
增加中间表之后,中间表与老师表形成了一对多的关系,而且中间表是多表,维护了能够唯一找到一表的关系;同样的,学生表与中间表也是一个一对多的关系。一对多的关系可以匹配到关联表之间的数据。 |
学生找老师:找出学生id->中间表寻找匹配记录(多条)->老师表匹配(一条)
老师找学生:找出老师id->中间表寻找匹配记录(多条)->学生表匹配(一条)