【JavaWeb】Day41.MySQL概述——多表设计(案例)

2024-04-11 17:28

本文主要是介绍【JavaWeb】Day41.MySQL概述——多表设计(案例),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一对一

        一对一关系表通常是用来做单表的拆分,也就是将一张大表拆分成两张小表,将大表中的一些基础字段放在一张表当中,将其他的字段放在另外一张表当中,以此来提高数据的操作效率。

一对一的应用场景: 用户表(基本信息+身份信息)

基本信息:用户的ID、姓名、性别、手机号、学历

身份信息:民族、生日、身份证号、身份证签发机关,身份证的有效期(开始时间、结束时间)

        如果在业务系统当中,对用户的基本信息查询频率特别的高,但是对于用户的身份信息查询频率很低,此时出于提高查询效率的考虑,我就可以将这张大表拆分成两张小表,第一张表存放的是用户的基本信息,而第二张表存放的就是用户的身份信息。他们两者之间一对一的关系,一个用户只能对应一个身份证,而一个身份证也只能关联一个用户。

那么在数据库层面怎么去体现上述两者之间是一对一的关系呢?

       其实一对一我们可以看成一种特殊的一对多。同样我们也可以通过外键来体现一对一之间的关系,我们只需要在任意一方来添加一个外键就可以了。

一对一 :在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)

多对多

       多对多的关系在开发中属于也比较常见的。比如:学生和老师的关系,一个学生可以有多个授课老师,一个授课老师也可以有多个学生。在比如:学生和课程的关系,一个学生可以选修多门课程,一个课程也可以供多个学生选修。

案例:学生与课程的关系

- 关系:一个学生可以选修多门课程,一门课程也可以供多个学生选择

- 实现关系:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键

案例

下面通过一个综合案例加深对于多表关系的理解,并掌握多表设计的流程。

需求:

 1.页面原型-分类管理

        分类的信息:分类名称、分类类型[菜品/套餐]、分类排序、分类状态[禁用/启用]、分类的操作时间(修改时间)。

2.页面原型-菜品管理

         菜品的信息:菜品名称、菜品图片、菜品分类、菜品售价、菜品售卖状态、菜品的操作时间(修改时间)。

3.页面原型-套餐管理

套餐的信息:套餐名称、套餐图片、套餐分类、套餐价格、套餐售卖状态、套餐的操作时间。 

分析 

  • 分析分类与菜品之间是什么关系?

一对多关系。一个分类下会有多个菜品,而一个菜品只能归属一个分类。

设计表原则:在多的一方,添加字段,关联属于一这方的主键。

  • 分析套餐与菜品之间是什么关系?

多对多关系。一个套餐下会有多个菜品,而一个菜品也可以出现在多个套餐中。

设计表原则:创建第三张中间表,建立两个字段分别关联菜品表的主键和套餐表的主键。

  • 分析分类和菜品之间的关系?

一对多的关系。已分类下有多个不同套餐,而一个套餐只能属于一个分类。

设计表原则:在多的一方,添加字段,关联属于一这方的主键。

分析页面原型及需求文档后,我们获得:

  •  分类表

  - 业务字段:分类名称、分类类型、分类排序、分类状态

  - 基础字段:id(主键)、分类的创建时间、分类的修改时间

  •  菜品表

  - 业务字段:菜品名称、菜品图片、菜品分类、菜品售价、菜品售卖状态

  - 基础字段:id(主键)、分类的创建时间、分类的修改时间

  •  套餐表

  - 业务字段:套餐名称、套餐图片、套餐分类、套餐价格、套餐售卖状态

  - 基础字段:id(主键)、分类的创建时间、分类的修改时间

表结构之间的关系:

  •  分类表 - 菜品表 : 一对多

  - 在菜品表中添加字段(菜品分类),关联分类表

  •  菜品表 - 套餐表 : 多对多

  - 创建第三张中间表(套餐菜品关联表),在中间表上添加两个字段(菜品id、套餐id),分别关联菜品表和分类表

表结构

分类表:category

- 业务字段:分类名称、分类类型、分类排序、分类状态

- 基础字段:id(主键)、创建时间、修改时间

-- 分类表
create table category
(id          int unsigned primary key auto_increment comment '主键ID',name        varchar(20)      not null unique comment '分类名称',type        tinyint unsigned not null comment '类型 1 菜品分类 2 套餐分类',sort        tinyint unsigned not null comment '顺序',status      tinyint unsigned not null default 0 comment '状态 0 禁用,1 启用',create_time datetime         not null comment '创建时间',update_time datetime         not null comment '更新时间'
) comment '菜品及套餐分类';

菜品表:dish

- 业务字段:菜品名称、菜品图片、菜品分类、菜品售价、菜品售卖状态

- 基础字段:id(主键)、分类的创建时间、分类的修改时间

