【MySQL】ER模型(十六)

🚗MySQL学习·第十六站~
🚩本文已收录至专栏:MySQL通关路
❤️文末附全文思维导图,感谢各位点赞收藏支持~
⭐学习汇总贴,超详细思维导图:【MySQL】学习汇总(完整思维导图)

一.引入

数据库设计是牵一发而动全身的,如果数据库中表非常多,一处有误可能将导致处处需要修改。那有没有什么办法可以提前或者快速看到数据库的全貌呢?比如需要哪些数据表、数据表中应该有哪些字段,数据表与数据表之间有什么关系、通过什么字段进行连接等等。这样我们才能更好的进行整体的梳理和设计。
ER模型就是一个这样的工具。ER(entity-relationship,实体-联系)模型也叫作实体关系模型,是用来描述现实生活中客观存在的事物、事物的属性,以及事物之间关系的一种数据模型。在开发基于数据库的信息系统的设计阶段,通常使用ER模型来描述信息需求和信息特性,帮助我们理清业务逻辑,从而设计出优秀的数据库。

二.三要素

ER模型中有三个要素:

  • 实体:可以看做是数据对象,往往对应于现实生活中的真实存在的个体,例如用户、商品。在ER模型中,用矩形来表示。实体分为两类,分别是强实体和弱实体。强实体是指不依赖于其他实体的实体;弱实体是指对另一个实体有很强的依赖关系的实体。
  • 属性:实体的特性。比如用户的性别、联系电话等。在ER模型中用椭圆形来表示。
  • 关系:实体之间的联系。比如一名学生可以学习多门课程,就是一种学生与课程之间的联系。在ER模型中用菱形来表示。

通常,一个实体集(class)对应于数据库中的一个表(table),一个实体(instance)则对应于数据库表中的一行(row),也称为一条记录(record)。一个属性(attribute)对应于数据库表中的**一列(**column),也称为一个字段(field)。

ORM思想 (Object Relational Mapping)体现:
数据库中的一个表  <---> Java中的一个类
表中的一条数据  <---> 类中的一个对象(或实体)
表中的一个列  <----> 类中的一个字段、属性(field)

三.关联关系

现实世界中的各种实体之间可能会存在着各种关联联系,对应到数据库中则表现为表与表之间的数据记录可能存在关系(relationship)关系,例如一名学生可以选修多门课程,一门课程可以被多名学生选择。关联关系可以分为四种类型:一对一关联、一对多关联、多对多关联、自我引用

(1) 一对一关联

一对一关联指的是实体之间的关系是一一对应的,比如个人与身份证信息之间的关系就是一对一的关系。一个人只能有—个身份证信息,一个身份证信息也只属于一个人。在实际的开发中应用不多,因为一对一可以创建成一张表,通常只用在拆分多字段数据表,减少IO次数。

举例:

设计学生表:学号、姓名、手机号码、班级、系别、身份证号码、家庭住址、籍贯、紧急联系人、…
根据字段信息使用频率可以拆为两个表,两个表的记录是——对应关系:

  • 基础信息表(常用信息)︰学号、姓名、手机号码、班级、系别
  • 档案信息表(不常用信息)︰学号、身份证号码、家庭住址、籍贯、紧急联系人、…

两种建表原则:

  • 外键唯一:主表的主键和从表的外键(唯一),形成主外键关系,外键唯一。
  • 外键是主键:主表的主键和从表的主键,形成主外键关系
    在这里插入图片描述

(2) 一对多关联

一对多关联指的是一边的实体通过关系,可以对应多个另外一边的实体。相反,另外一边的实体通过这个关系,则只能对应唯一的一边的实体。比如一个班级有多个学生,而每个学生则只对应一个班级,其中班级与学生就是一对多的关系。

举例:

对于学生与课程关系,一名员工只就职于一个部门,而一个部门有多名员工就职。

  • 员工表:编号、姓名、…、所属部门。

  • 部门表:编号、名称、简介

建表原则:

  • 在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键

在这里插入图片描述

(3) 多对多关联

多对多关联指的是关系两边的实体都可以通过关系对应多个对方的实体。比如一个供货商可以给多个超市供货,一个超市也可以从多个供货商那里采购商品;一门课程可以有多名学生选修,而一名学生也可以选修多门课程,这就是多对多的关系。

要想表示多对多关系,必须创建第三个表,该表通常称为联接表,它将多对多关系划分为两个一对多关系。将这两个表的主键都插入到第三个表中。

在这里插入图片描述

示例

“订单”表和“产品”表有一种多对多的关系,这种关系是通过与“订单明细”表建立两个一对多关系来定义的。一个订单可以有多个产品,每个产品可以出现在多个订单中。

  • 产品表:“产品”表中的每条记录表示一个产品。
  • 订单表:“订单”表中的每条记录表示一个订单。
  • 订单明细表:每个产品可以与“订单”表中的多条记录对应,即出现在多个订单中。一个订单可以与“产品”表中的多条记录对应,即包含多个产品。

在这里插入图片描述

(4) 自我引用

自我引用指的是自己引用自己,例如在员工信息表中,A为B的领导,但A也是一个员工。

在这里插入图片描述

四.建模分析示例

(1) 引入

ER 模型看起来比较麻烦,但是对于我们把控项目整体非常重要。如果只是开发一个小应用,或许简单设计几个表够用了,不建立ER模型也无所谓,一旦要设计有一定规模的应用,在项目的初始阶段,建立完整的 ER 模型就非常关键 了。开发应用项目的实质,其实就是 建模

接下来我们来一步一步地针对简化版的电商业务进行建模分析。有如下8个实体:

  • 地址实体
  • 用户实体
  • 购物车实体
  • 评论实体
  • 商品实体
  • 商品分类实体
  • 订单实体
  • 订单详情实体

其中,用户 和 商品分类是强实体,因为它们不需要依赖其他任何实体。而其他属于弱实体,因为它们虽然都可以独立存在,但是它们都依赖用户这个实体,因此都是弱实体。

(2) 关系分析

根据实际场景我们可以分析出如下关联关系:

在这里插入图片描述

  • 用户可以在电商平台添加多个地址;
  • 用户只能拥有一个购物车;
  • 用户可以生成多个订单;
  • 用户可以发表多条评论;
  • 一件商品可以有多条评论;
  • 每一个商品分类包含多种商品;
  • 一个订单可以包含多个商品,一个商品可以在多个订单里。
  • 订单中又包含多个订单详情,因为一个订单中可能包含不同种类的商品;

(3) 模型细化

有了上述 ER 模型,我们就可以从整体上理解各个实体之间所在存在的关联关系。为了能更清晰的查看各个实体对应到具体的表的关联关系。我们还需要把各个实体的属性加上。
在这里插入图片描述

  • 地址实体:用户编号、省、市、地区、收件人、联系电话、是否是默认地址。
  • 用户实体:用户编号、用户名称、昵称、用户密码、手机号、邮箱、头像、用户级别。
  • 购物车实体:购物车编号、用户编号、商品编号、商品数量、图片文件url。
  • 订单实体:订单编号、收货人、收件人电话、总金额、用户编号、付款方式、送货地址、下单时间。
  • 订单详情实体:订单详情编号、订单编号、商品名称、商品编号、商品数量。
  • 商品实体:商品编号、价格、商品名称、分类编号、是否销售,规格、颜色。
  • 评论实体:评论id、评论内容、评论时间、用户编号、商品编号
  • 商品分类实体:类别编号、类别名称、父类别编号

(4) ER 模型图转换成数据表

通过绘制ER模型,我们已经理清了整体业务逻辑,检查无误后,我们就可以把绘制好的ER模型转换成具体的数据表,转换原则:

  • 一个实体通常转换成一个数据表;
  • 一个多对多的关系,通常也转换成一个数据表;
  • 一个1对1,或者1对多的关系,往往通过表的外键来表达,而不是设计一个新的数据表;
  • 属性转换成表的字段。
  1. 我们应该先将强实体转换为数据表,因为强实体不依赖于其他的实体而存在。

创建用户信息表:

CREATE TABLE user_info(
id bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号',
user_name varchar (200) DEFAULT NULL COMMENT '用户名称',
nick_name  varchar(280) DEFAULT NULL COMMENT '用户昵称',
passwd varchar (200) DEFAULT NULL COMMENT '用户密码',
phone_num varchar(280) DEFAULT NULL COMMENT '手机号',
email varchar(200) DEFAULT NULL COMMENT '邮箱',
head_img varchar(200) DEFAULT NULL COMMENT '头像',
user_level varchar(200) DEFAULT NULL COMMENT '用户级别',
PRIMARY KEY ( `id ` )
)ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='用户表';

