MySQL笔记4

一、范式

1.概念与意义

  范式(Normal Form)是数据库设计需遵循的规范,解决“设计随意导致后期重构困难”问题。主流有 三大范式(1NF、2NF、3NF),还有进阶的 BCNF、4NF、5NF 等,范式间是递进依赖(如 2NF 基于 1NF,3NF 基于 2NF )。

2.第一范式(1NF)

(1)规则:字段需满足原子性(不可再拆分)

(2)示例:

   如图,学生表中“student”字段列存储的数据,明显还可拆分为姓名、性别、身高,拆分后才符合 1NF。所以应将表结构更改为下图,才符合1NF:

 (3)不满足1NF的影响:

  客户端语言和表之间无法很好的生成映射关系

  查询到数据后,需要处理数据时,还需要对其字段进行额外拆分

  插入数据时,对于第一个字段的值还需要先拼装后才能进行写入

3.第二范式(2NF)

(1)规则:满足1NF的基础上,表中所有列必须完全依赖主键(一张表只描述一类业务,无冗余关联)。

(2)示例:观察1NF中表中 course 、 score 这两列数据,跟前面的几列数据实际上依赖关系并不大,所以此时在1NF表基础上可以再次拆分一下表结构:

student 表

 course 表

score 表 

 结构优化后,之前的一张表被拆分成学生表、课程表、成绩表三张,每张表中的 id 字段作为主键,其他字段都依赖这个主键。无论在那张表中,都可以通过id主键确定其他字段的信息,每张表的业务属性都具备“唯一性”。

(3)不满足2NF的影响:

  因字段对主键存在部分依赖,会导致:数据冗余(部分信息重复存)

  更新异常(改一处需动多条)

  插入/删除异常(操作受主键关联限制,易出错)

4.第三范式(3NF)

(1)规则:满足2NF的基础上,非主键字段不传递依赖于主键(字段间独立,无间接依赖)。

(2)示例:观察2NF中 student 表,最后的两个字段 department(学生所属的院校) 和 dean (这个院系的院长 )。一个学生的院长是谁,是取决于学生所在的院系,最后的两个字段存在依赖关系。所以进一步优化表结构:

department 表

 student 表

  将原本的学生表拆为院系表、学生表两张,学生表中则是只存储一个院系id,由院系表存储院系相关的所有数据。学生表中的每个非主键字段与其他非主键字段之间,都是相互独立的,之间不会再存在任何依赖性,所有的字段都依赖于主键。

(3)不满足3NF的影响:

  会因字段传递依赖,导致数据冗余(同信息重复存)

  更新异常(改一个值需动多条数据,易漏改)

  删除异常(删数据可能误删或残留脏数据)

  插入异常(新信息难单独插入)

  让表结构难维护、业务流程易受牵连 

5.三范式小结

1NF:确保原子性,表中每一个列数据都必须是不可再分的字段。

2NF:确保唯一性,每张表都只描述一种业务属性,一张表只描述一件事。

3NF:确保独立性,表中除主键外,每个字段之间不存在任何依赖,都是独立的。

经过三范式的设计优化后,整个库中的所有表结构,会显得更为优雅,灵活性也会更强。

6.巴斯-科德范式(BCNF)

(1)核心问题:3NF未约束联合主键字段间的依赖。若联合主键中某字段依赖另一字段,仍会导致冗余、更新异常。

(2)示例:这里我们可以通过联合主键,确定学生表中任何一个学生的信息,但是一条学生信息中的班主任(adviser),取决于学生所在的班级,因此班主任字段其实也依赖于班级字段。

  如果联合主键中的一个字段依赖于另一个字段,会造成不小的问题,使得整张表的维护性变差,因此这里需要进一步调整结构:

   原本的学生表则又被拆为了班级表、学生表两张,在学生表中只存储班级id,然后使用班级id和学生姓名两个字段作为联合主键。

 注:第三范式只要求非主键字段之间,不能存在依赖关系,但没要求联合主键中的字段不能存在依赖,因此第三范式并未考虑完善,巴斯-科德范式修正的就是这点,是对第三范式的补充及完善。