~~~mysql
-- 菜品表
create table dish
(id          int unsigned primary key auto_increment comment '主键ID',name        varchar(20)      not null unique comment '菜品名称',category_id int unsigned     not null comment '菜品分类ID',   -- 逻辑外键price       decimal(8, 2)    not null comment '菜品价格',image       varchar(300)     not null comment '菜品图片',description varchar(200) comment '描述信息',status      tinyint unsigned not null default 0 comment '状态, 0 停售 1 起售',create_time datetime         not null comment '创建时间',update_time datetime         not null comment '更新时间'
) comment '菜品';
~~~

套餐表:setmeal

- 业务字段:套餐名称、套餐图片、套餐分类、套餐价格、套餐售卖状态

- 基础字段:id(主键)、分类的创建时间、分类的修改时间

~~~mysql
-- 套餐表
create table setmeal
(id          int unsigned primary key auto_increment comment '主键ID',name        varchar(20)      not null unique comment '套餐名称',category_id int unsigned     not null comment '分类id',       -- 逻辑外键price       decimal(8, 2)    not null comment '套餐价格',image       varchar(300)     not null comment '图片',description varchar(200) comment '描述信息',status      tinyint unsigned not null default 0 comment '状态 0:停用 1:启用',create_time datetime         not null comment '创建时间',update_time datetime         not null comment '更新时间'
) comment '套餐';
~~~

套餐菜品关联表:setmeal_dish

~~~mysql
-- 套餐菜品关联表
create table setmeal_dish
(id         int unsigned primary key auto_increment comment '主键ID',setmeal_id int unsigned     not null comment '套餐id ',    -- 逻辑外键dish_id    int unsigned     not null comment '菜品id',     -- 逻辑外键copies     tinyint unsigned not null comment '份数'
) comment '套餐菜品关联表';
~~~

这篇关于【JavaWeb】Day41.MySQL概述——多表设计(案例)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/894723

相关文章

Spring Boot中WebSocket常用使用方法详解

《SpringBoot中WebSocket常用使用方法详解》本文从WebSocket的基础概念出发,详细介绍了SpringBoot集成WebSocket的步骤,并重点讲解了常用的使用方法,包括简单消... 目录一、WebSocket基础概念1.1 什么是WebSocket1.2 WebSocket与HTTP

SpringBoot+Docker+Graylog 如何让错误自动报警

《SpringBoot+Docker+Graylog如何让错误自动报警》SpringBoot默认使用SLF4J与Logback,支持多日志级别和配置方式,可输出到控制台、文件及远程服务器,集成ELK... 目录01 Spring Boot 默认日志框架解析02 Spring Boot 日志级别详解03 Sp

java中反射Reflection的4个作用详解

《java中反射Reflection的4个作用详解》反射Reflection是Java等编程语言中的一个重要特性,它允许程序在运行时进行自我检查和对内部成员(如字段、方法、类等)的操作,本文将详细介绍... 目录作用1、在运行时判断任意一个对象所属的类作用2、在运行时构造任意一个类的对象作用3、在运行时判断

java如何解压zip压缩包

《java如何解压zip压缩包》:本文主要介绍java如何解压zip压缩包问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java解压zip压缩包实例代码结果如下总结java解压zip压缩包坐在旁边的小伙伴问我怎么用 java 将服务器上的压缩文件解压出来,

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

MySQL 中的 CAST 函数详解及常见用法

《MySQL中的CAST函数详解及常见用法》CAST函数是MySQL中用于数据类型转换的重要函数,它允许你将一个值从一种数据类型转换为另一种数据类型,本文给大家介绍MySQL中的CAST... 目录mysql 中的 CAST 函数详解一、基本语法二、支持的数据类型三、常见用法示例1. 字符串转数字2. 数字

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

Spring WebFlux 与 WebClient 使用指南及最佳实践

《SpringWebFlux与WebClient使用指南及最佳实践》WebClient是SpringWebFlux模块提供的非阻塞、响应式HTTP客户端,基于ProjectReactor实现,... 目录Spring WebFlux 与 WebClient 使用指南1. WebClient 概述2. 核心依

Mysql实现范围分区表(新增、删除、重组、查看)

《Mysql实现范围分区表(新增、删除、重组、查看)》MySQL分区表的四种类型(范围、哈希、列表、键值),主要介绍了范围分区的创建、查询、添加、删除及重组织操作,具有一定的参考价值,感兴趣的可以了解... 目录一、mysql分区表分类二、范围分区(Range Partitioning1、新建分区表:2、分

MySQL 定时新增分区的实现示例

《MySQL定时新增分区的实现示例》本文主要介绍了通过存储过程和定时任务实现MySQL分区的自动创建,解决大数据量下手动维护的繁琐问题,具有一定的参考价值,感兴趣的可以了解一下... mysql创建好分区之后,有时候会需要自动创建分区。比如,一些表数据量非常大,有些数据是热点数据,按照日期分区MululbU