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

news/2024/7/5 8:05:09

目录

📖前言

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

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

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


http://lihuaxi.xjx100.cn/news/1243004.html

相关文章

第五十六章 镜像中断程序 - 计划外停机程序

文章目录 第五十六章 镜像中断程序 - 计划外停机程序计划外停机程序备份故障转移成员的计划外中断具有自动故障转移的主要故障转移成员的计划外中断未发生自动故障转移时主要故障转移成员的计划外中断手动强制故障转移成员成为主要成员 第五十六章 镜像中断程序 - 计划外停机程…

基于SpringCloud+Vue房产销售平台的设计与实现

博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架下…

原码,反码,补码,移码

使用与理解 原码、反码、补码和移码是在计算机中表示有符号整数的方法。它们是为了处理正负数的运算和表示而设计的。下面我会逐个解释这些概念,并说明它们的使用和理解。 原码(Sign-Magnitude Representation): 原码是最简单的表…

【Docker】docker部署springboot+vue+mysql+nginx前后端分离项目【部署实战篇】

文章目录 0、安装docker并准备一个springboot-vue前后端分离项目前后端打包放到服务器上1、docker 安装jdk2、docker 安装mysql通过Docker命令进入Mysql容器内部初始化数据sqlDbx连接查看 3、docker build构建后端镜像修改配置数据库JDBC链接IP为虚拟机服务器IPmaven clean pac…

认识ASP.NET MVC的5种AuthorizationFilter

一、IAuthorizationFilter 所有的AuthorizationFilter实现了接口IAuthorizationFilter。如下面的代码片断所示,IAuthorizationFilter定义了一个OnAuthorization方法用于实现授权的操作。作为该方法的参数filterContext是一个表示授权上下文的AuthorizationContext对…

基础知识学习---牛客网C++面试宝典(八)操作系统--第三节

1、本栏用来记录社招找工作过程中的内容,包括基础知识学习以及面试问题的记录等,以便于后续个人回顾学习; 暂时只有2023年3月份,第一次社招找工作的过程; 2、个人经历: 研究生期间课题是SLAM在无人机上的应…

web动画(Animation) - 过渡效果transition

内容目录: 过渡动画;过渡动画的属性; 一、过渡动画 过渡(transition)作用:- 通过过渡可以指定一个属性发生变化时的切换方式- 通过过渡可以创建一些非常好的效果,提升用户的体验现在我们通过一…

MAVEN - 使用maven-dependency-plugin的应用场景是什么?

简述 maven-dependency-plugin是MAVEN的一个插件。 作用 该插件主要用于管理项目中的依赖,使用该插件可以方便地查看、下载、复制和解压缩依赖,还支持生成依赖树和依赖报告。 功能 该插件有很多可用的GOAL,大部分与依赖构建、依赖分析和依…