7.第四范式(4NF)

(1)核心问题:表中存在多值依赖(一个字段值由多个字段共同决定,如用户权限依赖“用户+角色” ),导致冗余和操作异常。

(2)示例:

各字段含义:

  user_name:用户名

  role:角色信息

ROOT:超级管理员角色

ADMIN:管理员角色

USER:普通用户角色

  permission:权限信息

*:超级管理员拥有的权限级别,*表示所有

BACKSTAGE:管理员拥有的权限级别,表示可操作后台

LOGIN:普通用户拥有的权限级别,表示可登录访问平台

  一个用户可以拥有多个角色,同时一个角色可以拥有多个权限,所以此时无法单独根据用户名去确定权限值,权限值必须依赖用户、角色两个字段来决定,这种一个字段的值取决于多个字段才能确定的情况,就被称为多值依赖

需进一步将表格拆分为:

users 表

roles 表

 permissions 表

users_roles 表

roles_permissions 表

  将原本的用户角色权限表,拆分成了用户表、角色表、权限表、用户角色关系表、角色权限关系表。一方面用户表、角色表、权限表中都不会有数据冗余,第二方面无论是要删除亦或新增一个角色、权限时,都不会影响其他表。后面的两张关系表,主要是为了维护用户、角色、权限三者之间的关系。

 8.第五范式

(1)规则:建立在4NF的基础上,进一步消除表中的连接依赖,直到表中的连接依赖都是主键所蕴含的。

(2)实际价值:解决“无损连接”理论问题,生产环境极少用到(场景罕见、难察觉 ),了解即可。

9.第六范式

(1)概念:域键范式,也被称之为终极范式,但目前也仅有学术机构在研究,在生产环境中实际的用途也不大

10.反范式

(1)概念:不遵循数据库范式设计的结构,称为反范式结构。

(2)优缺点:

优点

  消除数据冗余,节省存储空间;

  表结构清晰,简化 SQL 操作、减少出错。

缺点(范式级别过高时)

  数据分散到多张表,联表查询需求暴增;

  联表过多可能引发索引失效,严重拖慢业务系统性能。

(3)设计意义:因范式过高会导致性能问题,设计库表时无需 100% 遵循范式;当“破坏范式对业务的好处>坏处”时,主动采用反范式设计。

注:不以规则为绝对标准,业务优先:能支撑业务需求、带来实际价值的设计,就是好设计。

二、数据库范式设计总结

1.范式设计的整体认知

(1) 复杂度与代价:范式级别越高,理解难度越大,为满足范式付出的设计代价(如拆分表数量、性能开销)也越大。

(2) 实际项目应用:一般项目中,满足到第三范式(3NF)或巴斯 - 科德范式(BCNF) 即可,继续追求更高范式易因过度精细设计导致整体性能下降。

(3)灵活权衡原则:控制在第三范式级别,可平衡数据冗余与性能影响;若打破范式对业务更有利,也可违背范式设计。

2.库表结构设计的合理性对比

(1)不合理设计的问题:会造成数据冗余,浪费存储空间;不便于常规 SQL 操作(如插入、删除),甚至引发异常。

(2)合理设计的好处:节省空间(内存和磁盘);数据划分合理,数据库性能高且数据完整;结构便于维护和常规SQL操作

(3)各范式递进关系:呈包含关系,从第一范式(1NF)到域键范式(终极范式),级别越高约束越严格,如 1NF⊂2NF⊂3NF⊂BCNF⊂4NF⊂5NF⊂域键范式 。

(4)各范式概念:

  1NF(第一范式):原子性,字段值不可再分。

  2NF(第二范式):唯一性,字段依赖主键,每行数据描述同一业务属性。

  3NF(第三范式):独立性,非主属性不传递依赖于主键。

  BCNF(巴斯 - 科德范式):主键字段独立性,联合主键字段间无依赖性。

  4NF(第四范式):多值依赖,表中一个字段值由多个字段决定。

  5NF(第五范式):无连接依赖,表中字段数据间不存在连接依赖关系。

  域键范式(终极范式):追求库表设计的终极完美范式,目前多处于学术研究阶段 。

