个人主页:SueWakeup
系列专栏:学习技术栈
个性签名:保留赤子之心也许是种幸运吧
目录
本系列传送门
1. 什么是数据库?
2. 为什么使用数据库
3. 数据库的分类
4. NoSQL 与关系型数据库的比较
5. 主流的 NoSQL产品
5.1 键值对(K-V)存储
5.2 列族存储
5.3 文档型存储
5.4 图形数据库
6. 数据库结构
7. SQL 语句分类
8. SQL语句的执行流程
9. MyISAM 和 InnoDB 的区别
10. 数据库设计三大范式
11. MySQL的表约束
非空约束
唯一性约束
主键约束
外键约束
检查约束
注:手机端浏览本文章可能会出现 “目录”无法有效展示的情况,请谅解,点击侧栏目录进行跳转
本系列传送门
1. 数据库排名
2.【MySQL】数据库开篇
3.【MySQL】索引篇
4.【MySQL】事务篇
5.【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 | 关系型数据库 | |
---|---|---|
优点 |
|
|
缺点 |
|
|
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值,必须给定具体的数据
添加:
alter table 表名 modify test_student char(10) not null;
删除:
alter table 表名 modify 列名 类型
唯一性约束
unique约束的字段,具有唯一性,不可重复,但可以为null
添加:
alter table 表名 add unique(表字段名,字段,字段,字段);
删除:
alter table 表名 drop index 唯一约束名;
主键约束
表中的一个或多个字段,它的值用于唯一的表示表中的某一条记录
添加:
alter table 表名 add primary key(表的字段名,字段,字段);
删除:
alter table 表名 drop primary key;
外键约束
某个字段添加外键约束之后,该字段称为外键字段,外键字段中每个数据都是外键值
添加:
alter 表名 add constraint N1 foreign key(表字段名)references 父表(父表字段名);
删除:
alter table 表名 drop foreign key 外键名;
检查约束
(目前MySQL不支持,Oracle支持)