- 假设有 A,B 两个实体,首先判断一个 A 对应几个 B,再判断一个 B 对应几个 A:
- 如果
两边都是 1:1
,那么 A 与 B 就是一对一
的关系;- 如果
两边只有一个 1:n
,那么 A 与 B 就是一对多
的关系;- 如果
两边都是 1:n
,那么 A 与 B 就是多对多
的关系;
- Course:课程表
- Location: 位置表
- Teacher:老师表
- Trainee:学员表
- TrainingEvent:排课表
- Registration:报名表
一对多关系
举例:部门和员工的对应关系 :
- 正过来看,("1")一个部门里面可以有多个员工("n")
- 反过来看一一对应:一个员工只能对应一个部门
由于满足上面两条,所以一对多关系成立,部门是 1 员工是 n
策略: 在“多”的一方添加外键,指向“一”的一方的主键。
如何在数据库中操作?请看:在MySQL中添加外键的几种方式(一对多关系)
多对多关系
举例:教师与学生
- 正过来看,("1")一个老师能教多名学生("n")
- 反过来看,("1")一个学生有多个老师("n")
策略:增加一张表,专门维护两张表之间的关系。
增加中间表之后:教师表("1") 与 中间表("n") 形成了一对多
的关系,而且中间表维护了唯一对应的找到表中数据的关系。
同样的 学生表("1") 与 中间表("n") 也是一对多
的关系。一对多的关系可以匹配到关联表中的数据。
如何在数据库中操作?请看:在MySQL中建立多对多关系的映射(建立中间表)
总结
总结, 判断一对多还是多对一,主要取决于反过来看(也就是第二条)
- 正反均是一对一 :一对一
- 正是一对多,反是一对一 :一对多
- 正是一对一,反是一对多 :多对一(这一条和一对多本质上是一类,只不过是反过来理解罢了)
- 正反均是一对多 :多对多
- 一对多:“多”方所属“一”方
- 多对多:拥有多个对方
参考: