【MySQL】ER模型(十六)

news2024/11/26 2:23:12

🚗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,因此就不需要靠数据库的外键来检查了。

五.全文概览

在这里插入图片描述

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

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

相关文章

极智开发 | 龙芯3a4000机器安装银河麒麟系统

欢迎关注我的公众号 [极智视界],获取我的更多经验分享 大家好,我是极智视界,本文介绍一下 龙芯3a4000机器安装银河麒麟系统。 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码和资源下载,链接:https://t.zsxq.com/0aiNxERDq 前几天淘了台龙芯3a4000 的…

机器学习、深度学习项目开发业务数据场景梳理汇总记录四

本文的主要作用是对历史项目开发过程中接触到的业务数据进行整体的汇总梳理&#xff0c;文章会随着项目的开发推进不断更新。 这里是续文&#xff0c;因为CSDN单篇文章内容太大的话就会崩溃的&#xff0c;别问我怎么知道的&#xff0c;问就是血泪教训&#xff0c;辛辛苦苦写了一…

【面试八股文】每日一题:谈谈你对异常的理解

每日一题-Java核心-谈谈你对异常的理解【面试八股文】 异常是程序在运行过程中出现的错误或不正常的情况。当程序执行过程中遇到无法处理的错误或者不符合预期的情况&#xff0c;就会抛出异常。异常可以分为两种类型&#xff1a;受检异常和非受检异常。 受检异常是指在程序编译…

主数据管理案例-北京燃气

1、 背景介绍及难点分析 主数据作为数据资源中最重要、基础的一部分&#xff0c;是北京燃气实现数据资源管理的切入点&#xff0c;对北京燃气而言&#xff0c;实现主数据的集中统一管理也是解决集团信息化建设中“信息孤岛”现象&#xff0c;实现系统集成和业务协同需求最迫切的…

《Zookeeper》源码分析(六)之 ServerCnxnFactory的工作原理(下)

目录 WorkerService数据结构构造函数 ConnectionExpirerThread WorkerService 前面的SelectorThread获取到IO就绪的连接后会将其包装成IOWorkRequest并交给worker线程处理&#xff0c;先看下这个过程&#xff1a; 从代码中可以看到&#xff0c;如果WorkerService中没有就绪的线…

p5.js画布操作实战:创建,绑定指定元素,动态调整大小,隐藏滚动条,删除画布...

theme: smartblue 文章简介 之前在 《p5.js 光速入门》 里粗略讲过一下如何使用 p5.js 创建画布。 这次要介绍几个 p5.js 提供的画布相关的方法。 创建画布时的相关配置。让画布绑定指定元素。重置画布大小。删除画布。 学习本文前你需要具备一点 p5.js 的知识&#xff0c;想了…

在家查阅下载AACR(美国癌症研究学会)数据库文献

AACR&#xff08;美国癌症研究学会&#xff09;简介&#xff1a; 美国癌症研究学会American Association for Cancer Research创建于1907年&#xff0c;是世界上成立最早、规模最大的致力于全面、创新和高水准癌症研究的科学组织。其出版物包括7种正式出版的期刊&#xff1a; …

如何让葡萄酒与晚宴菜单完美搭配?

如果你喜欢喝甜酒&#xff0c;世界上有很多经典的蜂蜜酒&#xff0c;它们通过数百年的精致生产方法达到美味的境界。糖浓缩的技术包括葡萄干燥&#xff0c;冷冻&#xff0c;甚至腐烂&#xff01;甜葡萄酒是最通用的&#xff0c;因为它们可以搭配从开胃菜到甜点的所有晚餐。 来自…

多分类评估 Micro, Macro Weighted Averages of F1 Score和适用场景

classification_report展示了weighted average F1 Score:需要区分类别,计算每个类别的f1-score,对所有类别的f1-score加权平均,权重为类别对应的样本数量占总样本数量的比例 Micro F1 Score:不需要区分类别,直接使用总体样本计算f1-score Macro F1 Score:需要区分类别…

收益抽6成,谁给你的脸?

2023年8月10日18时&#xff0c;CSDN官方发布了《CSDN付费专栏分润调整公告》&#xff0c;称将对付费专栏作者收入分润进行阶梯式调整。 根据公告内容&#xff0c;如果我没理解错的话&#xff0c;定价10元的付费专栏&#xff0c;每一个订阅&#xff0c;作者最低只能拿到40%&…

VMware虚拟机安装教程

VMware虚拟机安装教程 一、VMware虚拟机介绍 VMware Workstation Pro 是行业标准桌面 Hypervisor&#xff0c;使用它可在 Windows 或 Linux 桌面上运行 Windows、Linux 和 BSD 虚拟机。   详情可查看VMware官网。 二、VMware下载 1.可以通过华军软件园进行下载&#xff1a;…

C语言创建目录(文件夹)之mkdir

一、mkdir 说明&#xff1a;创建目录。 头文件库&#xff1a; #include <sys/stat.h> #include <sys/types.h>函数原型&#xff1a; int mkdir(const char *pathname, mode_t mode);mode方式&#xff1a;可多个权限相或&#xff0c;如0755表示S_IRWXU | S_IRGRP…

基于熵权法对Topsis模型的修正

由于层次分析法的最大缺点为&#xff1a;主观性太强&#xff0c;影响判断&#xff0c;对结果有很大影响&#xff0c;所以提出了熵权法修正。 变异程度方差/标准差。 如何度量信息量的大小&#xff1a; 把不可能的事情变成可能&#xff0c;这里面就有很多信息量。 概率越大&…

Telerik Test Studio R2 2023 Crack

Telerik Test Studio R2 2023 Crack Telerik Test Studio是一款用于Web和桌面应用程序的端到端测试自动化工具&#xff0c;支持功能性UI、RESTful API和负载/性能测试。无论您是无代码还是使用TestStudio的基于代码的自动化功能&#xff0c;您都将始终获得最佳的应用程序质量和…

马来西亚的区块链和NFT市场调研

马来西亚的区块链和NFT市场调研 基本介绍 参考&#xff1a; https://zh.wikipedia.org/wiki/%E9%A9%AC%E6%9D%A5%E8%A5%BF%E4%BA%9A zz制度&#xff1a;联邦议会制 语言文字&#xff1a; 马来语 民族&#xff1a; 69.4%原住民&#xff08;土著&#xff09;&#xff0c;23.2%…

Android 取证之微信8.0.38版本数据库解密分析

0x01 前言 本文以教学为基准、本文提供的可操作性不得用于任何商业用途和违法违规场景。 本人对任何原因在使用本人中提供的代码和策略时可能对用户自己或他人造成的任何形式的损失和伤害不承担责任。 0x02 软硬件环境 app 版本&#xff1a;8.0.38 inject&#xff1a;frida …

统信UOS下eclipse使用lombok报错的问题

lombok不兼容问题 lombok不支持高版本jdk&#xff0c;本人在应用商店下载eclipse安装的&#xff0c;默认用的jdk17&#xff0c;不兼容lombok插件&#xff0c;需要调整eclipse.ini配置文件&#xff0c;如下&#xff1a; #/opt/apps/org.eclipse.java-ee/files/eclipse.ini -ja…

香港站群服务器为什么适合seo优化?

​  香港站群为什么适合seo优化?本文主要从以下四点出发进行原因阐述。 1.香港站群服务器的优势 2.香港站群服务器与国内服务器的对比 3.多IP站群服务器的优势 4.香港站群服务器在SEO优化中的注意事项 1.香港站群服务器的优势 香港站群服务器是为了满足企业SEO优化需求而提供…

iconfont 使用

官网地址 iconfont-阿里巴巴矢量图标库 常规操作&#xff1a;注册账号 首页 搜索想要的图片 加入购物车并添加项目没有就创建一个 在线生成链接 复制生成的css 在前端软件创建相关的wxss文件 全局 import "/static/iconfont/iconfont.wxss";page {height: 100%; }…

Jenkins 插件下载速度慢安装失败?这篇文章可能解决你头等难题!

Jenkins部署完毕&#xff0c;如果不安装插件的话&#xff0c;那它就是一个光杆司令&#xff0c;啥事也做不了&#xff01; 所以首先要登陆管理员账号然后点击系统管理再点击右边的插件管理安装CI/CD必要插件。 但是问题来了&#xff0c;jenkins下载插件速度非常慢&#xff0…