三、MySQL数据库账户及授权

1.密码策略

(1)密码插件:

MySQL版本默认密码插件替换原因
8.0+caching_sha2_passwordmysql_native_password,解决SHAI算法安全性问题(易被破解)
5.7及以下mysql_native_password依赖SHAI算法,已被NIST建议弃用

关键差异: caching_sha2_password 更安全, mysql_native_password 验证速度快,但算法弱

(2)查看数据库当前密码策略的语句:show variables like '%password%';(查看所有密码相关变量)

(从上往下 )表中每一行的意思:

  是否自动生成RSA密钥对文件

  哈希轮数,数值越大安全性越强

  RSA 私钥文件

  RSA 公钥文件

  MySQL密码过期时间,单位为天

  超时断开

  随机密码长度

  是否支持代理用户控制认证插件

  不允许用户使用最近n次使用过的密码

  修改密码时是否需要提供当前用户使用的密码,OFF不需要,ON需要

  不允许用户使用最近n天内使用过的密码

  该变量通常为空,它可能用于特定的报告或审计目的

(3)查看密码设置策略:show variables like 'validate_password%';

注:若显示为空,则表示未装插件,输入安装插件语句即可:Iinstall component 'file://component_validate_password';

(从上往下 )表中每一行的意思:

  用于控制密码修改时字符变化比例的要求

  能将密码设置成当前用户名

  插件用于验证密码强度的字典文件路径,默认为空

  密码最小长度,默认为8,有最小值为4的限制

  密码至少要包含的小写字母和大写字母的个数

  密码至少要包含的数字个数

  密码强度检查等级

  密码必须包含的特殊字符个数

(4)密码强度检查等级解释(validate_password.policy) :

等级检查对象
0 或 low检查长度6
1 或 medium检查长度、数字、大小写、特殊字符
2 或 strong检查长度、数字、大小写、特殊字符、字典文件

(5)设置密码强度检查的语句:

设置密码验证强度检查策略:set global validate_password.policy=等级强度;

设置至少要包含大/小写字母的个数:set global validate_password.mixed_case_count=个数;

设置至少要包含数字的个数:set global validate_password.number_count=个数;

设置至少包含特殊字符个数:set global validate_password.special_char_count=个数;

设置密码长度:set global validate_password.length=长度值;

修改后,可刷新权限,使其生效:flush privileges;

(6)修改密码的语句:

先查看 root 用户信息:select user, host, plugin from mysql.user;

再修改其密码:alter user 'root'@'来源地址' identified by '新密码';(来源地址—本地主机为localhost,远程主机为%)

最后刷新权限即可

2.登录账户管理

(1)管理原则:MySQL8遵循先创建账户,再赋予权限的流程,清晰分离账户创建与权限配置步骤

(2)关键操作命令:

操作目标SQL命令说明
查看当前用户信息select user();快速获取当前登录用户名 
进入系统数据库use mysql;切换到存储用户数据的库
查看数据库表show tables;确认 user 表存在
查看用户表结构desc user;了解 user 表字段设计 
查询用户核心信息select user,host,authentication_string from user;提取账号、允许登录主机、加密密码

3.新建登录账户

(1)新建账户的语句:create  user  '用户名'@'来源地址'  identified  by  '密码';

注:登录主机为  localhost(本地登录) 或   %(远程登录)

 退出当前账户,登录新建的账户,看是否能成功进入(只能查看有限库):

4.账户授权

(1)账户权限管理原则:

最小化赋权:生产环境仅授予必要权限(如 select ),避免高危操作( update / insert )

分离角色:区分管理账号( root )与应用账号(业务用户)

定期清理:删除/回收闲置账户权限

(2)常见的用户权限:

(3)查看权限的语句: show grants;(查看当前用户) show grants for  '用户名'@'来源地址';(查看其他账户权限)

上例显示 haha 账户只有 usage 默认权限,即连接登录权限

