总结
判断实体间关系只需要问自己两个问题:
1. 实体A包含实体B吗?
2. 实体B包含实体A吗?
- 都回答‘是’–>M:N
- 都回答‘否’–>1:1
- 答案不同 –> 1:N
当实在是不能分辨两个实体间的关系是 一对多 还是 多对多 我们不妨用假设法。
- 我们先假设实体间是一对多,想想我们的实现业务逻辑
- 再假设他们之间的关系是多对多,想想我们的实现业务逻辑
- 相信最终你会选出一个相对简洁的业务逻辑去实现。
今天设计数据库标间关系的是偶蒙圈了。在这里调整一下思路。
一、数据库实体间关系总共有三种:
△ | 实体A | 实体B |
---|---|---|
– | 1 | 1 |
– | 1 | N |
– | M | N |
1:1 (独生子家庭)一个儿子只有有一个父亲,一个父亲只有个一个儿子
1:N 一个宇宙有多个星星,每一个星星都只存在于一个宇宙中
M:N 一个老师有多个学生,一个学生有多个老师
二、描述 1:1 关系我们用两个表就可以了
每一列表示一个表中包含的字段
儿子 | 父亲 | |
---|---|---|
ID | : | ID |
姓名 | : | 姓名 |
年龄 | : | 年龄 |
父亲 | : | 儿子 |
三、描述M:N关系 必须三个表
教师 | 教师关联学生 | 学生 |
---|---|---|
ID | ID | ID |
姓名 | 学生ID | 年龄 |
身份证 | 教师ID | 身份证 |
这可以解决数据流向问题:
数据流是
– “宇宙–>星星 ”教师表+关联表–>找到一个老师的所有学生
– “星星 –> 宇宙”学生表+关联表–>找到一个学生的所有老师
四、描述 1:N 必须要三个表才可以?——其实不是,两个表就够了。
每一列表示一个表中包含的字段
3.1、对于1:N关系描述
表现方式(三个表)
宇宙 | 宇宙关联星星 | 星星 |
---|---|---|
ID | ID | ID |
年龄 | 宇宙ID(一直是同一个值) | 年龄 |
直径 | 星星ID | 直径 |
- 探究
又觉得 在 “宇宙关联星星”表中 ‘宇宙ID’一直都是同一个值
那么我们用两个表好像也可以表示 1:N 的实体间关系。
因为开发者在文档中注明这种 1:N 关系的存在就足够对表做出操作了。
不管 数据流是- “宇宙–>星星 ”
- “星星 –> 宇宙”
不是吗?
宇宙 | : | 星星 |
---|---|---|
ID | : | ID |
年龄 | : | 年龄 |
直径 | : | 直径 |
3.2、对于1:N关系解决
事实上,我在1:N关系上出现的问题是没有真正的区分清楚
我所处理的关系是否为一对多关系。
怎么用一句话说出来这事这么简单。
难的是在业务逻辑中的“区分”。