【数据库必备知识】上手表设计

数据库系列文章

1. 零基础带你快速上手SQL语言
2. 玩转表及其数据
3. 上手表设计

4. 索引和事务

5. 最新版MySQL的JDBC编程

目录

📖前言

1. 基本步骤

1.1 梳理清楚需求中的实体

1.2 梳理清楚实体间的关系

2. 实体间的三种关系

2.1 一对一

2.2 一对多

2.3 多对多

🎉小结ending


📖前言

本文讲解的是基本的表设计, 设计一般只有在有一定实际项目经验后, 才能深入了解, 博主也是在不断学习, 给大家先讲一下最基础的方法. 主要给大家讲一下实体与实体之间的对应关系.

🧐本文篇幅不多, 看完即可了解表的设计方法.

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

✨感谢你们的耐心阅读, 博主本人也是一名学生, 也还有需要很多学习的东西. 写这篇文章是以本人所学内容为基础, 日后也会不断更新自己的学习记录, 我们一起努力进步, 变得优秀, 小小菜鸟, 也能有大大梦想, 关注我, 一起学习.

再次感谢你们的阅读, 你们的鼓励是我创作的最大动力!!!!!

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慧天城寻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值