数据库系统的三级模式
模式:概念模式或逻辑模式,一个数据库只有一个概念模式。
外模式,:子模式, 一个数据库可以有多个外模式。
内模式,: 存储模式, 一个数据库只有一个内模式。
数据库的二级映像功能:
外模式/模式映像,对应于同一个模式可以有任意多个外模式。
模式/内模式映像, 数据库中只有一个模式,也只有一个内模式,所以模式/内模式映像是唯一的。
范式
关系数据库有六种范式: 1NF > 2NF > 3NF > BCNF > 4NF > 5NF
满足最低要求的范式是1NF。一般说来,数据库只需满足3NF就行了。越高的范式数据库的冗余度就越低。
1NF 第一范式:无重复的列
2NF 第二范式:符合1NF,并且有主键,非主键字段依赖主键
3NF 第三范式:符合2NF,并且非主键属性不能相互依赖
BCNF 符合3NF, 并且主属性不依赖于主属性
4NF 第四范式:符合3NF,并且要求把同一表中的多对多的关系删除
5NF 第五范式:符合4NF,并且将表分割成尽可能小的块,为了排除在表中所有的冗余
聚集索引和非聚集索引
索引系统多采用平衡树B-Tree。
聚集索引中的键值的逻辑顺序决定了表中的相应行的物理顺序。
非聚集索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同。
群集索引通常比非群集索引快
仅在将得到高级别选择行的列上放置非聚集索引。
所有的数据操作语言(DML insert, update, delete, select)语句可以通过索引获益,但是插入删除和更新会因为索引而变慢。索引有助于查询的查找过程,但是任何修改数据的行为将有额外的工作要做。(除了实际数据外,还要维护索引)
索引会占用空间。
仅当索引中的第一类和查询相关时才使用索引。
索引的负面影响和它的正面影响一样多—了解为什么建立索引,以及为什么只建立需要的索引。
索引可为非结构化的XML数据提供结构化的数据性能,但是要记住,和其他索引一样,这会涉及系统开销。
第一,对于那些在查询中很少使用或者参考的列不应该创建索引
第二,对于那些只有很少数据值的列也不应该增加索引。
第三,对于那些定义为text, image和bit数据类型的列不应该增加索引。
第四,当修改性能远远大于检索性能时,不应该创建索引。
事务
使用事务,可以确保需要发生的事情作为一个单元发生,或者什么也不做。
ACID: 原子性,一致性,隔离性和持久性。
事务三种模型: 隐式事务(每一条数据操作语句)、显式事务、自动事务。
并发操作可以带来数据的不一致性:丢失更新,读脏数据,不可重复读,产生幽灵数据。
Join
数据库常见的join方式有三种:inner join、left outter join、right outter join(还有一种full join,因不常用)
inner join:将两表中符合on条件的所有记录都找出来。
Left outter join: 将左表的所有记录列出,右表中只要符合on条件的,与左表记录相拼合,不符合条件的,填以null值。
right outter join: 将右表的所有记录列出,左表中只要符合on条件的,与右表记录相拼合,不符合条件的,填以null值。
锁
避免不一致性的方法和技术就是并发控制。最常用的并发控制技术是封锁技术。
基本的封锁类型有两种 : 排它锁(Exclusive Locks,简称X锁,写锁) 和共享锁(Share Locks,简称S锁,读锁)。
X锁:用于不更改或不更新数据的操作(只读操作),如SELECT 语句。
S锁:用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。确保不会同时同一资源进行多重更新。
sqlserver中还有更新锁,意向锁(意向共享锁,意向排他锁,共享意向排他锁),模式锁(模式修改锁,模式稳定性锁定),批量更新锁。
避免死锁的方法:
按相同的顺序使用对象;使食物尽可能简短并且在一个批处理中;尽可能使用简短并且在一个批处理中;进可能使用最低的事务隔离级别;在同一事务中不允许无限度的终端(用户交互,批处理分离);在控制环境中,使用绑定连接;
故障恢复方法
基本原理:建立数据冗余, 数据转储和日志文件
防止介质故障,可以数据库镜像
数据库高可用性可以采用双机热备(分主从active/standby, 互备active/active)和多点集群技术。
存储过程
存储在数据库中的完成特定功能的SQL语句集,可以通过名字带参数调用执行。
触发器
特殊的存储过程,通过事件(增删改)进行触发而被执行的。其在表中数据发生变化是自动强制执行。
常见的有两种:after(for) 表示执行代码后执行触发器,instead of表示执行代码前,用已经写好的触发器代替你的操作。