关系模型的完整性约束条件包括三大类:
实体完整性、参照完整性和用户自定义的完整性
实体完整性的相关定义——
有多个候选码,可选定其中一个为主键
候选码的诸属性为主属性,不包含在任何候选码中的属性称为非主属性或非码属性
外键:如果关系模式R中的某属性集不是R的主键,而是另一个关系R1的主键,则属性集是关系模式R的外键
以另一个关系的外键作主键的表被称为主表,具有外键的表称为主表的从表。
事务:用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位
1NF的定义
(2) 插入异常
(3) 删除异常
(4) 修改异常
2NF的定义
定义5.6 若关系模式R∈1NF,并且每一个非主属性都完全函数依赖于R的码,则R∈2NF。
例:SLC(Sno, Sdept, Sloc, Cno, Grade) ∈1NF
SLC(Sno, Sdept, Sloc, Cno, Grade) ∈2NF
SC(Sno, Cno, Grade) ∈ 2NF
SL(Sno, Sdept, Sloc) ∈ 2NF
3NF的定义
定义5.8 关系模式R<U,F> 中若不存在这样的码X、属性组Y及非主属性Z(Z Y), 使得X→Y,Y → X,Y→Z,成立,则称R<U,F> ∈ 3NF。
例, SL(Sno, Sdept, Sloc) ∈ 2NF
SL(Sno, Sdept, Sloc) ∈ 3NF
SD(Sno, Sdept) ∈ 3NF
DL(Sdept, Sloc)∈ 3NF
若R∈3NF,则R的每一个非主属性既不部分函数依赖于候选码也不传递函数依赖于候选码。
即:如果R∈3NF,则R也是2NF。
BCNF
设关系模式R<U,F>∈1NF,如果对于R的每个函数依赖X→Y,若Y不属于X,则X必含有候选码,那么R∈BCNF。
每一个决定属性集(因素)都包含(候选)码
所有非主属性都完全函数依赖于每个候选码
所有主属性都完全函数依赖于每个不包含它的候选码
没有任何属性完全函数依赖于非候选码的任何一组属性
FD中所有的决定因素都包含了R的一个候选码
SJP(S,J,P) FD={SJ→P,JP→S}
S:学生;J:课程;P:名次
(S,J),(J,P)都是候选码,都由2个属性组成,而且是相交的。
该关系模式种没有属性对码的传递依赖和部分依赖,所以属于3NF
除了(S,J),(J,P)之外没有其他决定因素,所以也属于BCNF
如何快速求候选码
将R(U,F)的所有属性分组
L型:只在F的函数依赖左边出现的属性
R型:只在F的函数依赖右边出现的属性
LR型:在F的函数依赖左右两边都出现的属性
N型:在F的函数依赖中没有出现的属性
候选码一定包括L型,N型
一定不包括R型
可能包括LR型,将LR型与L和N型组合在一起判断
确定该属性组合是否是可以唯一确定U中其他属性,并且其任何真子集都不能再唯一确定U中其他属性
索引:
索引是对数据库中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库中的特定信息
代价:
1)增加数据库的存储空间
2)插入和修改数据时要花费较多的时间(因为索引也要随之变动)
数据库创建索引的作用:
创建索引可以大大提高系统的性能
1)通过创建索引唯一性索引,可以保证数据库表中每一行数据的唯一性
2)可以大大加快数据的检索速度
3)可以加速表和表之间的连接,特别是实现数据的完整性方面特别有意义
4)在使用分组(group by)和排序(order by)字句进行数据检索时,同样可以减少查询中分组和排序的时间
5)通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能
哪些列中应该使用索引
1)经常需要检索的列上创建索引
2)作为主键的列上创建索引,强制该列的唯一性和组织表中的数据的排列结构
3)连接的列,加快连接速度
4)经常需要排列的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序的查询时间
5)经常需要根据范围进行搜索的列上创建索引
6)经常使用where子句中的列上面创建索引,加快条件的判断速度
SQL语句
数据查询(select)、数据定义(create、drop、alter)、数据操纵(insert、update、delete)、数据控制(grant、revoke)
数据查询
实体完整性、参照完整性和用户自定义的完整性
实体完整性的相关定义——
primary key;unique + not null;identity
CREATE TABLE SC(
Sno CHAR(5) ,
Cno CHAR(3) ,
Grade real,
Primary key (Sno, Cno),
Foreign key(sno) references student(sno),
Foreign key(cno) references course(cno));
有多个候选码,可选定其中一个为主键
候选码的诸属性为主属性,不包含在任何候选码中的属性称为非主属性或非码属性
外键:如果关系模式R中的某属性集不是R的主键,而是另一个关系R1的主键,则属性集是关系模式R的外键
以另一个关系的外键作主键的表被称为主表,具有外键的表称为主表的从表。
事务:用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位
事务具有四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持续性(Durability)ACID
原子性
整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性
一个事务可以封装状态改变(除非它是一个只读的)。事务必须始终保持系统处于一致的状态,不管在任何给定的时间
并发事务有多少
隔离性
隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为
串行
化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。
持续性
在事务完成以后,该事务对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
1NF的定义
如果一个关系模式R的所有属性都是不可分的基本数据项,则R∈1NF。
第一范式是对关系模式的最起码的要求。不满足第一范式的数据库模式不能称为关系数据库。
(1) 数据冗余(2) 插入异常
(3) 删除异常
(4) 修改异常
2NF的定义
定义5.6 若关系模式R∈1NF,并且每一个非主属性都完全函数依赖于R的码,则R∈2NF。
例:SLC(Sno, Sdept, Sloc, Cno, Grade) ∈1NF
SLC(Sno, Sdept, Sloc, Cno, Grade) ∈2NF
SC(Sno, Cno, Grade) ∈ 2NF
SL(Sno, Sdept, Sloc) ∈ 2NF
3NF的定义
定义5.8 关系模式R<U,F> 中若不存在这样的码X、属性组Y及非主属性Z(Z Y), 使得X→Y,Y → X,Y→Z,成立,则称R<U,F> ∈ 3NF。
例, SL(Sno, Sdept, Sloc) ∈ 2NF
SL(Sno, Sdept, Sloc) ∈ 3NF
SD(Sno, Sdept) ∈ 3NF
DL(Sdept, Sloc)∈ 3NF
若R∈3NF,则R的每一个非主属性既不部分函数依赖于候选码也不传递函数依赖于候选码。
即:如果R∈3NF,则R也是2NF。
BCNF
设关系模式R<U,F>∈1NF,如果对于R的每个函数依赖X→Y,若Y不属于X,则X必含有候选码,那么R∈BCNF。
每一个决定属性集(因素)都包含(候选)码
所有非主属性都完全函数依赖于每个候选码
所有主属性都完全函数依赖于每个不包含它的候选码
没有任何属性完全函数依赖于非候选码的任何一组属性
FD中所有的决定因素都包含了R的一个候选码
SJP(S,J,P) FD={SJ→P,JP→S}
S:学生;J:课程;P:名次
(S,J),(J,P)都是候选码,都由2个属性组成,而且是相交的。
该关系模式种没有属性对码的传递依赖和部分依赖,所以属于3NF
除了(S,J),(J,P)之外没有其他决定因素,所以也属于BCNF
如何快速求候选码
将R(U,F)的所有属性分组
L型:只在F的函数依赖左边出现的属性
R型:只在F的函数依赖右边出现的属性
LR型:在F的函数依赖左右两边都出现的属性
N型:在F的函数依赖中没有出现的属性
候选码一定包括L型,N型
一定不包括R型
可能包括LR型,将LR型与L和N型组合在一起判断
确定该属性组合是否是可以唯一确定U中其他属性,并且其任何真子集都不能再唯一确定U中其他属性
索引:
索引是对数据库中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库中的特定信息
代价:
1)增加数据库的存储空间
2)插入和修改数据时要花费较多的时间(因为索引也要随之变动)
CREATE UNIQUE INDEX Stusno ON Student(Sno desc);
Alter TABLE Student DROP INDEX Stusno;
数据库创建索引的作用:
创建索引可以大大提高系统的性能
1)通过创建索引唯一性索引,可以保证数据库表中每一行数据的唯一性
2)可以大大加快数据的检索速度
3)可以加速表和表之间的连接,特别是实现数据的完整性方面特别有意义
4)在使用分组(group by)和排序(order by)字句进行数据检索时,同样可以减少查询中分组和排序的时间
5)通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能
哪些列中应该使用索引
1)经常需要检索的列上创建索引
2)作为主键的列上创建索引,强制该列的唯一性和组织表中的数据的排列结构
3)连接的列,加快连接速度
4)经常需要排列的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序的查询时间
5)经常需要根据范围进行搜索的列上创建索引
6)经常使用where子句中的列上面创建索引,加快条件的判断速度
SQL语句
数据查询(select)、数据定义(create、drop、alter)、数据操纵(insert、update、delete)、数据控制(grant、revoke)
数据查询
SELECT [ALL|DISTINCT]<目标列表达式>[,<目标列表达式>]...
FROM<表名或视图名>[,<表名或视图名>]...
[WHERE <条件表达式>]
[GROUP BY<列名1>[HAVING <条件表达式>]]
[ORDER BY<列名2>[ASC|DESC]]
定义基本表
CREATE TABLE <表名> (<列名><数据类型>[列级完整性约束条件]
[,<列名><数据类型>[列级完整性约束条件]]
...
[,<表级完整性约束条件>]);
修改基本表
ALTER TABLE <表名>
[ADD <新列名><数据类型>[完整性约束]]
[DROP <完整性约束>]
[MODIFY COLUMN <列名><数据类型>]
删除基本表
DROP TABLE <表名> [cascade|restrict];
插入元组
INSERT INTO table1(field1,field2...)
VALUES(value1,value2...);
修改数据
UPDATE table1
SET field1=value1,field2=value2
WHERE 范围
删除数据
DELETE
FROM table1
WHERE 范围;
设计概念结构的四类方法
自顶向下
自底向上
逐步扩张
混合策略
按照规范设计方法,将数据库设计分为6个阶段
需求分析
概念结构设计
逻辑结构设计
物理结构设计
数据库实施
数据库运行和维护