Mysql杂志(一)
这个 我相信大家都有一定了解了,也应该都用过,主包开这个篇章就是给大伙补充一些平常用不到或者有点印象的知识,总的来说更加符合有一定的开发基础的,就当作一篇杂志来看。
数据库的分类
关系型数据库(RDBMS)
那到底什么是关系型呢?特点就是数据以二维表(行和列)的形式存储有严格的表结构,然后各个表之交会有不同的关系,如多对多、一对一、一对多等,支持原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。代表的数据库就有Mysql、Oracl等。
非关系型数据库
而这个非关系型数据库大家应该也不陌生,如Redis就是非常典型的非关系型数据库,特点就是支持键值对、文档、列族、图等格式,无固定的结构,优点就是速度快嘛因为数据一间没有关系,
对比维度 | 关系型数据库 | 非关系型数据库 |
---|---|---|
数据模型 | 表结构固定(行和列) | 灵活(键值、文档、图等) |
扩展方式 | 垂直扩展(提升单机性能) | 水平扩展(分布式集群) |
事务支持 | 强一致性(ACID) | 最终一致性(BASE)或部分ACID |
查询语言 | SQL(标准化、复杂查询) | 专用API或简化查询语言 |
性能 | 适合复杂查询,高并发下可能瓶颈 | 高吞吐量,适合简单查询 |
典型应用 | 金融系统、传统企业软件 | 互联网应用、大数据、实时分析 |
SQL的分类
1. 数据查询语言(DQL, Data Query Language)
从字面上理解就是查询数据的,如SELECT
:从数据库中检索数据。FROM
:指定查询的表。WHERE
:添加过滤条件。GROUP BY
:分组统计。HAVING
:过滤分组结果。ORDER BY
:排序结果集。这个也是大家平常用的比较多的,因为我们一般来说操作数据库还是以查询为主的,查询比其他的就要复杂很多,什么连表查询、结果计算等等。
2. 数据操作语言(DML, Data Manipulation Language)
这个的作用呢就是直接操作表中的数据的,也就是INSERT
:向表中插入新记录。UPDATE
:修改现有记录。DELETE
:删除记录。MERGE
(UPSERT):合并数据(存在则更新,不存在则插入)。只要是修改了表的数据的都可以叫做数据操作语言。
3.数据定义语言(DDL, Data Definition Language)
这个也很好理解,就是定义或修改数据库或数据库表结构的语言,这个和上面不同的点在于一个是修改结构的,一个是修改结果的。如REATE
:创建数据库对象(表、视图、索引等)。ALTER
:修改对象结构。DROP
:删除对象。TRUNCATE
:清空表数据(保留结构)。RENAME
:重命名对象。
4. 数据控制语言(DCL, Data Control Language)
这个是管理数据库访问权限,通常由数据库管理员(DBA)使用。如GRANT
:授予用户权限。REVOKE
:撤销用户权限。DENY
(SQL Server特有):显式拒绝权限。这个语言我们一般用的很少,因为我们干Java的CURD就行啦,其他的都是DBA来管的。
5.事务控制语言(TCL, Transaction Control Language)
这个就有点滑稽了,有点像卖空调的,主要是管理事务的原子性和一致性,与DML语句配合使用(如INSERT
后COMMIT
)。也就是我们常用的开启事务、提交事务、回滚事务。
范式
范式(Normalization) 是数据库设计中的一套理论规则,用于减少数据冗余、避免异常(如插入/更新/删除异常),并确保数据的一致性和完整性。范式的核心思想是通过合理的表结构设计,使数据库更高效、更易于维护。范式从低到高分为多个级别(1NF → 2NF → 3NF → BCNF → 4NF → 5NF),通常只需满足 前三个范式(1NF、2NF、3NF) 即可满足大多数业务需求。
1. 第一范式(1NF)
每个字段必须是 原子性 的(不可再分)。每张表必须有 主键(唯一标识每行数据)。
不符合1NF(存储多个值) | 符合1NF(拆分字段) |
---|---|
user_id: 1, hobbies: "篮球,音乐" | user_id: 1, hobby: "篮球" user_id: 1, hobby: "音乐" |
一个表只有一个主键,主键的唯一作用是 唯一标识表中的每一行数据。值必须唯一且非空(UNIQUE + NOT NULL
)。一个表只能有一个主键约束(但主键可以由多个字段组成,即复合主键)。但是可以有复合主键和唯一约束(类似于候选主键,主键之下其他之上)。
PRIMARY KEY (order_id, product_id) -- 复合主键
username VARCHAR(50) UNIQUE -- 另一个唯一约束
特性 | 复合主键 | 唯一约束 |
---|---|---|
数量限制 | 一个表只能有一个 | 一个表可以有多个 |
是否允许NULL | 所有字段必须为 NOT NULL | 允许部分字段为 NULL (除非显式禁止) |
用途 | 唯一标识行 | 确保字段值唯一(如邮箱、手机号) |
是否自动创建索引 | 是 | 是 |
2. 第二范式(2NF)
在 1NF 的基础上,所有非主键字段必须完全依赖主键(不能仅依赖主键的一部分)。适用于 联合主键 的表。
不符合2NF(部分依赖) | 符合2NF(拆分表) |
---|---|
order_id (PK), product_name (依赖product_id 而非整个主键) | 拆分为: 1. orders(order_id, product_id) 2. products(product_id, product_name) |
这个怎么理解呢?主包认为的是这样的,一条数据对于Java来说就是一个对象,对象里面的数据必须完全依赖于主键,才能确定是一个完整的对象,就拿上面来说,一个订单里面有商品名称,但是写了商品名称不能确定唯一的商品,因为同名的商品有很多,而且商品名称也不完全依赖订单ID这个主键。
3. 第三范式(3NF)
在 2NF 的基础上,非主键字段不能传递依赖主键(即不能依赖其他非主键字段)。消除冗余数据。
不符合3NF(传递依赖) | 符合3NF(拆分表) |
---|---|
student_id (PK), class_id , class_name (class_name 依赖class_id ,而非直接依赖主键) | 拆分为: 1. students(student_id, class_id) 2. classes(class_id, class_name) |
这个很好理解了,主包就不作过多解释了。
其他高级范式
BCNF(Boyce-Codd范式)
- 比3NF更严格,要求 所有决定因素都必须是候选键(避免主键被非主键字段部分决定)。
- 适用于复杂业务场景(如多对多关系)。
4NF(第四范式)
- 解决 多值依赖 问题(如一个字段依赖多个独立属性)。
- 示例:员工表存储多个技能和多个语言,应拆分为两个表。
5NF(第五范式)
- 解决 连接依赖 问题,确保表能无损分解为更小的表。
- 实际业务中较少使用。
对于范式来说简单的记忆就是,第一原子性不能再分和必有主键,第二就是其他字段完成依赖主键,第三就是不能依赖除主键外的字段。
重点是为什么要满足三范式呢?为的就是消除冗余数据,确保每个数据只存储一次,节约储存空间和保障数据一致性,但是缺点就是必然导致多表关联,让我们查数据的时候增加连表的计算开销,尤其是在分库查看、和索引未命中的情况下性能会降低非常明显。这也是经典的时间复杂度优先和空间复杂度优先度问题,范式化和反范式要在不同的业务场景下选择才是最优解。
总结
本篇主要介绍了数据库的分类、SQL语言的分类以及范式的相关知识。