【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

相关文章

在Ubuntu上部署SpringBoot应用的操作步骤

《在Ubuntu上部署SpringBoot应用的操作步骤》随着云计算和容器化技术的普及,Linux服务器已成为部署Web应用程序的主流平台之一,Java作为一种跨平台的编程语言,具有广泛的应用场景,本... 目录一、部署准备二、安装 Java 环境1. 安装 JDK2. 验证 Java 安装三、安装 mys

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

SpringCloud集成AlloyDB的示例代码

《SpringCloud集成AlloyDB的示例代码》AlloyDB是GoogleCloud提供的一种高度可扩展、强性能的关系型数据库服务,它兼容PostgreSQL,并提供了更快的查询性能... 目录1.AlloyDBjavascript是什么?AlloyDB 的工作原理2.搭建测试环境3.代码工程1.

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python

SpringBoot操作spark处理hdfs文件的操作方法

《SpringBoot操作spark处理hdfs文件的操作方法》本文介绍了如何使用SpringBoot操作Spark处理HDFS文件,包括导入依赖、配置Spark信息、编写Controller和Ser... 目录SpringBoot操作spark处理hdfs文件1、导入依赖2、配置spark信息3、cont

springboot整合 xxl-job及使用步骤

《springboot整合xxl-job及使用步骤》XXL-JOB是一个分布式任务调度平台,用于解决分布式系统中的任务调度和管理问题,文章详细介绍了XXL-JOB的架构,包括调度中心、执行器和Web... 目录一、xxl-job是什么二、使用步骤1. 下载并运行管理端代码2. 访问管理页面,确认是否启动成功

Java中的密码加密方式

《Java中的密码加密方式》文章介绍了Java中使用MD5算法对密码进行加密的方法,以及如何通过加盐和多重加密来提高密码的安全性,MD5是一种不可逆的哈希算法,适合用于存储密码,因为其输出的摘要长度固... 目录Java的密码加密方式密码加密一般的应用方式是总结Java的密码加密方式密码加密【这里采用的

Mysql 中的多表连接和连接类型详解

《Mysql中的多表连接和连接类型详解》这篇文章详细介绍了MySQL中的多表连接及其各种类型,包括内连接、左连接、右连接、全外连接、自连接和交叉连接,通过这些连接方式,可以将分散在不同表中的相关数据... 目录什么是多表连接?1. 内连接(INNER JOIN)2. 左连接(LEFT JOIN 或 LEFT

Java中ArrayList的8种浅拷贝方式示例代码

《Java中ArrayList的8种浅拷贝方式示例代码》:本文主要介绍Java中ArrayList的8种浅拷贝方式的相关资料,讲解了Java中ArrayList的浅拷贝概念,并详细分享了八种实现浅... 目录引言什么是浅拷贝?ArrayList 浅拷贝的重要性方法一:使用构造函数方法二:使用 addAll(