赞
踩
基本内容
1.关系模型概述?
2.什么是关系?
3.关系模型中的完整性约束
重点与难点
●一组概念的区分:围绕关系的相关概念,如域、笛卡尔积,关系,关系模式,关键字/键/码,外码/外键,主码/主键,主属性与非主属性。●三个完整性:实体完整性,参照完整性和用户自定义的完整性;
1.形象地说,一个关系(relation)就是一个Table≥关系模型就是处理Table的,
它由三个部分组成:
2.关系模型的三个要素
**基本结构:**Relation/Table
**基本操作:**Relation Operator
基本的:∪(并, UNION)、-(差,DIFFERENCE)、×(广义积,PRODUCT)、σ(选择, SELECTION)、π(投影, PROJECTION)。
扩展的:∩(交, lNTERSECTION)、⨝ (连接,JOIN)、÷(除, DIVISION)运算
**完整性约束:**实体完整性、参照完整性和用户自定义的完整性
3.关系模型与关系数据库语言的关系
关系运算:关系代数和关系演算;关系演算:元组演算和域演算。
基于关系代数设计的数据库语言(ISBL):用计算机可识别的符号表征关系代数的运算符号
基于元组演算(基于逻辑)设计的数据库语言(Ingres系统的QUEL):用计算机可识别的符号表征元组演算的运算符号
基于域演算设计的数据库语言示例:(QBE: Query By Example)
“列”的取值范围“域”,域(Domain):一组值的集合,这组值具有相同的数据类型
集合中元素的个数称为域的基数(Cardinality)
笛卡尔积:“元组”及所有可能组合成的元组:
元组(d, d2 ,… , d)的每一个值d,叫做一个分量(component)
元组(d1 , d2 ,… , dn)是从每一个域任取一个值所形成的一种组合,笛卡尔积是所有这种可能组合的集合,即:笛卡尔积是由n个域形成的所有可能的n-元组的集合
若 D i 的基数为 m i ,则笛卡尔积的基数,即元组个数为 m 1 × m 2 × m 3 . . . × m n 若D_{i}的基数为m_{i},则笛卡尔积的基数,即元组个数为m_{1}×m_{2}×m_{3}...×m_{n} 若Di的基数为mi,则笛卡尔积的基数,即元组个数为m1×m2×m3...×mn
(1)关系:
ps:由于关系的不同列可能来自同一个域,为区分,需要为每一列起一个名字,该名字即为属性名。
比如,域名为女人,跳出来的那些元组的那一列名是妻子
(2)关系模式(schema)
关系可用R(A:D1,Az:D2 ,… ,An:Dn )表示,可简记为R(Af ,A2 , … ,An ),这种描述又被称为关系模式或表标题(head)
R是关系的名字,A是属性, D,是属性所对应的域, n是关系的度或目(degree),关系中元组的数目称为关系的基数(cardinality)
例如下图的关系为一3目关系,描述为
家庭(丈夫:男人,妻子:女人,子女:儿童)或家庭(丈夫,妻子,子女)
关系模式R(A:D1,A2:D2 , …,An:Dn)中属性向域的映象在很多DBMS中一般直接说明为属性的类型、长度等,
(3)关系模式与关系
例,我们定义一个域为Person =所有男人、女人和儿童的集合={李基,张鹏,王芳,刘玉,李健,张睿,张峰},则下述“家庭”关系的三个列将来自同一个域Person,因此需要不同的属性名“丈夫”“妻子”“子女”以示区分。
列位置互换性:区分哪一列是靠列名
行位置互换性:区分哪一行是靠某一或某几列的值(关键字/键字/码字)>关系是以内容(名字或值)来区分的,而不是属性在关系的位置来区分
属性不可再分特性:又被称为关系第一范式
候选码(Candidate Key)/候选键
关系中的一个属性组,其值能唯一标识一个元组,若从该属性组中去掉任何一个属性,它就不具有这一性质了,这样的属性组称作候选码。
有时,关系中有很多组候选码,例如:
学生(S#, Sname, Sage, Sclass, Saddress)
其中属性S#是候选码,属性组(Sname, Saddress)也是候选码(同名同地址的两个同学是不存在的)
主码(Primary Key)/主键
当有多个候选码时,可以选定一个作为主码。
DBMS以主码为主要线索管理关系中的各个元组。
主属性与非主属性
包含在任何一个候选码中的属性被称作主属性,而其他属性被称作非主属性
如“选课”中的S#,C#为主属性,而Sname, Cname, Grade则为非主属性;
最简单的,候选码只包含一个属性
最极端的,所有属性构成这个关系的候选码,称为全码(All-Key)。
比如:关系“教师授课”(T#,C#)中的候选码(T#,C#)就是全码。
外码(Foreign Key)/外键
关系R中的一个属性组,它不是R的候选码,但它与另一个关系S的候选码相对应,则称这个属性组为R的外码或外键。
例如“合同”关系中的客户号不是候选码,但却是外码。因它与“客户”关系中的候选码“客户号”相对应。
两个关系通常是靠外码连接起来的。
关系的主码中的属性值不能为空值。
空值:不知道或无意义的值;
空值:不知道、不存在或无意义的值;
在进行关系操作时,有时关系中的某属性值在当前是填不上的,比如档案中有“生日不详”、“下落不明”、“日程尚待公布”等,这时就需要空值来代表这种情况。关系模型中用‘?'表征
数据库中有了空值,会影响许多方面,如影响聚集函数运算的正确性,不能参与算术、比较或逻辑运算等
意义:关系中的元组对应到现实世界相互之间可区分的一个个个体,这些个体是通过主码来唯一标识的;若主码为空,则出现不可标识的个体,这是不容许的。
如果关系R1的外码Fk与关系R2的主码Pk相对应,则R1中的每一个元组的Fk值或者等于R2中某个元组的Pk值,或者为空值
意义:如果关系R1的某个元组t1参照了关系R2的某个元组t2,则t2必须存在
例如关系Student在D#上的取值有两种可能:
√空值,表示该学生尚未分到任何系中√若非空值,则必须是Dept关系中某个元组的D#值,表示该学生不可能分到一个不存在的系中
用户针对具体的应用环境定义的完整性约束条件
如S#要求是10位整数,其中前四位为年度,当前年度与他们的差必须在4以内
实体完整性和参照完整性由DBMS系统自动支持
DBMS系统通常提供了如下机制:
1)它使用户可以自行定义有关的完整性约束条件
2)当有更新操作发生时,DBMS将自动按照完整性约束条件检验更新操作的正确性,即是否符合用户自定义的完整性
基于集合,提供了一系列的关系代数操作:并、差、笛卡尔积(广义积)、选择、投影和更名等基本操作
以及交、连接和关系除等扩展操作,是一种集合思维的操作语言。
某些关系代数操作,如并、差、交等,需满足**“并相容性”**
并相容性:
参与运算的两个关系及其相关属性之间有一定的对应性、可比性或意义关联性
定义:关系R与关系S存在相容性,当且仅当:
(1)关系R和关系S的属性数目必须相同;
(2)对于任意i,关系R的第i个属性的域必须和关系S的第i个属性的域相同
假设:R(A1,A2, … , An),S(B1,B2,… ,Bm)
R和S满足并相容性: n=m并且 Domain(Ai)= Domain(Bi)
并相容性的示例
STUDENT(SID char(10), Sname char(8),Age char(3))PROFESSOR(PID char(10), Pname char(8), Age char(3))
关系STUDENT与关系PROFESSOR是相容的,因为:(1)关系R和关系S的属性数目都是3
(2)关系R的属性SID与关系S的属性PID的域都是char(10)(3)关系R的属性Sname与关系S的属性Sname的域都是char(8)
(4)关系R的属性Age与关系S的属性Age的域都是char(3)
Rx S=SxR:Rx S为R中的每一个元组都和S中的所有元组进行串接。SxR为S中的每一个元组都和R中的所有元组进行串接。结果是相同的。
两个关系R和S,它们的属性个数分别为n和m(R是n度关系,S是m度关系)
则笛卡尔积Rx S的属性个数=n+m。即元组的前n个分量是R中元组的分量,后m个分量是S中元组的分量(RXS是n+m度关系).
两个关系R和S,它们的元组个数分别为x和y(关系R的基数x, S的基数y),
则笛卡尔积RxS的元组个数=x×y。(RX S的基数是x×y).
定义:给定一个关系R,投影运算结果也是一个关系,记作 ∏ ∏ ∏A®,它从关系R中选出属性包含在A中的列构成。
投影操作从给定关系中选出某些列组成新的关系,而选择操作是从给定关系中选出某些行组成新的关系
(1)“Θ-连接”操作:
(2)“等值-连接”操作
(3)“自然连接”操作:
除法运算经常用于求解“查询.…全部的/所有的.…”问题
前提条件:给定关系R(A1 ,A2y… ,An)为n度关系,关系S(B1,B2,… ,Bm)为m度关系。如果可以进行关系R与关系S的除运算,当且仅当:
属性集{ B1,B2,…,Bm}是属性集{A1,A2,…,An}的真子集,即m<n。
示例:
R÷S的结果与S组成的任何元组都在R当中
示例:
关系演算形式:并运算定义中: R∪s= {r l r∈R ∨r ∈S },再如,差运算定义中:R-S= {r l r∈R ∧r∉S }
关系演算是以数理逻辑中的谓词演算为基础的
关系演算是描述关系运算的另一种思维方式
SQL语言是继承了关系代数和关系演算各自的优点所形成的
按照谓词变量的不同,可分为关系元组演算和关系域演算
关系元组演算是以元组变量作为谓词变量的基本对象
关系域演算是以域变量作为谓词变量的基本对象
例如
“检索出年龄不是最小的所有同学”
关系运算的安全性
“不产生无限关系和无穷验证的运算被称为是安全的”
关系代数是一种集合运算,是安全的
√集合本身是有限的,有限元素集合的有限次运算仍旧是有限的。
关系演算不一定是安全的
例如:{t |¬(R(t))},{ t | R(t)∨ t[2]>3}可能表示无限关系
R(t)是有限的,但不在R(t)中的元素就可能是无限的,后例中的t[2]>3是无限的。
SQL语言是集DDL、DML和DCL于一体的数据库语言
SQL语言主要由以下9个单词引导的操作语句来构成,但每一种语句都能表达复杂的操作请求
模式的定义和删除,包括定义Database, Table, View, Index,完整性约束条件等,也包括定义对象(RowType行对象,Type列对象)
各种方式的更新与检索操作,如直接输入记录,从其他Table(由SubQuery建立)输入
各种复杂条件的检索,如连接查找,模糊查找,分组查找,嵌套查找等
各种聚集操作,求平均、求和、.…等,分组聚集,分组过滤等
安全性控制:授权和撤消授权
建立数据库包括两件事:定义数据库和表(使用DDL),向表中追加元组(使用DML )
DDL: Data Definition Language
DDL通常由DBA来使用,也有经DBA授权后由应用程序员来使用
数据库(Database)是若干具有相互关联关系的Table/Relation的集合
数据库可以看作是一个集中存放若干Table的大型文件
create database的简单语法形式:
create database 数据库名;
create table简单语法形式:
Create table 表名(列名 数据类型[Primary key |Unique] [Not null]
[,列名 数据类型[Not null], ... ]);
“[]”表示其括起的内容可以省略,“|”表示其隔开的两项可取其一
Primary key:主键约束。每个表只能创建一个主键约束。
Unique:唯一性约束(即候选键)。可以有多个唯一性约束。
Not null:非空约束。是指该列允许不允许有空值出现,如选择了Not null表月该列不允许有空值出现。
语法中的数据类型在SQL标准中有定义
建立数据库包括两件事:定义数据库和表(使用DDL),向表中追加元组(使用DML)
DML:Data Manipulation Language
DML通常由用户或应用程序员使用,访问经授权的数据库
insert into简单语法形式:
insert into 表名[(列名[,列名]... ]
values(值[,值],...);
values后面值的排列,须与into子句后面的列名排列一致
若表名后的所有列名省略,则values后的值的排列,须与该表存储中的列名排列一致
Select的简单语法形式:
Select列名[[,列名]...]
From表名
[Where检索条件];
示例:
(1)检索学生表中所有学生的信息
(2)检索学生表中所有学生的姓名及年龄
(3)检索学生表中所有年龄小于等于19岁的学生的年龄及姓名
#(1):
Select S#, Sname, Ssex,Sage, Sclass, D#
From Student ;
Select * From Student ;//如投影所有列,则可以用*来简写
#(2):
Select Sname, Sage //投影出某些列
From Student ;
#(3):
Select Sage, Sname //投影的列可以重新排定顺序
From Student
Where Sage <= 19;
结果唯一性问题
关系模型不允许出现重复元组。但现实DBMS,却允许出现重复元组,但也允许无重复元组。在Table中要求无重复元组是通过定义Primary key或Unique来保证的;而在检索结果中要求无重复元组,是通过DISTINCT保留字的使用来实现的。
结果排序问题
DBMS可以对检索结果进行排序,可以升序排列,也可以降序排列。Select语句中结果排序是通过增加order by子句实现的
order by 列名 [asc | desc]
意义为检索结果按指定列名进行排序,若后跟asc或省略,则为升序;若后跟desc,则为降序。
示例:按学号由小到大的顺序显示出所有学生的学号及姓名
示例:检索002号课大于80分的所有同学学号并按成绩由高到低顺序显示
Select S#, Sname From Student
Order By S# ASC;
Select S# From sc Where C#='002' and Score > 80
Order By Score DESC ;
模糊查询问题
比如检索姓张的学生,检索张某某;这类查询问题,Select语句是通过在检索条件中引入运算符like来表示的
含有like运算符的表达式
列名 [not] like“字符串”
匹配规则:
“%”匹配零个或多个字符
“_”匹配任意单个字符
“\”转义字符,用于去掉一些特殊字符的特定含义,使其被作为普通字符看待,如用“%”去匹配字符%,用\_去匹配字符_
示例:按“001”号课成绩由高到低顺序显示所有学生的姓名(二表连接)
Select Sname From Student, SC
Where Student.S# = SC.S# and SC.C# ='001'
Order By Score DESC;
多表连接时,如两个表的属性名相同,则需采用表名.属性名方式来限定该属性是属于哪一个表
示例:按‘数据库’课成绩由高到低顺序显示所有同学姓名(三表连接)
Select Sname From Student, SC, Course
Where Student.S# = SC.S# and sC.C# = Course.C#
and Cname =‘数据库’
Order By Score DESC;
重名之处理
连接运算涉及到重名的问题,如两个表中的属性重名,连接的两个表重名(同一表的连接)等,因此需要使用别名以便区分
Select列名 as 列别名[[,列名 as 列别名]...]
From 表名1 as 表别名1,表名2 as 表别名2,...
Where 检索条件;
上述定义中的as可以省略
当定义了别名后,在检索条件中可以使用别名来限定属性
0-连接之不等值连接
示例:求有薪水差额的任意两位教师
Select T1.Tname as Teacher1,T2.Tname as Teacher2
From Teacher T1,Teacher T2
Where T1.Salary > T2.Salary;
示例:求年龄有差异的任意两位同学的姓名
Select S1.Sname as Stud1, S2.Sname as Stud2
From Student S1,Student S2
Where S1.Sage > S2.Sage ;
元组新增Insert命令有两种形式
单一元组新增命令形式:插入一条指定元组值的元组
insert into 表名 [(列名[,列名].….)]
values (值[,值]...);
批数据新增命令形式:插入子查询结果中的若干条元组。待插入的元组由子查询给出。
insert into 表名[(列名[,列名].….)]
子查询;
示例:新建Table: SCt(S#,C#, Score),将检索到的成绩及格同学的记录新增到该表中
Insert Into SCt(S#, C#, Score)
Select S#, C#, Score From SC
Where Score>=60 ;
示例:追加成绩优秀同学的记录
Insert Into SCt(S#, C#, Score)
Select S#, C#, Score From SC
Where Score>=90 ;
元组删除Delete命令:删除满足指定条件的元组
Delete From 表名[ Where 条件表达式];
如果Where条件省略,则删除所有的元组。
元组更新Update命令:用指定要求的值更新指定表中满足指定条件的元组的指定列的值
Update 表名
Set 列名=表达式|(子查询)
[[,列名=表达式|(子查询)].…. ]
[ Where条件表达式];
如果Where条件省略,则更新所有的元组。
示例:将所有计算机系的教师工资上调10%
Update Teacher
Set Salary = Salary *1.1
Where D# in
(Select D# From Dept Where Dname ='计算机');
修正数据库∶修正数据库的定义,主要是修正表的定义修正基本表的定义
alter table tablename
[add {colname datatype,...}] 增加新列
[drop {完整性约束名}] 删除完整性约束
[modify {colname datatype,..] 修改列定义
示例:在学生表Student(S#,Sname,Ssex,Sage,D#,Sclass)基础上增加二列Saddr, PID
Alter Table Student Add Saddr char[40],PID char[18] ;
撤消基本表
drop table表名
示例:撤消学生表Student
Drop Table Student;
示例:撤消教师表Teacher
Drop Table Teacher;
有些DBMS提供了操作多个数据库的能力,此时在进行数据库操作时需要指定待操作数据库与关闭数据库的功能。
指定当前数据库
use 数据库名;
关闭当前数据库
close 数据库名;
为什么需要子查询?
现实中,很多情况需要进行下述条件的判断
集合成员资格
√某一元素****是否是某一个集合的成员
集合之间的比较
√某一个集合是否包含另一个集合等
集合基数的测试
√测试集合是否为空
√测试集合是否存在重复元组
子查询:出现在Where子句中的Select语句被称为子查询(subquery),子查询返回了一个集合,可以通过与这个集合的比较来确定另一个查询集合。
三种类型的子查询:(NOT)IN-子查询; Θ-Some/Θ-All子查询; (NOT)EXISTS子查询
基本语法:
表达式 [not] in (子查询)
语法中,表达式的最简单形式就是列名或常数。
语义:判断某一表达式的值是否在子查询的结果中。
示例:列出选修了001号课程的学生的学号和姓名
示例:列出没学过李明老师讲授课程的所有同学的姓名
Select S#, Sname From Student
WhereS#in ( Select S# From sc Where C#=‘001');
Select Sname From Student
Where S# not in ( Select S# From SC, Course C, Teacher T
Where T.Tname ='李明' and SC.C# = C.C#
and T.T#= C.T#);
非相关子查询:内层查询独立进行,没有涉及任何外层查询相关信息的子查询
前面的子查询示例都是非相关子查询
相关子查询:内层查询需要依靠外层查询的某些参量作为限定条件才能进行的子查询
外层向内层传递的参量需要使用外层的表名或表别名来限定
示例:求学过001号课程的同学的姓名
Select Sname
From Student Stud
Where S# in ( Select S#
From SC
Where S# = Stud.S# and C# =‘001’);
表达式 Θ some(子查询)
表达式 Θ all(子查询)
语法中,Θ是比较运算符:<,>,>= ,<=,=,>。
示例:找出所有课程都不及格的学生姓名(相关子查询)
Select Sname From Student
Where 60 > all ( Select Score From SC
Where S# =Student.S# );
等价性变换需要注意
如下两种表达方式含义是相同的
表达式 = some(子查询)
表达式in(子查询)
如下两种表达方式含义却是不同的,请注意
表达式 not in (子查询)
表达式 <>some (子查询)
not in等价的是
表达式 <> all (子查询)
基本语法:
[not] Exists (子查询)
语义:子查询结果中有无元组存在
示例:检索学过001号教师主讲的所有课程的所有同学的姓名
Select Sname From Student
Where not exists //不存在
(Select * From Course //有一门001教师主讲课程
Where Course.T# ='001' and not exists //该同学没学过
(Select* From SC
Where S# = Student.S# and C# = Course.C#) );
上述语句的意思:不存在有一门001号教师主讲的课程该同学没学过
示例:求有差额(差额>0)的任意两位教师的薪水差额
示例:依据学生年龄求学生的出生年份,当前是2015年
Select T1.Tname as TR1,T2.Tname as TR2, T1.Salary - T2.Salary
From Teacher T1,Teacher T2
Where T1.Salary > T2.Salary;
Select S.S#, s.Sname, 2015-S.Sage+1 as Syear
From Student S;
SQL提供了五个作用在简单列值集合上的内置聚集函数agfunc,分别是:COUNT、SUM、AVG、MAX、MIN
SQL聚集函数的参数类型、结果作用如下:
求个数、求和、求平均、求最大、求最小
除了count(*)之外所有的聚集函数都忽略其输入集合中的空值。
分组:SQL可以将检索到的元组按照某一条件进行分类,具有相同条件值的元组划到一个组或一个集合中,同时处理多个组或集合的聚集运算。
分组的基本语法:
Select 列名|expr | agfunc(列名)[L,列名 |expr | agfunc(列名)]….]
From 表名1[,表名2...]
[ Where 检索条件 ]
[ Group by 分组条件];
分组条件可以是
列名1,列名2,…
示例:求每一个学生的平均成绩
Select S#, AVG(Score) From SC
Group by S#;
上例是按学号进行分组,即学号相同的元组划到一个组中并求平均值
分组过滤:若要对集合(即分组)进行条件过滤,即满足条件的集合/分组留下,不满足条件的集合/分组剔除。
Having子句,又称分组过滤子句。需要有Group by子句支持,换句话说,没有Group by子句,便不能有Having子句。
Select 列名|expr | agfunc(列名)[[,列名|expr | agfunc(列名)]...]
From 表名 1[,表名2.….]
[ Where检索条件]
[ Group by分组条件[Havinq 分组过滤条件]];
示例:求不及格课程超过两门的同学的学号
Select S# From SC
Where Score < 60
Group by S# Having Count(*)>2;
SQL语言:并运算UNION,交运算INTERSECT,差运算EXCEPT。
基本语法形式:
子查询 {Union [ALL] | Intersect [ALL]| Except [ALL]子查询}
SQL差运算
示例:假定所有学生都有选课,求没学过002号课程的学生学号
Select DISTINCT S# From SC
EXCEPT
Select S# From sC Where C# =‘002';
注意oracle没有except,是minus
通常情况下自动删除重复元组:不带ALL。若要保留重复的元组,则要带ALL。
假设子查询1的一个元组出现m次,子查询2的一个元组出现n次,则该元组在:
子查询1 Union ALL子查询2,出现m +n次
子查询1 Intersect ALL子查询2,出现min(m,n)次
子查询1 Except ALL子查询2,出现max(0, m-n)次
空值检测
is [not ] null
测试指定列的值是否为空值
除is [not] null之外,空值不满足任何查找条件
如果null参与算术运算,则该算术表达式的值为null
如果null参与比较运算,则结果可视为false。在SQL-92中可看成unknown
如果null参与聚集运算,则除count(*)之外其它聚集函数都忽略null
Select列名[[列名].…..]
From表名1 [NATURAL]
[ INNER |{LEFT RIGHT |FULL} [OUTER]]
{ ON连接条件|Using (Colname {, Colname ...}) }
[Where检索条件]...;
示例:求所有教师的任课情况(没有任课的教师也需列在表中)
Select Teacher.T#, Tname, Cname
From Teacher Left Outer Join Course
ON Teacher.T# = Course.T#
Order by Teacher.T# ASC ;
对应概念模式的数据在SQL中被称为基本表(Table),而对应外模式的数据称为视图(View)。视图不仅包含外模式,而且包含其E-C映像。
定义视图
create view view_name[(列名[,列名].….)]
as子查询[with check option]
如果视图的属性名缺省,则默认为子查询结果中的属性名;也可以显式指明其所拥有的列名。
示例:定义一个视图CompStud为计算机系的学生,通过该视图可以将Student表中其他系的学生屏蔽掉
Create View CompStud AS
(Select * From Student
Where D# in ( Select D# From Dept
Where Dname ='计算机'));
使用视图:定义好的视图,可以像Table一样,在SQL各种语句中使用
示例:检索主讲数据库课程的教师姓名,我们可使用Teach
Select T.Tname From Teach T
Where T.Cname ='数据库';
SQL视图更新的可执行性
对于由单一Table子集构成的视图,即如果视图是从单个基本表使用选择、投影操作导出的,并且包含了基本表的主键,则可以更新
撤消视图
Drop View view name
示例:撤消视图Teach
Drop View Teach;
撤消基本表
Drop Table 表名
示例:撤消学生表Student
Drop Table Student;
数据库完整性(DB Integrity)是指DBMS应保证的DB的一种特性–在任何情况下的正确性、有效性和一致性
√广义完整性:语义完整性、并发控制、安全控制、DB故障恢复等
√狭义完整性∶专指语义完整性,DBMS通常有专门的完整性管理机制与程序来处理语义完整性问题。(本讲专指语义完整性)
关系模型中有完整性要求
实体完整性
参照完整性
用户自定义完整性
为什么会引发数据库完整性的问题呢?
不正当的数据库操作,如输入错误、操作失误、程序处理失误等>数据库完整性管理的作用
数据库完整性管理的作用:
防止和避免数据库中不合理数据的出现
DBMS应尽可能地自动防止DB中语义不合理现象
DBMS怎样自动保证完整性呢?
DBMS允许用户定义一些完整性约束规则(用SQL-DDL来定义)
当有DB更新操作时,DBMS自动按照完整性约束条件进行检查,以确保更新操作符合语义完整性
完整性约束条件(或称完整性约束规则)的一般形式
lntegrity Constraint ::=(O,P,A,R)
√ O:数据集合:约束的对象?
列、多列(元组)、元组集合
√P:谓词条件:什么样的约束?
√A:触发条件:什么时候检查?
√R:响应动作:不满足时怎么办?
(1)按约束对象分类:
域完整性约束条件
√施加于某一列上,对给定列上所要更新的某一候选值是否可以接受进行约束条件判断,这是孤立进行的
关系完整性约束条件
√施加于关系/table上,对给定table上所要更新的某一候选元组是否可以接受进行约束条件判断,或是对一个关系中的若干元组和另一个关系中的若干元组间的联系是否可以接受进行约束条件判断
(2)按约束来源分类
结构约束
√来自于模型的约束,例如函数依赖约束、主键约束(实体完整性)、外键约束(参照完整性),只关心数值相等与否、是否允许空值等;
内容约束
√来自于用户的约束,如用户自定义完整性,关心元组或属性的取值范围。例如Student表的Sage属性值在15岁至40岁之间等。
(3)按约束状态分类
静态约束
√要求DB在任一时候均应满足的约束;例如Sage在任何时候都应满足大于0而小于150(假定人活最大年龄是150)。
动态约束
√要求DB从一状态变为另一状态时应满足的约束;例如工资只能升,不能降:工资可以是800元,也可以是1000元;可以从800元更改为1000元,但不能从1000元更改为800元。
列约束:
表约束:
数据库安全性是指DBMS应该保证的数据库的一种特性(机制或手段):免受非法、非授权用户的使用、泄漏、更改或破坏
数据的安全级别:绝密(Top Secret),机密(Secret),可信(Confidential)和无分类(Unclassified)
数据库系统DBS的安全级别:物理控制、网络控制、操作系统控制、DBMS控制
DBMS的安全机制
**自主安全性机制:**存取控制(Access Control)
√通过权限在用户之间的传递,使用户自主管理数据库安全性
强制安全性机制:
√通过对数据和用户强制分类,使得不同类别用户能够访问不同类别的数据
推断控制机制
数据加密存储机制
DBMS怎样自动实现自主安全性呢?
DBMS允许用户定义一些安全性控制规则(用SQL-DCL来定义)
当有DB访问操作时,DBMS自动按照安全性控制规则进行检查,检查通过则允许访问,不通过则不允许访问
AccessRule ::=(S, O, t,P)
√S:请求主体(用户)
√O:访问对象
√ t:访问权利
√P:谓词
{AccessRule }通常存放在数据字典或称系统目录中,构成了所有用户对DB的访问权利;
用户多时,可以按用户组建立访问规则
访问对象可大可小(目标粒度Object granularity):属性/字段、记录/元组、关系、数据库
权利:包括创建、增、删、改、查等
谓词:拥有权利需满足的条件
存储矩阵
视图:视图是安全性控制的重要手段
授权命令(重点)
GRANT {all PRIVILEGES | privilege {,privilege....}}
ON [TABLE] tablename | viewname
TO {public| user-id {, user-id...}]
[WITH GRANT OPTION];
user-id,某一个用户账户,由DBA创建的合法账户
public,允许所有有效用户使用授予的权利
privilege是下面的权利
√ SELECT INSERT |UPDATE| DELETE |ALL PRIVILEDGES
WITH GRANT OPTION选项是允许被授权者传播这些权利
示例:
假定高级领导为Emp0001,部门领导为Emp0021,员工管理员为Emp2001,收发员为Emp5001(均为Userld,也即员工的P#)
Grant All Priviledges ON Employee TO Emp2001;
Grant SELECT ON EmpV2 TO Emp5001 ;
Grant SELECT ON EmpV3Topublic;
Grant SELECT ON EmpV4 TO Emp0021;
收回授权命令
REVOKE {all privilEges | priv {, priv...}} ON tablename / viewname
FROM{public [ user {, user...} ;
示例
revoke select on employee from UserB;
强制安全性通过对数据对象进行安全性分级
绝密(Top Secret),机密(Secret),可信(Confidential)和无分类(Unclassified)
同时对用户也进行上述的安全性分级
从而强制实现不同级别用户访问不同级别数据的一种机制
解释上面,因为高等级用户修改了低等级数据之后就会把数据等级提高,那么低等级用户就不能再修改这个数据了
基本观点:世界是由一组称作实体的基本对象和这些对象之间的联系构成的
实体、属性、联系、关键字/码
参与发生联系的实体的数目,称为联系的度或元。
实体之间的联系有很多种类
二元联系∶—对一、一多和多对多联系
一对一联系**(1:1)∶实体A的实例只能和实体B的一个实例发生联系,反之,实体B的实例也只能和实体A的一个实例发生联系。
一个“经理”只管理一个“商店”,一个“商店”只能有一个“经理”
一对多联系(1:m和m:1):实体A的实例能和实体B的多个实例发生联系,反之,实体B的实例只能和实体A的一个实例发生联系。
一个“画家”可以绘制多幅“作品”,一幅“作品”只能由一个“画家”来完成
多对多联系(m:n)**:实体A的实例可以和实体B的多个实例发生联系,反之,实体B的实例也可以和实体A的多个实例发生联系。
一位同学可以选学多门课程,一门课程可由多个人来选学
联系的**基数(Cardinalities)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。