数据库系列文章
目录
📖前言
本文讲解的是基本的表设计, 设计一般只有在有一定实际项目经验后, 才能深入了解, 博主也是在不断学习, 给大家先讲一下最基础的方法. 主要给大家讲一下实体与实体之间的对应关系.
🧐本文篇幅不多, 看完即可了解表的设计方法.
1. 基本步骤
在设计中, 如果只是一些简单的场景, 设计无从谈起, 因为其建表是比较明显的. 当遇到一些复杂需求时, 我们便需要考虑表该如何去设计了.
而简单来说, 就是根据需求, 把表应该是什么样子的, 给写出来, 有几个表, 每个表是干什么的, 每个表有几个字段, 都是用来描述什么的, 都是什么类型, 有什么约束等等都需要进行考虑.
而想要实现, 我们就先进行以下两步.
1.1 梳理清楚需求中的实体
在面向对象设计中, 这步叫做 "找对象", 而在数据库当中, 就叫做 "找实体", 就是需求中的咦嘻嘻额关键性质的名字.
比如我们现在需要实现一个教务管理系统:
- 要能管理所有学生的信息
- 要能管理所有教师的信息
- 要能管理所有作业的信息
- 要能管理所有课程的信息
- ...
而学生, 教师, 作业 , 课程就是教务管理系统中的实体. 很多时候, 每个实体就要有一个对应的表来进行表示
1.2 梳理清楚实体间的关系
我们还是用教务管理系统来举例:
实体之间的关系, 主要有三种:
- 一对一: 一个学生只能有一个账号, 而一个账号也只能供一个学生来使用.
- 一对多: 一个班级可以包含多个学生, 一个学生也只能处于一个班级.
- 多对多: 一个学生可以选择多个课程, 一个课程也可以提供给多个学生.
下面我们着重讲一下实体之间的是那种关系.
2. 实体间的三种关系
实体与实体之间的三种关系为, 一对一, 一对多, 多对多, 如果三种关系都不满足, 那么就是实体间没有关系
2.1 一对一
在本案例中, 一对一的关系是:
一个学生只能有一个账号, 而一个账号也只能供一个学生来使用.
那么我们如何设计表呢? 经过分析后可以有以下两种情况:
(1) 设计一张 accout - student 大表, 其中包含学生信息 + 账号信息
accout-student(accout_id, username, password, student_id, student_name ...)
(2) 设计两张表, 一张 student 表存放学生信息, 一张 account 表账号信息, 两张表相互关联
account(account_id, username, password, student_id)
student(student_id, student_name ...)
利用 student_id 来关联两个表, 不过还有一种关联方式:
account(account_id, username, password)
student(student_id, student_name, account_id ...)
下面这个是利用 account_id 进行关联的, 两种关联方式哪个更优呢?
如果当后续我们还要设计一张教师表, 采用第一种方法的话, 是不是得一直得在account表中添加内容, 而如果采用第二种方法, 我们直接在教师表中, 添加 account_id 字段, 即可直接与 account 表关联, 所以在设计时, 尽量采用第二种关联方式.
2.2 一对多
在本案例中, 一对多的关系是:
一个班级可以包含多个学生, 一个学生也只能处于一个班级.
这种情况, 也有两种典型的表示方式.
(1) 设计两张表, 一张 student 学生表, 一张 class 班级表, 在 class 表中弄一个数组或者列表来保存学生id
student(student_id, student_name)
class(class_id, class_name, student_idLIst)
但是要注意, 如果是在MySQL中的话, 是不能使用这种设计方式的, 因为在MySQL当中, 是没有数组类型的, 但是在有些数据库中, 是有数组类型的, 比如Redis, 此时就可以考虑使用这种设计方式.
(2) 设计两张表, 一张 student 学生表, 一张 class 班级表, 在 student 表中设置一个字段 class_id 来存储班级信息
student(student_id, student_name, class_id)
class(class_id, class_name)
将两表的 class_id 进行关联, 这样我们就将 student 表中的每一个学生都绑定了一个班级.
2.3 多对多
在本案例中, 多对多的关系是:
一个学生可以选择多个课程, 一个课程也可以提供给多个学生.
这种情况, 我们一般需要一张 student_course 关联表(中间表), 用来关联学生和课程之间的关系
student(student_id, student_name)
course(course_id, course_name)
student_course(student_id, course_id)
将关联表中的id信息, 分别与 student 和 course 相关联, 就可以实现多对多的关系了.
🎉小结ending
✨一般来说, 只要实体和关系都明确了, 表的设计也就差不多了, 如果实体比较多, 关系比较复杂, 还可以再画一个实体关系图(ER图)来表示这个关系.
✨ 想了解更多数据库知识, 可以打开博主的数据库专栏目录↓小白的数据库学习之路
http://t.csdn.cn/Fh557
✨感谢你们的耐心阅读, 博主本人也是一名学生, 也还有需要很多学习的东西. 写这篇文章是以本人所学内容为基础, 日后也会不断更新自己的学习记录, 我们一起努力进步, 变得优秀, 小小菜鸟, 也能有大大梦想, 关注我, 一起学习.
再次感谢你们的阅读, 你们的鼓励是我创作的最大动力!!!!!