SueWakeup
个人主页:SueWakeup
系列专栏:学习技术栈
个性签名:保留赤子之心也许是种幸运吧
本文封面由 凯楠📸友情提供
目录
[1. 什么是数据库?](#1. 什么是数据库?)
[2. 为什么使用数据库](#2. 为什么使用数据库)
[3. 数据库的分类](#3. 数据库的分类)
[4. NoSQL 与关系型数据库的比较](#4. NoSQL 与关系型数据库的比较)
[5. 主流的 NoSQL产品](#5. 主流的 NoSQL产品)
[5.1 键值对(K-V)存储](#5.1 键值对(K-V)存储)
[5.2 列族存储](#5.2 列族存储)
[5.3 文档型存储](#5.3 文档型存储)
[5.4 图形数据库](#5.4 图形数据库)
[6. 数据库结构](#6. 数据库结构)
[7. SQL 语句分类](#7. SQL 语句分类)
[8. SQL语句的执行流程](#8. SQL语句的执行流程)
[9. MyISAM 和 InnoDB 的区别](#9. MyISAM 和 InnoDB 的区别)
[10. 数据库设计三大范式](#10. 数据库设计三大范式)
[11. MySQL的表约束](#11. MySQL的表约束)
注:手机端浏览本文章可能会出现 "目录"无法有效展示的情况,请谅解,点击侧栏目录进行跳转
本系列传送门
1. 什么是数据库?
数据库指长期存放在计算机内,有组织、可共享的大量数据的集合,是一个数据"仓库"。
2. 为什么使用数据库
- **结构化:**数据在数据库中的存储依靠二维表结构逻辑存储数据,可以参考数据原有的依赖关系和结构关系去存储数据
- **共享性:**多个用户可以共同分享计算机数据库中的数据资源,从而实现数据的高效共享性
- **独立性:**存储在数据库的数据和应用程序之间相互独立、互不影响。
- **安全性:**数据库在安全性的控制有很多措施,比如访问数据库时对用户的口令,用户的权限进行限制,以及对数据的存储进行限制
3. 数据库的分类
| 数据库分类 | 数据模型 | 举例 |
| 关系型(RDBMS) | 表格 | Oracle、MySQL、SQL Server等 |
| 非关系型(NoSQL) | 键值对(K-V)、文档(Document)、列族(Column Family)、图形 | MongoDB、Redis、Elasticsearch(引擎)、Cassandra等 |
| 对象型 | 以对象作为基本单位 支持面向对象的数据建模和操作 | db4o、Versant等 |
| XML | XML文档 | eXist、BaseX等 |
| 图形 | 图形结构数据 适用于网络关系、社交网络等场景 | Neo4j、FlockDB等 |
| 内存 | 存储在内存中 | SAP HANA、MemSQL等 |
时间序列 | 存储时间序列 | InfluxDB、Prometheus等 |
---|
4. NoSQL 与关系型数据库的比较
| | NoSQL | 关系型数据库 |
| 优点 | 1. 简单易部署,低成本 2. 查询速度快(数据存储于缓存中) 3. 存储数据多样 4. 扩展性好 | 1. 技术又成熟又早,提供丰富的技术支持和生态系统 2. 标准化查询语句,对数据的操作和管理更方便灵活 3. 支持事务管理,确保数据的一致性、完整性和持久性 4. 存储基础数据,对数据的管理直观简单 |
缺点 | 1. 相较于关系型数据库发展时间短,维护工具和资料有限 2. 不遵循 SQL 标准,提升了学习和使用成本 3. 不提供关系型数据库对事务的处理 | 1. 相较于 NoSQL 成本高 2. 存储在磁盘中,速度不及 NoSQL 3. 仅能存储基础数据 4. 类似 join 的多表查询机制限制了扩展性 |
---|
5. 主流的 NoSQL产品
5.1 键值对(K-V)存储
- 相关产品:Redis、Voldemort、Berkeley DB
- 典型应用:内容缓存,主要用于处理大量数据的高访问负载。
- 数据模型:一系列键值对
- 优势:快速查询
- 劣势:存储的数据缺少结构化
5.2 列族存储
- 相关产品:Cassandra,HBase,Riak
- 典型应用:分布式的文件系统
- 数据模型:以列族式存储,将同一列数据存在一起
- 优势:查找速度快,可扩展性强,更容易进行分布式扩展
- 劣势:功能相对局限
5.3 文档型存储
- 相关产品:MongoDB、Elasticsearch、CouchDB
- 典型应用:Web应用(与 K-V 类似,V是结构化的)
- 数据模型:一系列键值对
- 优势:数据结构要求不严格
- 劣势:缺乏统一的查询语法
5.4 图形数据库
- 相关产品:Neo4j、InfoGrid、Infinite Graph
- 典型应用:社交网络数据模型:图结构
- 优势:利用图结构相关算法
- 劣势:需要对整个图做计算才能得出结构,不容易做分布式的集群方案
6. 数据库结构
- **数据库(Database):**以文件的形式存放在磁盘上,即对应于一个或多个物理文件
- **数据表(Table):**由一组数据记录组成,数据库中的数据以表为单位进行组织
- **字段(Field):**也称域。表中的每一类称为一个字段。每个字段都有相应的描述信息。
- **记录(Record):**表中的每一行称为一个记录,由若干字段组成。
- **索引(Index):**一种特殊类型的表,其中含有关键字段的值和指向表实际记录位置的指针,可以提高访问数据库的效率。
- **SQL语句:**结构化查询语句命令,用于存取数据以及查询、更新和管理关系数据库系统,同时也是数据库脚本文件的扩展名。
7. SQL 语句分类
| 名词 | 解释 | 命令 |
| DDL (数据定义语言) | 定义和管理数据对象, 如数据库,数据表等 | CREATE、DROP、ALTER |
| DML (数据操作语言) | 用于操作数据库对象中所包含的数据 | INSERT、UPDATE、DELETE |
| DQL (数据查询语言) | 用于查询数据库数据 | SELECT |
DCL (数据控制语言) | 用来管理数据库的语言,包括管理权限及数据更改 | GRANT、COMMIT、ROLLBACK |
---|
8. SQL语句的执行流程
- **词法分析:**将SQL语句按照语法规则分割成一个个单词(tokens)。例如,SELECT、FROM、WHERE、AND、OR等都是一个单词。
- **语法分析:**对单词进行语法解析,判断SQL语句是否符合语法规则。如果不符合,则会抛出语法错误。
- **语义分析:**对SQL语句进行语义分析,如表名、列名、数据类型等,确保它们都是正确的。如果有错误,会抛出语义错误。
- **查询优化:**对SQL语句进行优化,如选择最优的执行计划、使用索引等来提高查询效率。
- **执行SQL:**根据优化后的执行计划,执行SQL语句。执行过程中,会进行锁定、缓存、排序、分组等操作。
- **返回结构:**执行完成后,将结果返回给客户端。如果是查询语句,则会返回查询结果;如果是更新语句,则会返回受影响的行数。
9. MyISAM 和 InnoDB 的区别
- MySQL 5.5 版本之前,MyISAM 引擎是 MySQL 的默认存储引擎,但是,MyISAM 不支持事务和行级锁,而且最大的缺陷就是崩溃后无法安全恢复;
- MySQL 5.5 版本之后,MySQL 引入了 InnoDB(事务型数据库引擎),MySQL 5.5 版本后默认的存储引擎为 InnoDB;
| | MyISAM | InnoDB |
| 外键 | 不允许创建外键 | 支持外键 |
| 事务 | 不支持事务 | 事务型数据库引擎,可以使用 Commit 和 Rollback 语句 |
| 并发 | 只支持表级锁(table-level locking) | 支持行级锁(row-level locking)和表级锁,默认为行级锁; |
| 备份(缓存) | 只缓存索引,不缓存真实数据 | 支持在线热备份(缓存索引和真实数据) |
崩溃恢复 | MyISAM 崩溃后发生损坏的概率比 InnoDB 高很多,而且恢复的速度也更慢。 |
---|
10. 数据库设计三大范式
数据库设计范式是数据库在设计过程中,需要遵守的设计准则,避免数据冗余;
特殊情况不一定要三个范式都满足,数据库设计看重需求与性能,需求>性能>表结构
- 第一范式(1NF): 每个字段都是最小字段,具有原子性,不可再分; 确保每列保持原子性
- 第二范式(2NF): 每张表必须存在主键,并且其它字段也必须与主键直接依赖,不能仅仅与主键的某一部分依赖(联合主键) 确保表中的每列都和主键相关
- 第三范式(3NF): 每个字段不能与主键间接依赖,每张表只保存一种数据,表和表之间使用外键关系关联; 确保每列都和主键列直接相关,而不是间接相关
11. MySQL的表约束
约束实际上就是表中数据的限制条件,目的是为了保证表中的记录完整和有效
约束种类:
非空约束
用not null约束的字段不能为null值,必须给定具体的数据
添加:
sql
alter table 表名 modify test_student char(10) not null;
删除:
sql
alter table 表名 modify 列名 类型
唯一性约束
unique约束的字段,具有唯一性,不可重复,但可以为null
添加:
sql
alter table 表名 add unique(表字段名,字段,字段,字段);
删除:
sql
alter table 表名 drop index 唯一约束名;
主键约束
表中的一个或多个字段,它的值用于唯一的表示表中的某一条记录
添加:
sql
alter table 表名 add primary key(表的字段名,字段,字段);
删除:
sql
alter table 表名 drop primary key;
外键约束
某个字段添加外键约束之后,该字段称为外键字段,外键字段中每个数据都是外键值
添加:
sql
alter 表名 add constraint N1 foreign key(表字段名)references 父表(父表字段名);
删除:
sql
alter table 表名 drop foreign key 外键名;
检查约束
(目前MySQL不支持,Oracle支持)