【MySQL数据库】视图 + 三范式
视图
视图的基本介绍
MySQL中的视图(View)是一种虚拟的表,其内容是从一个或多个基本表中检索出来的。视图可以简化复杂的查询操作,提高查询效率,同时也可以对敏感数据进行安全性控制。下面是关于MySQL视图的一些基本知识:
视图的基本操作
1.创建视图:
create view view_name as
select col1, col2, ...
from tbname
where condition;
创建的视图就是select查询的结果构成的一张表,有时候查询比较复杂但又比较常用,我们就可以创建视图来指向这个“临时表”,这样也不用每次都执行一组查询语句了,能够提高查询效率。
这里as作引用,而非起别名。【创建视图涉及两个算法:合并算法、临时表算法】
2.更新视图:
视图分为可更新视图和不可更新视图:
在MySQL中,视图默认是不可更改的,要更新视图的数据,需要满足一定条件:
1.如果视图包含聚合函数、distinct、group by、union等操作,通常不可更新。
因为这些操作改变了原始数据的结构,数据库无法确定如何将修改应用到基表
2.如果视图中使用了join,尤其是多表连接,可能也无法更新,特别涉及多个基表时。
更新可能会导致数据不一致问题。
3.检查约束或计算列也可能影响可更新性。
如果视图中的列是计算得出的,没有对应的基表列,那么就无法更新这样的列。
-- 可更新视图
create view abc as
select * from emp;insert into abc(empno) values(111);update abc set empno=222 where empno=111;
insert into dept_emp(empno) values(111);--不可更新视图
create view abc2 as
select deptno,count(*) from emp group by deptno;insert into abc2(deptno) values(111);
3.查看视图:
我们所说的查询视图是查询视图的结构,而不是内容,如果要查询视图的内容,我们只需要从视图中查询数据即可。
-- 查询视图的结构
show create view view_name;
4.删除视图:
drop view view_name;
5.替换视图:
在创建视图时,如果视图名称已存在,可以使用 OR REPLACE 来替换已有的视图定义:
create or replace view view_name as
select ...
6.查看所有视图:
show full tables in 数据库名 where table_type like 'view';
7.安全权限:
在MySQL中,可以使用 GRANT 和 REVOKE 语句为用户赋予或撤销对视图的访问权限:
GRANT SELECT ON database_name.view_name TO 'username'@'hostname';
REVOKE SELECT ON database_name.view_name FROM 'username'@'hostname';
以上是关于MySQL视图的一些基本知识,视图是一个非常有用的数据库对象,可以简化查询操作,提高数据安全性,并且能够更好地组织和管理数据。
三范式
第一范式(1NF):原子性
第一范式是最基础的,确保原子性,没有重复列。
比如:订单表在拆分商品到多个列的问题。
-- 错误示例:商品列包含多个值(违反原子性)
CREATE TABLE orders (order_id INT PRIMARY KEY,customer_name VARCHAR(50),products VARCHAR(200) -- 存储如 "商品A, 商品B, 商品C"
);-- 根据1NF修改后:
CREATE TABLE orders (order_id INT PRIMARY KEY,customer_name VARCHAR(50)
);CREATE TABLE order_items (order_item_id INT PRIMARY KEY,order_id INT,product_name VARCHAR(100),FOREIGN KEY (order_id) REFERENCES orders(order_id)
);
第二范式(2NF):解决部分依赖
第二范式主要解决部分依赖的问题(含有联合主键时导致的),强调非主属性完全依赖主键(所以必须要有主键,那么唯一性就是说要有主键。)
比如:一个订单明细表,其中产品名依赖于产品ID,而产品ID又依赖于订单ID,导致部分依赖。
-- 错误示例:订单明细表中,产品名称仅依赖产品ID,而非整个主键(order_id + product_id)
CREATE TABLE order_items (order_id INT,product_id INT,product_name VARCHAR(100), -- 仅依赖 product_id,而非 (order_id, product_id)quantity INT,PRIMARY KEY (order_id, product_id)
);-- 将产品信息独立为表,消除部分依赖
CREATE TABLE products (product_id INT PRIMARY KEY,product_name VARCHAR(100)
);CREATE TABLE order_items (order_id INT,product_id INT,quantity INT,PRIMARY KEY (order_id, product_id),FOREIGN KEY (product_id) REFERENCES products(product_id)
);
第三范式(3NF):消除传递依赖
第三范式主要消除传递依赖的问题,确保非主属性不依赖其它非主属性,这个和第二范式的完全依赖有点像。
比如:用户表中地址依赖于城市,而城市又依赖于国家,这就会导致传递依赖。需要拆分。
-- 错误示例:用户地址依赖于城市,城市依赖于国家(传递依赖)
CREATE TABLE users (user_id INT PRIMARY KEY,username VARCHAR(50),country VARCHAR(50),city VARCHAR(50), -- 依赖 countryaddress VARCHAR(100) -- 依赖 city
);-- 将国家、城市拆分为独立表
CREATE TABLE countries (country_id INT PRIMARY KEY,country_name VARCHAR(50)
);CREATE TABLE cities (city_id INT PRIMARY KEY,city_name VARCHAR(50),country_id INT,FOREIGN KEY (country_id) REFERENCES countries(country_id)
);CREATE TABLE users (user_id INT PRIMARY KEY,username VARCHAR(50),city_id INT,address VARCHAR(100),FOREIGN KEY (city_id) REFERENCES cities(city_id)
);
===结语===
虽然设计上有三大范式,但是我们要避免过度范化导致性能问题,或者理解上的偏差。三范式的坏处就是查询语句比较复杂时,需要多表查询,多表之间不存在索引对应关系,所以效率上会降低。所以根据实际应用的权衡利弊,我们还有一些反范式化的情况。
三范式的核心思想:
1.减少冗余
2.逻辑清晰
3.消除异常:更新异常、插入异常、删除异常
更新异常:修改一处数据需要同步修改多处
插入异常:因依赖关系无法插入部分数据
删除异常:删除数据时意外丢失其它信息
感谢大家!
相关文章:
【MySQL数据库】视图 + 三范式
视图 视图的基本介绍 MySQL中的视图(View)是一种虚拟的表,其内容是从一个或多个基本表中检索出来的。视图可以简化复杂的查询操作,提高查询效率,同时也可以对敏感数据进行安全性控制。下面是关于MySQL视图的一些基本…...
STM32学习笔记之存储器映射(原理篇)
📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…...
如何通过数据可视化提升管理效率
通过数据可视化提升管理效率的核心方法包括清晰展示关键指标、及时发现和解决问题、支持决策优化。其中,清晰展示关键指标尤为重要。通过数据可视化工具直观地呈现关键绩效指标(KPI),管理者能快速、准确地理解业务现状,…...
数据结构:利用递推式计算next表
next 表是 KMP 算法的核心内容,下面介绍一种计算 next 表的方法:利用递推式计算 如图 6.3.1 所示,在某一趟匹配中,当对比到最后一个字符的时候,发现匹配失败(s[i] ≠ t[j])。根据 BF 算法&…...
每日算法-250326
83. 删除排序链表中的重复元素 题目描述 思路 使用快慢指针遍历排序链表。slow 指针指向当前不重复序列的最后一个节点,fast 指针用于向前遍历探索。当 fast 找到一个与 slow 指向的节点值不同的新节点时,就将 slow 的 next 指向 fast,然后 …...
trino查询mysql报Unknown or incorrect time zone: ‘Asia/Shanghai‘
问题 trino查询mysql时报Error listing schemas for catalog mysql: java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.,trino的日志中看到Unknown or incorrect time zone…...
java学习笔记7——面向对象
关键字:static 类变量 静态变量的内存解析: 相关代码: public class ChineseTest {public static void main(String[] args) {System.out.println(Chinese.nation); //null 没赋值前System.out.println(Chinese.nation); //中国 静态变量赋值…...
leetcode day31 453+435
453 用最少数量引爆气球 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可以沿着 x 轴从不同点 完全垂直 地…...
C++三大特性之继承
1.继承的概念及定义 回忆封装 C Stack类设计和C设计Stack对比。封装更好:访问限定符类的数据和方法放在一起 -> 避免底层接口的暴露,数据更加的安全,程序的耦合性更高迭代器的设计,封装了容器底层结构,在不暴露底层…...
PyQt QDoubleSpinBox控件用法详解
QDoubleSpinBox 是 PyQt中用于输入浮点数的控件,支持键盘输入和上下箭头调整数值。与QtSpinBox不同,QtSpinBox是用于输入整数的控件。 关键属性和方法 QDoubleSpinBox 的关键属性和方法如下表所示: 方法/属性说明setRange(min, max)设置数…...
解决Vmware 运行虚拟机Ubuntu22.04卡顿、终端打字延迟问题
亲测可用 打开虚拟机设置,关闭加速3D图形 (应该是显卡驱动的问题,不知道那个版本的驱动不会出现这个问题,所以干脆把加速关了)...
查询Marklogic数据库,因索引配置造成的返回数据count不同的问题
查询Marklogic数据库,因索引配置造成的返回数据count不同的问题 一,问题: 目前由两个MarkLogic DB,其中A表示所有的数据库统称,包含于BCD; 调用查询接口,通过A和B入口且相同的查询条件去查询B…...
ctfshow做题笔记—栈溢出—pwn73、pwn74
目录 一、pwn73(愉快的尝试一下一把梭吧!) 二、pwn74(噢?好像到现在为止还没有了解到one_gadget?) 前言: 抽空闲时间继续学习,记录了两道题,pwn74卡了几天哈哈。 一、pwn73(愉快的尝试一下一把梭吧!) …...
026-zstd
zstd 以下为Zstandard(zstd)压缩算法从原理到代码实现的技术调研报告,结合流程图、结构图及完整C代码实现: 一、核心原理与技术架构 1.1 算法原理 Zstd基于LZ77衍生算法与熵编码(FSE/Huffman)的混合架构&…...
AF3 quat_to_rot函数解读
AlphaFold3 rigid_utils 模块的 quat_to_rot 函数的功能是把四元数转换为旋转矩阵,函数利用预定义的四元数到旋转矩阵的转换表 _QTR_MAT 来简化计算。 理解四元数到旋转矩阵的转换 源代码: _quat_elements = ["a", "b", "c", "d"]…...
Elasticsearch 的搜索功能
Elasticsearch 的搜索功能 建议阅读顺序: Elasticsearch 入门Elasticsearch 搜索(本文) 1. 介绍 使用 Elasticsearch 最终目的是为了实现搜索功能,现在先将文档添加到索引中,接下来完成搜索的方法。 查询的分类&…...
Vala编成语言教程-构造函数和析构函数
构造函数 Vala支持两种略有不同的构造方案:我们将重点讨论Java/C#风格的构造方案,另一种是GObject风格的构造方案。 Vala不支持构造函数重载的原因与方法重载不被允许的原因相同,这意味着一个类不能有多个同名构造函数。但这并不构成问题&…...
Mybatis-plus配置动态多数据源
前言:微服务架构中,有些模块中可能不同组件用不同数据源,或者做数据库主从集群需要读写分离,动态切换数据源,或不同方法需要不同数据源就需要一个快捷方便的方法。引用动态数据源组件dynamic-datasource-spring-boot-s…...
CSS+JS 堆叠图片动态交互切换
结合DeepSeek提供的代码,终于实现了堆叠两张图片动态循环切换,以下是代码: 通过绝对定位放了两张图片 <div class"col-lg-5" style"z-index: 40; position: relative;"><img src"images/banner_1.png&quo…...
内存检查之Valgrind工具
内存检查之Valgrind工具 Author: Once Day Date: 2025年3月26日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章请查看专栏: Linux实践记录_Once-Day的博客-CSD…...
强大的AI网站推荐(第四集)—— Gamma
网站:Gamma 号称:展示创意的新媒介 博主评价:快速展示创意,重点是展示,在几秒钟内快速生成幻灯片、网站、文档等内容 推荐指数:🌟🌟🌟🌟🌟&#x…...
javafx项目结构+代码规范
javafx项目 1. 新建项目,对项目的理解 jdk: 是 Java Development ToolKit 的简称,也就是 Java 开发工具包。JDK 是整个 Java 的核心,包括 Java 运行环境(Java Runtime Envirnment,简称 JRE)&a…...
国外计算机证书推荐(考证)(6 Sigma、AWS、APICS、IIA、Microsoft、Oracle、PMI、Red Hat)
文章目录 证书推荐1. 六西格玛 (6 Sigma)2. 亚马逊网络服务 (AWS)3. 美国生产与库存控制学会 (APICS)4. 内部审计师协会 (IIA)5. 微软 (Microsoft)6. 甲骨文 (Oracle)7. 项目管理协会 (PMI)8. 红帽 (Red Hat) 证书推荐 1. 六西格玛 (6 Sigma) 介绍:六西格玛是一种…...
黑盒测试与白盒测试详解
黑盒测试和白盒测试是软件测试中两种最基本的测试方法,它们在测试视角、测试重点和适用场景等方面存在显著差异。 一、黑盒测试 1. 基本概念 黑盒测试又称功能测试,将软件视为一个"黑盒子",不关心内部结构和实现细节,只…...
准确--配置服务器文件数
某些系统可能在 /etc/security/limits.d/ 目录下有额外配置覆盖全局设置。检查是否存在冲突文件: ls /etc/security/limits.d/如果有文件(如 90-nproc.conf 或 90-nofile.conf),需编辑或删除这些文件中的冲突配置。 确保系统启用…...
《熔化焊接与热切割作业》考试注意事项
考试前的准备 携带必要的证件和材料:考生需携带身份证、准考证等有效证件,以及考试所需的焊接工具、材料等。确保证件齐全,避免因证件问题影响考试。 提前检查焊接设备和工具:在考试前,考生应仔细检查焊接设备和工具是…...
ROS2的发展历史、核心架构和应用场景
以下是对**ROS2(Robot Operating System 2)**的发展历史、核心架构和应用场景的详细解析,覆盖其技术演变、关键特性和生态系统: 一、ROS2的诞生背景:从ROS1到ROS2 1. ROS1的历史与局限 ROS1的起源: 2007年…...
[unity 点击事件] 区域响应点击事件,排除子节点区域,Raycast Target 应用
当我打开一个二级弹窗后,希望可以通过点击弹窗以外的区域来关闭该弹窗。一开始我是在弹窗主节点上挂载了一个 button 组件,该 button 注册的点击事件中关闭该弹窗。在子节点(一个背景图)的image组件上启用 Raycast Target 选项&am…...
鸿蒙生态全解析:应用适配分享
一、鸿蒙系统的技术底座与适配挑战 HarmonyOS NEXT 作为全场景分布式操作系统,通过统一的技术底座和声明式开发框架,实现了 "一次开发,多端部署" 的跨设备协同能力。其核心优势在于: 弹性部署架构:一套系统…...
el-select 可搜索下拉框 在ios、ipad 无法唤出键盘,造成无法输入
下一篇:el-select 可搜索下拉框,选中选项后,希望立即失去焦点,收起键盘,执行其他逻辑 【效果图】:分组展示选项 >【去界面操作体验】 首先,通过 夸克浏览器的搜索: el-select 在 ipad 输入框…...