商品分类实体转换成商品分类表(base_category),由于商品分类可以有一级分类和二级分类,比如一级分类有家居、手机等等分类,二级分类可以根据手机的一级分类分为手机配件,运营商等,这里我们把商品分类实体规划为两张表,分别是一级分类表和二级分类表,之所以这么规划是因为一级分类和二级分类都是有限的,存储为两张表业务结构更加清晰。

-- 一级分类表
CREATE TABLE base_category1(
id bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号',
name varchar (10) NOT NULL COMMENT '一级分类名称',
PRIMARY KEY (id) USING BTREE
)ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNANIC COMMENT='一级分类表';
    
-- 二级分类表
CREATE TABLE base_category2(
id bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号',
name varchar (280) NOT NULL COMMENT '二级分类名称',
category1_id bigint(20)DEFAULT NULL COMMENT '一级分类编号',
PRIMARY KEY (id) USING BTREE
)ENGINE=InnODB AUTO_INCRENENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='二级分类表';

那么如果规划为一张表呢,表结构如下所示。

CREATE TABLE base_category(
id bigint(20)NOT NULL AUTO_INCREMENT COMMENT '编号',
name varchar(200) NOT NULL COMMENT '分类名称',
category_parent_id  bigint(20) DEFAULT NULL COMMENT '父分类编号',
PRIMARY KEY (id) USING BTREE
)ENGINE=InnoDB AUTO_INCRENENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT= '分类表';

如果这样分类的话,那么查询一级分类时候,就需要判断父分类编号是否为空,但是如果插入二级分类的时候也是空,就容易造成业务数据混乱。而且查询二级分类的时候IS NOT NULL条件是无法使用到索引的。同时,这样的设计也不符合第二范式(因为父分类编号并不依赖分类编号ID,因为父分类编号可以有很多数据为NULL),所以需要进行表的拆分。

  1. 接下来就是把剩下的弱实体转换为数据库表,只举例其中一个
-- 地址实体转换成地址表(user_address),如下所示。
CREATE TABLE user_address(
id bigint(20)NOT NULL AUTO_INCREMENT COMMENT '编号',
province varchar (500) DEFAULT NULL COMMENT '省',
city varchar (500) DEFAULT NULL COMMENT '市',
user_address varchar(500) DEFAULT NULL COMMENT'具体地址',
user_id bigint(20) DEFAULT NULL COMMENT '用户id ',
consignee varchar (40) DEFAULT NULL COMMENT '收件人',
phone_num varchar(40) DEFAULT NULL COMMENT'联系方式',
is_default varchar(1) DEFAULT NULL COMMENT'是否是默认',
PRIMARY KEY (id)
)ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='用户地址表';
  1. 一个多对多的关系转换成一个数据库表

这个ER模型中的多对多的关系有1个,即商品和订单之间的关系,同品类的商品可以出现在不同的订单中,不同的订单也可以包含同一类型的商品,所以它们之间的关系是多对多。针对这种情况需要设计一个独立的表来表示,这种表一般称为中间表。
我们可以设计一个独立的订单详情表,来代表商品和订单之间的包含关系。这个表关联到2个实体,分别是订单、商品。所以,表中必须要包括这两个实体转换成的表的主键。除此之外,我们还要包括该关系自有的属性:商品数量,商品下单价格以及商品名称。

