这里是修真院后端小课堂,每篇分享文从

【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】

八个方面深度解析后端知识/技能,本篇分享的是:

【 什么是实体表,什么是关系表,一对多和多对多应该怎么设计表?】

大家好,我是IT修真院深圳分院第13期的学员,一枚正直纯洁善良的java程序员
今天给大家分享一下,修真院官网Java任务3,深度思考中的知识点————什么是实体表,什么是关系表,一对多和多对多应该怎么设计表?

1.背景介绍
做一个项目,DB设计是必不可少的,而表与表之间不都是独立的,比如一个学生信息表与教师表就应该存在某种对应的关系,所以我们有必要了解表之间的关系。

2.知识剖析
什么是实体表,什么是关系表?
(1)实体表就是对应实体对象的表,比如:学生表,老师表等,表里存放这他们各自的信息。
(2)关系表是表示表与表之间的数据关系,比如:每个学生表里的学生都对应着教师表里的一个或者多个教师,我们可以用另外的表存放他们之间的关系,当我们需要他们的某些信息时可以根据关系表里的关系查出来。

什么是一对一、一对多和多对多?
(1)一对一、一对多和多对多都是指数据表与表中的数据关系,而不是指表与表之间的关系。
(2)一对一:一个学生对应一个学生档案材料,或者每个人都有唯一的身份证编号。
(3)一对多:一个学生只属于一个班,但是一个班级有多名学生。
(4)多对多:一个学生可以选择多门课,一门课也可以对应着多名学生。

3.常见问题
一对多和多对多应该怎么设计表?

解决方案
1.一对多关系处理:
比如一个班级对应多名学生,这时候我们可以在学生信息表里面加一个字段,用来表示学生对应的班级。
这里不建议通过添加主外键约束,因为这会让你以后在修改和删除表的时候很麻烦。

2.多对多关系处理:
通过学生选课了解多对多问题的处理:每个学生对应多门课,每门课对应多个学生。
(1)在多对多中在一个表中添加一个字段就行不通了,所以处理多对多表问题时,就要考虑建立关系表了。
(2)仅仅对应这里的举例而言,关系表中有三个字段,id,学生id,课程id
(3)根据学生查找课程:根据学生名字查询对应的多个课程。
(4)根据课程查找学生:根据课程名字查询对应的多个学生。

4.编码实战
我们针对多对多关系来演示一下
新建学生表student

clipboard.png

然后建一个课程表course

clipboard.png

接着建一个关系表sc

clipboard.png

最后演示一下
根据课程查询学生

select student_name from student where student.id in (select student_id from sc where course_id in(select id from course where course_name='舞蹈' ));
结果如下

clipboard.png

根据学生查询课程

select course_name from course where course.id in(select course_id from sc where student_id=(select id from student where student_name='李四') );
结果如下

clipboard.png

5.扩展思考

6.参考文献
CSDN、百度百科、师兄们提供的资料

7.更多讨论
(1)为什么不建议通过添加主外键约束 ?
因为在数据库层面通过使用外键的方式进行“硬绑定”,会带来很多额外的资源消耗来进行一致性和完整性校验,即使很多时候我们并不需要这个校验。
所以一般不建议在数据库中使用外键约束来保证数据的一致性和完整性。

(2)查询语句中where … in…怎么用?
where 字段 in (列子查询);
这里,列子查询可能是“多个值”,虽然查询的输出结果是“一列”的,但我们要理解为是“多个值的列表”,其相当于:
where 字段 in (值1,值2,…);比如: where age in (18, 28, 38); 表示age为其中任意一个就可以
(3)查询出来的结果,在mybatis中怎么保存?
可以自定义一个集合用来存放查询出来的结果。

8.鸣谢:
感谢修真院的师兄和CSDN博客上相关的作者,此教程是在他们之前技术分享的基础上完善而成。

9.结束语:
今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

 


用户bPbdDlb
422 声望36 粉丝