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

news2024/11/24 18:38:54

目录

📖前言

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://www.coloradmin.cn/o/644518.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

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

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

《面试1v1》Map

我是 javapub,一名 Markdown 程序员从👨‍💻,八股文种子选手。 《面试1v1》 连载中… 面试官: 小伙子,又来挑战你了。听说你对Java集合中的Map也很在行? 候选人: 谢谢夸奖,Map这个接口的确非常重要且强大…

SpringMVC原理分析 | JSON、Jackson、FastJson

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! JSON JSON(JavaScriptObject Notation,JS对象简谱)是一种轻量级的数据交换格式。它基于 ECMAScript(European Computer…

无自注意力照样高效!RIFormer开启无需token mixer的Transformer结构新篇章

©PaperWeekly 原创 作者 | 岳廷 研究方向 | 计算机视觉 引言 论文地址: https://openaccess.thecvf.com/content/CVPR2023/papers/Wang_RIFormer_Keep_Your_Vision_Backbone_Effective_but_Removing_Token_Mixer_CVPR_2023_paper.pdf 问题:Vision …

如何将代码中的相关调试信息输出到对应的日志文件中

一、将调试信息输出到屏幕中 1.1 一般写法 我们平常在写代码时&#xff0c;肯定会有一些调试信息的输出&#xff1a; #include <stdio.h> #include <stdlib.h>int main() {char szFileName[] "test.txt";FILE *fp fopen(szFileName, "r")…

R语言 tidyverse系列学习笔记(系列5)dplyr 数据分析之across

成绩单 score install.packages("dplyr") library(dplyr)install.packages("tibble") library(tibble)install.packages("stringr") library(stringr)score tibble(IDc("1222-1","2001-0","3321-1","4898-…

MySQL(八):排序与分页

排序与分页 前言一、排序数据1、排序规则2、单列排序3、多列排序 二、分页1、背景2、实现规则3、拓展 前言 本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识&#xff0c;有兴趣的小伙伴可以关注博主&#xff01;也许一个人独行&#xff0c;可以走的很快&…

从零开始Vue项目中使用MapboxGL开发三维地图教程(三)添加全屏,缩放旋转和比例控制面板以及自定义图标、标记点击弹窗、地图平移等功能

文章目录 1、添加各种控制面板1.1、添加全屏1.2、缩放旋转控制1.3、比例尺 2、获取并显示鼠标移动位置的经纬度坐标3、添加图标3.1、添加图片图层的图标3.2、添加带有标记的自定义图标3.3、悬停时显示弹出窗口 1、添加各种控制面板 1.1、添加全屏 //添加全屏控制this.map.addC…

管理类联考——逻辑——知识篇——第一章 性质命题

第一章 性质命题&#xff08;最基础&#xff0c;最难*****&#xff09; 一、性质命题定义&#xff08;必考&#xff09; 判断事物具有或不具有某种性质的命题。 二、性质命题的四种基本形式 全称肯定&#xff1a;①所有的A都是B 全称否定&#xff1a;②所有的A不是B 特称肯…

Nature子刊:光遗传在绒猴执行检测任务中的行为效应

狨猴体型小&#xff0c;具有巨大的基因修饰潜力&#xff0c;并可表现复杂的行为&#xff0c;已经成为神经科学领域的一个关键模型。 德国恩斯特斯特朗格曼神经科学研究所与马克斯普朗克学会的研究人员设计了一种轻质的、3D打印的植入物&#xff0c;利用高密度硅基微电极阵列&am…

Monorepo vs. Microrepo: 选择适合你的代码仓库策略

简介 在软件开发领域&#xff0c;选择合适的代码仓库策略对于优化协作、可扩展性和代码质量至关重要。Monorepo和Microrepo是两种流行的方法&#xff0c;它们提供了各自的优势和考虑因素。本文将探讨这两种策略的特点&#xff0c;解释为何不同的公司选择不同的选项&#xff0c;…

基于Hexo和Butterfly创建个人技术博客,(5) 使用Hexo的Tags Plugin插件增强博客文章内容和视觉表现力

Hexo官司网查看 这里 注意&#xff1a; Tags语法是Hexo插件提供的&#xff0c;是非标准语言&#xff0c;写文章时要注意以下几点&#xff1a; 用于在文章中快速插入特定的内容&#xff0c;作用等同于其它语言&#xff0c;可理解为一种增强版本的markdown&#xff1b;可混合Mark…

Linux系统编程学习 NO.7 ——sudo配置、编译器的使用

引言&#xff1a; 现在是北京时间2023年6月14日8点16分&#xff0c;期末考试在即&#xff0c;重心可能得转移到考试上了。不过想到马上就可以回家陪家人过端午节&#xff0c;还是非常开心的。放暑假了就可以好好陪家人了。尝试一下换个环境复习吧&#xff0c;洗漱一下就去图书…

智见|比亚迪廉玉波:2023年销量目标300万辆

营收4240亿元&#xff0c;同比增长96%&#xff1b;归属上市公司股东净利润166亿元&#xff0c;同比增长445.86%&#xff1b;累计销售186.85万辆&#xff0c;同比增长152.5%……这是2022年比亚迪的成绩单。 据比亚迪披露&#xff0c;仅2022年一年新能源汽车的销量&#xff0c;就…

【重要】MThings V0.5.0更新要点

再见了BUG&#xff0c;为了改善质量&#xff0c;我们已修正了一些问题&#xff0c;以便您能继续富有成效且令人敬畏。 下载地址&#xff1a; http://gulink.cn/download 01. [新增]支持数据网关功能。 数据网关功能提供协议转换和数据汇聚功能&#xff0c;可实现不同的通道类型…

1--Gradle入门 - 简介、安装、目录结构、创建项目

1--Gradle入门 - 简介、安装、目录结构、创建项目 Gradle 官网 Gradle官网地址&#xff1a;Gradle Build Tool Gradle官方下载安装教程页面&#xff1a;https://gradle.org/install/ Gradle官方用户手册&#xff1a;https://docs.gradle.org/current/userguide/userguide.html …

4--Gradle入门 - 创建普通的web工程

4--Gradle入门 - 创建普通的web工程 前言 上一篇&#xff0c;我们已经创建了java工程&#xff0c;本篇章再来创建web工程。 “ 其实没啥用&#xff0c;还是研究如何部署 Springboot 环境就好了 ” 创建普通的web工程 1. 新建 gradle 管理的工程项目 1685862847224 2. 设置项目使…

前端构建工具的未来

本文作者系360奇舞团前端开发工程师 本文为翻译 原文标题&#xff1a;The Future Of Frontend Build Tools 原文作者&#xff1a;Alexander Joseph 原文链接&#xff1a;https://www.smashingmagazine.com/2022/06/future-frontend-build-tools/ 前端构建工具对现代前端开发者的…

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

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

数据库从业者在行业的变革下------越来越难

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…