(4)赋予账户权限的语句:grant 权限列表 on 数据库名.表名 to '用户名'@'来源地址' ;

 赋予 haha 账户查询mysql库的权限

查看 user 表的权限信息:

登录被赋予权限的账户,测试一下:

(5)新建远程账户(指定网段):create user  'test1'@'网段' identified by '密码';

(6)新建高权限账户(含赋权能力):

 但是,all 所有权限中不包含给账户赋权的权限 grant:

给 haha 账户赋予给别的账户赋权的权限:

若赋权不成功则先给 root 账户增加 system_user 权限

5.回收权限

(1)作用:取消用户已授权的数据库操作权限,细化权限管理

(2)语句:revoke  权限列表/all  on  库名.表名  from  '用户名'@'来源地址';

回收 select 权限

回收所有权限 

6.删除账户

(1)作用:彻底清除MySQL用户,连带其权限配置,清理无用账户

(2)语句:drop user '用户名'@'来源地址'; drop  user 用户名(来源地址为%,可不写来源地址)

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

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

相关文章

切比雪夫不等式的理解以及推导【超详细笔记】

文章目录参考教程一、意义1. 正态分布的 3σ 法则2. 不等式的含义3. 不等式的意义二、不等式的证明1. 马尔科夫不等式马尔可夫不等式证明(YYY 为非负随机变量 )2. 切比雪夫不等式推导参考教程 一个视频,彻底理解切比雪夫不等式 一、意义 1. 正态分布的…

Spring Boot Jackson 序列化常用配置详解

一、引言在当今的 Web 开发领域,JSON(JavaScript Object Notation)已然成为数据交换的中流砥柱。无论是前后端分离架构下前后端之间的数据交互,还是微服务架构里各个微服务之间的通信,JSON 都承担着至关重要的角色 。它…

Jetpack ViewModel LiveData:现代Android架构组件的核心力量

引言在Android应用开发中,数据管理和界面更新一直是开发者面临的重大挑战。传统的开发方式常常导致Activity和Fragment变得臃肿,难以维护,且无法优雅地处理配置变更(如屏幕旋转)。Jetpack中的ViewModel和LiveData组件正…

Python数据分析案例79——基于征信数据开发信贷风控模型

背景 虽然模型基本都是表格数据那一套了,算法都没什么新鲜点,但是本次数据还是很值得写个案例的,有征信数据,各种,个人,机构,逾期汇总..... 这么多特征来做机器学习模型应该还不错。本次带来&…

板凳-------Mysql cookbook学习 (十二--------3_2)

3.3链接表 结构 P79页 用一个类图来表示EmployeeNode类的结构,展示其属性和关系: plaintext ----------------------------------------- | EmployeeNode | ----------------------------------------- | - emp_no: int …

深度学习图像预处理:统一输入图像尺寸方案

在实际训练中,最常见也最简单的做法,就是在送入网络前把所有图片「变形」到同一个分辨率(比如 256256 或 224224),或者先裁剪/填充成同样大小。具体而言,可以分成以下几类方案:一、图…

pytest-log

问题1:我们在运行测试用例的时候如何记录测试的log,如何使用?问题2:我写的函数,为了方便log记录,但是在pytest运行时,会兼容pytest且不会重复记录,怎么解决?1、pytest有内…

在安卓源码中添加自定义jar包给源码中某些模块使用

一、具体步骤 1. 准备目录与 Jar 包 在vendor下 创建新的模块目录,放入demo.jar 包: demojar/ # 模块目录 ├── Android.bp # 编译配置文件 └── demo.jar 2. 编写 Android.bp 配置 Android.bp 示例配置: java_import {…

buntu 22.04 上离线安装Docker 25.0.5(二)

以下有免费的4090云主机提供ubuntu22.04系统的其他入门实践操作 地址:星宇科技 | GPU服务器 高性能云主机 云服务器-登录 相关兑换码星宇社区---4090算力卡免费体验、共享开发社区-CSDN博客 兑换码要是过期了,可以私信我获取最新兑换码!&a…