-- 订单详情表
CREATE TABLE order_detail(
id  bigint(20) NOT NULL AUTO_INCREMENT COMMENT '订单详情编号',
order_id  bigint(20) DEFAULT NULL COMMENT '订单编号',
sku_id  bigint(20) DEFAULT NULL COMMENT 'sku_id',
sku_name  varchar(20) DEFAULT NULL COMMENT 'sku名称',
sku_num  varchar(200) DEFAULT NULL COMMENT '购买个数',
create_time  datetime DEFAULT NULL COMMENT '操作时间',
PRIMARY KEY (id) USING BTREEENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='订单明细表';
  1. 通过外键来描述一对多关系

在上面的表的设计中,我们可以用外键来表达1对多的关系。比如在商品评论表sku_comments中,我们分别把user_id、sku_id定义成外键,以使用下面的语句设置外键。

CONSTRAINT fk_comment_user FOREIGN KEY (user_id) REFERENCES user_info (id),
CONSTRAINT fk_comment.sku FOREIGN KEY (sku_id) REFERENCES sku_info ( sku_id)

外键约束主要是在数据库层面上保证数据的一致性,但是因为插入和更新数据需要检查外键,理论上性能会有所下降。实际的项目,不建议使用外键,一方面是提高了开发的复杂度(有外键的话主从表类的操作必须先操作主表),此外在有外键时,处理数据的时候非常麻烦。我们通常会选择在应用层面做数据的一致性检查。如学生选课的场景,课程不应该是有学生自己输入,而是通过下拉或查找等方式从系统中进行选取,就能够保证是合法的课程ID,因此就不需要靠数据库的外键来检查了。

五.全文概览

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/67170.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RocketMQ Learning(一)

目录 一、RocketMQ 0、RocketMQ的产品发展 1、RocketMQ安装 1.1、windows下的安装 注意事项 1.2、Linux下的安装 1.3、源码的安装 1.4、控制台 2、消息发送方式 2.1、发送同步消息 2.2、发送异步消息 2.3、单向发送 3、消息消费方式 3.1、负载均衡模式&#xff0…

编写第一个 React Native 程序

React Native 目录 使用React Native CLI命令创建的目录如下图所示&#xff1a; 重要目录说明 目录说明__tests__存放测试用例的目录.bundle / config配置文件&#xff08;一般不会用到&#xff09;android 和 IOS 文件夹这两个文件夹主要是存放安卓和 ios 相关的配置文件和…

XML 学习笔记 7:XSD

本文章内容参考自&#xff1a; W3school XSD 教程 Extensible Markup Language (XML) 1.0 (Second Edition) XML Schema 2001 XML Schema Part 2: Datatypes Second Edition 文章目录 1、XSD 是什么2、XSD 内置数据类型 - built-in datatypes2.1、基本数据类型 19 种2.1.1、基本…

【Spring Boot】构建RESTful服务 — 构建RESTful应用接口

构建RESTful应用接口 RESTful架构是目前最流行的互联网软件架构规范&#xff0c;是Web API&#xff08;应用编程接口&#xff09;的大趋势和主流规范&#xff0c;了解了RESTful的众多优点之后&#xff0c;接下来一步一步地学习如何使用Spring Boot构建RESTful Web API。 1.Sp…

途乐证券-光伏、储能板块拉升 德业股份、固德威等大幅走高

光伏、储能等新能源板块10日盘中震荡上扬&#xff0c;截至发稿&#xff0c;德业股份涨近8%&#xff0c;锦浪科技、固德威、阿特斯等涨逾6%&#xff0c;禾迈股份、昱能科技涨近4%。 消息面上&#xff0c;据中关村储能产业技术联盟计算&#xff0c;2021年至2023年上半年&#xff…

rust关于项目结构包,Crate和mod和目录的组织

rust 最近开始学习rust语言。感觉这门语言相对java确实是难上很多。开几个文章把遇到的问题记录一下 rust关于包&#xff0c;Crate 关于包&#xff0c;Crate这块先看看官方书籍怎么说的 crate 是 Rust 在编译时最小的代码单位。如果你用 rustc 而不是 cargo 来编译一个文件…

Android 内存泄漏

名词解释 内存泄漏:即memory leak。是指内存空间使用完毕后无法被释放的现象&#xff0c;虽然Java有垃圾回收机制&#xff08;GC&#xff09;&#xff0c;但是对于还保持着引用&#xff0c; 该内存不能再被分配使用&#xff0c;逻辑上却已经不会再用到的对象&#xff0c;垃圾回…

安装CUDA与CUDNN与Pytorch(最新超级详细图文版本2023年8月最新)

一、安装CUDA 1.1、下载安装包 cuda可以认为就是Nvidia为了显卡炼丹搞的一个软件&#xff0c;其下载地址为&#xff1a;CUDA Toolkit 12.2 Update 1 Downloads | NVIDIA Developer 当你点进这个链接的时候&#xff0c;你需要依次选择 1是选择系统&#xff0c;这里选windows…

Netty面试题1

计算机网络模型 OSI采用了分层的结构化技术&#xff0c;共分七层&#xff0c; 物理层、数据链路层、网络层、传输层、会话层、表示层、应用层 。 Open System Interconnect 简称OSI&#xff0c;是国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的开放系统互连参…

医疗保健中的 NLP:实体链接

一、说明 HEalthcare和生命科学行业产生大量数据&#xff0c;这些数据是由合规性和监管要求&#xff0c;记录保存&#xff0c;研究论文等驱动的。但随着数据量的增加&#xff0c;搜索用于研究目的的必要文件和文章以及数据结构成为一个更加复杂和耗时的过程。例如&#xff0c;如…

微信小程序中的分包使用介绍

一、分包的好处 可以优化小程序首次启动的下载时间 在多团队共同开发时可以更好的解耦协作 主包&#xff1a;放置默认启动页面/TabBar 页面&#xff0c;公共资源/JS 脚本 分包&#xff1a;根据开发者的配置进行划分 限制&#xff1a;所有分包大小不超过 20M&#xff0c;单…

无人驾驶实战-第十二课(强化学习自动驾驶系统)(完)

在七月算法上报了《无人驾驶实战》课程&#xff0c;老师讲的真好。好记性不如烂笔头&#xff0c;记录一下学习内容。 课程入口&#xff0c;感兴趣的也可以跟着学一下。 ————————————————————————————————————————— 强化学习&#xff…

php webshell 免杀入门

webshell 查杀软件&#xff1a; d盾、安全狗、护卫神、Sangfor WebShellKill 在线查杀 百度WEBDIR https://scanner.baidu.com 河马 https://www.shellpub.com cloudwalker牧云 https://webshellchop.chaitin.cn 查杀技术 静态检测、动态检测、日志检查 静态检查&#xff1a…

通用FIR滤波器的verilog实现(内有Lowpass、Hilbert参数生成示例)

众所周知&#xff0c;Matlab 中的 Filter Designer 可以直接生成 FIR 滤波器的 verilog 代码&#xff0c;可以方便地生成指定阶数、指定滤波器参数的高通、低通、带通滤波器&#xff0c;生成的 verilog 代码也可以指定输入输出信号的类型和位宽。然而其生成的代码实在算不上美观…

智能型静电消除器的优势有哪些?

智能型静电消除器是一种使用先进技术和智能控制系统来消除静电问题的设备。静电是由于电荷不平衡而引起的现象&#xff0c;常见于工业生产、医疗设备、办公环境等场合。静电的存在可能导致电子设备故障、火灾、等问题。 智能型静电消除器与传统静电消除器相比&#xff0c;具有以…

Python做一个绘图系统3:从文本文件导入数据并绘图

文章目录 导入数据文件对话框修改绘图逻辑源代码 Python绘图系统系列&#xff1a;将matplotlib嵌入到tkinter 简单的绘图系统 导入数据 单纯从作图的角度来说&#xff0c;更多情况是已经有了一组数据&#xff0c;然后需要将其绘制。这组数据可能是txt格式的&#xff0c;也可能…

uni-app:实现点击按钮,进行数据累加展示(解决数据过多,导致出错)

效果 代码 核心代码 一、标签显示 <!-- 加载更多 --> <view class"load_more" v-if"info.length > pageNum * pageSize" tap"loadMore">加载更多 </view> v-if"info.length > pageNum * pageSize"&#xf…

远景智能PMO负责人严晓婷受邀为第十二届中国PMO大会演讲嘉宾

上海远景科创智能科技有限公司PMO负责人严晓婷女士受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾&#xff0c;演讲议题&#xff1a;能源物联网产品标准项目和非标准项目的并行管理。大会将于8月12-13日在北京举办&#xff0c;敬请关注&#xff01; 议题简要&#xff1…

教雅川学缠论07-中枢实战众泰汽车000980

本文实战众泰汽车 下面是2023年11月14-2023年8月8众泰汽车日K图 先画日K 接下来处理包含&#xff0c;就变成下面这个样子 下面在套上缠论的理论&#xff0c;未来股价的走势应该是红色椭圆形虚线里面的样子 好了&#xff0c;文章就到这里&#xff0c;如果众泰最终不是这个走势…