一、数据库的4个基本概念
1)数据(data): 数据是数据库中存储的基本对象
2)数据库(DataBase,DB): 数据库是长期存储在计算机内,有组织的、可共享的大量数据的集合
3)数据库管理系统(DataBase Management System,DBMS): 数据库管理系统是位于用户与操作系统之间的一层数据管理的系统软件
4)数据库系统(DataBase System,DBS): 数据库系统是由数据库、数据库管理系统、应用程序和数据库管理员(DBA)组成的存储、管理、处理和维护数据的系统
二、两类数据模型
数据模型是对现实世界数据特征的抽象,也就是说数据模型是用来描述数据、组织数据和对数据进行操作的。根据模型应用的不同目的,将模型分为两大类。
第一类概念模型:也称信息模型,按用户观点来对数据和信息建模,主要用于数据库设计,最常用的表示方法是E-R图 (实体-联系方法,Entity Relationship approach)
第二类逻辑模型和物理模型: 逻辑模型主要包括关系模型、层次模型和网状模型等,按计算机系统的观点对数据建模,主要用于数据库管理系统的实现;物理模型是对数据最底层的抽象,描述数据在系统内部的表示方式和存取方法,或在磁盘或磁带上的存储方式和存取方法,是面向计算机系统的。
数据模型的3个组成要素
数据结构:描述数据库的组成对象以及对象之间的关系;
数据操作:对数据库中各种对象(型)的实例(值)允许执行的操作的集合,包括操作以及有关的操作规则;
数据的完整性约束条件:一组完整性规则。
关系模型
关系模型是指用二维表的形式表示实体和实体间联系的数据模型。
ps:关系的每一个分量必须是一个不可分的数据项,即不允许表中还有表。
三、数据库系统的三层模式和两层映像
模式是数据库中全体数据的逻辑结构和特征的描述,它仅仅涉及型的描述,不涉及具体的值。
三级模式
1)外模式:也称子模式或用户模式,是数据库用户的数据视图。外模式通常是模式的子集,因此有多个外模式,用外模式DDL来定义外模式。
2)(逻辑)模式:数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共视图。一个数据库只有一个模式,用模式DDL来定义模式。
3)内模式:也称存储模式,一个数据库只有一个内模式,是数据结构和存储方式的描述,是数据在数据库内部的组织方式。
为了能够在系统内部实现这三个抽象层次的联系和转换,DBMS在三级模式之间提供了二层映像
两层映像
外模式/模式映像:一个模式可以有多个外模式。当(逻辑)模式改变时,由DBA对该映像做相应改变,而无需改变外模式。应用程序是根据外模式写的,因此也不用变,这称为数据的逻辑独立性。
模式/内模式映像:一个数据库只有一个内模式。当数据库的存储结构改变时,由DBA对该映像做相应改变,而无需改变模式,进而也无需改变应用程序,这称为数据与程序的物理独立性。
四、索引
索引是对数据库表中一或多个列的值进行排序的结构,是帮助高效获取数据的数据结构。
1、数据库创建索引的好处:
第一,通过创建唯一性的索引,可以保证数据库表中每一行数据的唯一性。
第二,可以大大加快数据的检索速度,这也使创建索引的最主要的原因。
第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面。
第四,在使用分组和排序子句进行数据检索时,同样可以显著的减少查询中查询中分组和排序的时间。
第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
2、增加索引的不利的方面:
第一,创建索引和维护索引需要消耗时间,这种时间随着数量的增加而增加
第二,索引需要占物理空间,除了数据表占据数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要额空间就会更大。
第三,当对表中的数据进行增加,删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
所以,添加索引不一定可以增快查询速度。
3、应该哪些列建立索引:
在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构。
在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度。
在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的。
在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间。
在经常使用在where子句中的列上面创建索引,加快条件的判断速度。
4、哪些列不应该创建索引:
在查询中很少使用或者作为参考的列不应该创建索引。
对于那些只有很少数据值的列也不应该增加索引(比如性别,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度)。
对于那些定义为text,image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。
当修改性能远远大于检索性能时,不应该创建索引,因为修改性能和检索性能是矛盾的。
创建索引的方法:直接创建和间接创建(在表中定义主键约束或者唯一性约束时,同时也创建了索引)。
5、基本的索引类型:
唯一性索引和复合索引。
唯一性索引保证在索引列中的全部数据是唯一的,不会包含冗余数据。
复合索引就是一个索引创建在两个列或者多个列上,可以减少一在一个表中所创建的索引数量。
五、异常情况(并发一致性问题)
丢失数据:
1、 两个事务都对一个数据进行修改,一个先修改,另一个随后修改,第二个修改覆盖了第一个的修改。
2、 两个事务更新相同的数据源,如果第一个事务被提交,第二个却被撤销,那么连同第一个事务做的更新也被撤销。
读脏数据:T1对一个数据做了修改,T2读取这一个数据。若T1执行 ROLLBACK 操作,则 T2读取的结果和第一次的结果不一样。当一个事务读取另一个事务尚未提交的修改时,产生脏读。
不可重复读(非重复读):T1读取一个数据,T2对该数据做了修改。如果 T1再次读取这个数据,此时读取的结果和第一次读取的结果不同。一个事务对同一行数据重复读取两次,但是却得到了不同的结果。同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集。
**幻影读:**T1读取某个范围的数据,T2在这个范围内插入新的数据,T1再次读取这个范围的数据,此时读取的结果和和第一次读取的结果不同。事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查询中未出现的数据(这里并不要求两次查询的SQL语句相同)。这是因为在两次查询过程中有另外一个事务插入数据造成的。
解决方案:
在并发环境下,事务的隔离性很难保证,因此会出现很多并发一致性问题。产生并发不一致性问题的主要原因是破坏了事务的隔离性。解决方法是通过并发控制来保证隔离性,并发控制可以通过封锁来实现。
六、锁
**共享锁(S锁):**用于只读操作(SELECT),锁定共享的资源。共享锁不会阻止其他用户读,但是阻止其他的用户写和修改。
**更新锁(U锁):**用于可更新的资源中。防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。
独占锁(X锁,也叫排他锁):一次只能有一个独占锁用在一个资源上,并且阻止其他所有的锁包括共享缩。写是独占锁,可以有效的防止“脏读”。
七、三个范式
1、第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、字符型、逻辑型、日期型等。
2、第二范式(2NF):数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),即所有非关键字段都完全依赖于任意一组候选关键字。
3、**第三范式(3NF):**在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。传递函数依赖,指的是如 果存在"A → B → C"的决定关系,则C传递函数依赖于A。
八、事务及其特性
事务是并发控制的基本单位,它是一个操作序列,这些操作要么都执行,要么都不执行,是一个不可分割的工作单位。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性。
A,atomacity:原子性,事务必须是原子工作单元,对于数据的执行要不是全部执行,要不都不执行。如果只执行一个子集,可能会破坏事务的总体目标。
C,consistency:一致性。事务将数据库从一种一致状态变为下一种一致状态
I,isolation:隔离性。由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。换句话说,一个事务的影响在该事务提交前对其他事务都不可见。
D,durability,持久性:事务完成之后,它对于系统的影响是永久性的。该修改即使出现致命的系统故障也将一直保持。