边复习边整理。
数据库
数据库管理系统(DBMS):用来管理数据库的系统。
- 关系型数据库:二维表格(即关系)来存储数据,一个表对应一个关系,用SQL来查询数据。如MySQL、PostgreSQL、SQLLite等。
- 非关系型数据库(NoSQL):不基于传统关系模型的数据库系统,通常用于处理大规模、非结构化或半结构化的数据。如文档型数据库(MongoDB、CouchDB),键值型数据库(Redis),图形数据库,列式数据库,时序数据库(InfluxDB、IoTDB),分布式数据库等等。
数据库中的三模式架构是数据库系统设计中的一个经典概念,用于分离数据库的用户视图、逻辑设计和物理实现。它由外模式(子模式)、模式(概念模式)和内模式三部分组成。在三层模式体系结构中数据独立性是指数据库系统在某一层次模式上的改变不会使它的上一层模式也发生改变的能力。正是三级模式间的两层映像保证了数据库系统中的数据具有较高的数据独立性。数据独立性包括数据逻辑独立性和数据物理独立性。
数据模型的三要素包括数据结构、数据操作和数据约束条件。 数据结构用于描述系统的静态特性,是所研究对象类型的集合,也是刻画一个数据模型性质最重要的方面。数据操作用于描述系统的动态特性,包括对数据库中各种对象(型)的实例(值)允许执行的操作的集合,以及相关的操作规则。数据完整性约束条件是一组完整性规则,确保数据的准确性,限定符合数据模型的数据库状态以及状态的变化,以保证数据的正确、有效和相容。数据模型是数据特征的抽象,从抽象层次上描述了系统的静态特征、动态行为和约束条件,为数据库系统的信息表示与操作提供一个抽象的框架。
数据库的设计步骤:需求分析、概念结构设计、逻辑结构设计、物理设计、数据库实施、数据库运行和维护。
关系数据库
“关系”这个概念指的是 表,而不是两个表之间的关系。在关系数据库中,关系就是数据库中的一个 表。表是由行和列组成的二维数据结构,每一行表示一个数据实例(元组),每一列表示该数据实例的一个属性(字段)。所以,关系是表的数学模型。“关系”这一术语来源于 集合论 和 关系代数。数学中,关系通常是由多个元素组成的集合,每个元素由一个元组(tuple)表示。元组中的各个元素代表属性值。
关系代数中的物种基本运算:并、差、选择、投影、笛卡尔积。并和差的两个关系的关系模式要一致,不是属性的并,而是元组的并!!
自然连接是笛卡尔积和选择的结合,还有全外链接,左外链接(会返回左表中的所有记录,如果右表中没有匹配的行,则结果中右表的部分将显示为NULL)、右外连接。
关系数据库的特征:ACID,原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability),分别由DBMS的事务管理、完整性、并发控制、恢复管理子系统实现。
SQL语言
SQL是介于关系代数和关系演算之间的语言,关系演算的表达性大于关系代数。
- 数据定义语言(DDL):CREATE、ALTER、DROP
- 数据操作语言(DML):SELECT、INSERT、UPDATE、DELETE
- 数据控制语言(DCL):GRANT、REVOKE
T-SQL(Transact-SQL) 是SQL Server的编程语言,它是SQL(结构化查询语言)的增强版本,主要用于与Microsoft SQL Server数据库进行交互。 T-SQL在标准SQL的基础上增加了许多功能,包括事务控制、异常和错误处理、行处理以及声明的变量等,除了以上三种,还有如下两种:
- 事务管理语言:用于管理事务,确保数据的一致性和完整性。
- 流程控制语言:包括条件语句、循环语句等,用于编写复杂的逻辑。
索引
- 基于存储结构分:B+树索引、哈希索引、全文索引
- 基于逻辑结构分:主键索引、唯一索引、普通索引、组合索引
索引是数据库中一种用于加速数据查询的数据结构,可以看作是数据库表的一种辅助结构。索引存储了某些列的值及其对应的数据记录地址,类似于图书的目录,帮助快速定位目标数据。
也就是说,创建一个数据库的时候并没有索引,即使是创建了一个表,也只会在声明PRIMARY KEY时自动生成一个主键索引,声明UNIQUE时自动生成一个唯一索引,普通索引都是要自己创建的,目的就是为了加速查询。如果确定只有等值查询,可以用哈希索引,或者要全文搜索的时候用全文索引,否则一般都默认用B+树,对于查找某个范围的元组非常高效,如BETWEEN、<等等,ORDER BY也很高效,因为叶子结点都是按顺序存储的。具体B+树如何实现的就不在这里赘述了,但是一定要去学!对于理解数据库的索引很重要很重要。
数据库的完整性
为维护数据库的完整性,DBMS必须能够:
- 提供定义完整性约束条件的机制,一般由SQL的DLL语句来实现,作为数据库模式的一部分存入数据字典中。
- 提供完整性检查的方法,在insert、update、delete语句执行完后开始检查
- 违约处理,当违背完整性约束条件时,采取的动作(拒绝或级联)
有四种完整性:
- 实体完整性(Entity Integrity):主键唯一且不为NULL
- 参照完整性(Referential Integrity):外键的值要么为空要么为另一个表的主键。违约处理:拒绝(NO ACTION)执行(默认策略)、级联(CASCADE)操作、设置为空值(SET NULL)
- 用户定义完整性(User-defined Integrity):也称域完整性(Domain Integrity),指用户定义的数据库表中的列必须满足某种特定的数据类型或约束,包括取值范围、精度等规定。
完整性约束条件作用的对象可以为列级、元组级、关系级三类。三类对象的状态既可为动态也可为静态。
数据库范式
属性和键:
- 超键:能唯一标识元组的属性集叫做超键。
- 候选键:如果超键不包括多余的属性,那么这个超键就是候选键。
- 主键:用户可以从候选键中选择一个作为主键。
- 外键:如果数据表R1中的某属性集不是R1的主键,而是另一个数据表R2的主键,那么这个属性集就是数据表R1的外键。
- 主属性:包含在任一候选键中的属性称为主属性。
- 非主属性:与主属性相对,指的是不包含在任何一个候选键中的属性。
六大范式:
- 第一范式:表中每个字段的值必须具有原子性
- 第二范式:实体的属性完全依赖主键,不能只依赖主键的部分属性。
- 第三范式:非主键属性之间不能有依赖关系,必须相互独立。
- BC范式:称为修正的第三范式,或扩充的第三范式。消除主属性对于码的部分与传递函数依赖。只有一个候选键,或者它的每个候选键都是单属性。
- 第四范式:消除非平凡且非函数依赖的多值依赖。
- 第五范式:也叫完美范式,每一个连接依赖均由候选键隐含。
前面的很好理解,对第四范式的理解如下:“非平凡”指的是不是显然成立的,如果X+Y=U或者 Y 是 X 的子集的话,X →→ Y显然成立。“非函数依赖的多值依赖”就是指和其他属性无关的一对多关系,即不管Z(=U-X-Y)取什么值,X对应的一组Y的值都是一样的,比如下面这个关系中,Student→→Course,Student→→Hobby,就不满足4NF,应该分成两个表分别表示学生的课程和学生的爱好。
Student | Course | Hobby
--------|--------|---------
Alice | Math | Painting
Alice | Math | Chess
Alice | English| Painting
Alice | English| Chess
再附一张比较清晰的图:
一般来说,在关系型数据库设计中,最高也就遵循到 BCNF,普遍还是3NF。但也不绝对,有时候为了提高某些查询性能,我们还需要破坏范式规则,也就是反规范化。
数据规范化中的
- 插入异常:应该插入的数据无法插入数据库
- 删除异常:不该删除的数据被错误地删除
- 更新异常:同一个数据需要在多处修改
数据一致性
并发操作带来的数据不一致性问题主要包括丢失修改、不可重复读和脏读。在并发操作中,多个事务可能同时访问和修改同一数据,导致数据的不一致性。具体来说,丢失修改是指一个事务的更新操作被另一个事务的更新操作覆盖,导致第一个事务的修改结果丢失。不可重复读则是指在一个事务内多次读取同一数据时,由于其他事务的修改,导致两次读取的结果不一致。脏读是指一个事务读取了另一个事务未提交的修改数据,这些数据可能最终不会被提交,从而导致读取的数据无效。