初探 Web 环境下的 LLM 安全:攻击原理与风险边界

文章目录前言1 什么是大型语言模型(LLM)?1.1 LLM的核心特征1.2 LLM在Web场景中的典型应用2 LLM攻击的核心手段:提示注入与权限滥用3 LLM与API集成的安全隐患:工作流中的漏洞节点3.1 LLM-API集成的典型工作流3.2 工作流…

【新手向】PyTorch常用Tensor shape变换方法

【新手向】PyTorch常用Tensor shape变换方法 前言 B站UP主科研水神大队长的视频中介绍了“缝合模块”大法,其中专门强调了“深度学习 玩的就是shape”。受此启发,专门整理能够调整tensor形状的几个内置函数,方便以后更好地调整PyTorch代码中的…

React 18 vs Vue3:状态管理方案深度对比

🔥 背景: React有Redux、Zustand、Jotai等方案 Vue有Pinia、Vuex 4.x 如何选择适合项目的方案? 🔍 核心对比: 维度 React (Redux Toolkit) Vue3 (Pinia) 类型安全 ✅ 需手动配置TS ✅ 自动类型推导 代码量 较多(需写action) 较少(类似Vuex 5) 响应式原理 不可变数据…

UE5网络联机函数

Find Sessions Create Session Join Session Destroy Session Steam是p2p直接联机 一、steam提供的测试用AppId AppId是steam为每一款游戏所设定的独有标识,每一款要上架steam的游戏都会拥有独一无二的AppId。不过为了方便开发者测试,steam提供了游…

Spring Boot 监控:AOP vs Filter vs Java Agent

01前言 在 高并发 微服务 中, 传统 手动埋点(System.currentTimeMillis())就像用体温计量火箭速度——代码侵入、重复劳动、维护爆炸。 下文是无侵入、高精度、全链路 监控 API 耗时,全程不碰业务代码的方案! 02实战&…

基于Android的电子记账本系统

博主介绍:java高级开发,从事互联网行业多年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了多年的毕业设计程序开发,开发过上千套毕业设计程序,没有什么华丽的语言&#xff0…

7月17日日记

结束了数学建模之后的这两天一直在紧张的复习,但是说实话效率有点低,因为可能觉得自己找到了两个小时速成课,觉得无所谓了,所以有点放松了。在宿舍杰哥和林雨城却一直在复习,感觉他们的微积分和线性代数复习的都比我好…

Linux下SPI设备驱动开发

一.SPI协议介绍1.硬件连接介绍引脚含义:DO(MOSI):Master Output, Slave Input,SPI主控用来发出数据,SPI从设备用来接收数据。DI(MISO):Master Input, Slave Output,SPI主控用来发出数据,SPI从设…

用Dify构建气象智能体:从0到1搭建AI工作流实战指南

作为一名Agent产品经理,我最近在负责气象智能体的建设项目。传统气象服务面临三大痛点:数据孤岛严重(气象局API、卫星云图、地面观测站等多源数据格式不一)、响应链路长(从数据采集到预警发布需人工介入多个环节)、交互体验单一(用户只能被动接收标准化预警,无法个性化…

Android NDK ffmpeg 音视频开发实战

文章目录接入FFmpeg1.下载FFmpeg 源码2.编译FFmpeg.so库异常处理3.自定义FFmpeg交互so库创建4.配置CMakeLists.txt5.CMakeLists.txt 环境配置6.Native与Java层调用解码器准备接入FFmpeg 1.下载FFmpeg 源码 FFmpeg官网地址 2.编译FFmpeg.so库 移动 FFmpeg 源码文件夹至 Andr…

使用 go-redis-entraid 实现 Entra ID 无密钥认证

1、依赖与安装 步骤命令说明安装(或升级) go-redis v9.9go get github.com/redis/go-redis/v9latestentraid 必须 ≥ 9.9.0安装 go-redis-entraidgo get github.com/redis/go-redis-entraid自动拉取 transit 依赖 2、认证方式一览 方式说明创建 Stream…