实体-联系模型
基本概念
- 实体和属性
实体是客观存在并且可以相互区分的任何事物
属性是实体所代表事物具有的某种特性
每个属性都有一定的取值范围,成为该属性的值域
- 实体集和码
实体集是具有相同属性的实体的集合
实体的值是该实体诸属性值的列表
实体集的值是该实体集中所有实体值的集合
其值可以唯一确定实体集中每个实体的属性集称为该实体集的超码
那些其真子集都不是超码的极小超码称为候选码
主码是数据库设计者选中的,是用来区分同一实体集中不同实体的候选码
- 属性分类
属性大部分都是简单的
不能划分成更小的结构
、单值的只能取单个值
、基本的不能由其他属性推导出
复合属性与简单属性对应
是可以划分成更小部分的属性
多值属性对应单值属性
是特定的实体在该属性上可以取多个值的属性
派生属性对应基本属性
的值可以从其他相关属性或实体计算得到,因此又称为计算属性
- 联系与联系集
联系是多个实体之间的相互关系
联系集是相同的类型联系的集合
实体在联系中的作用称为实体的角色
- 联系的类型
联系的类型又称为联系的函数性或映射函数
一对一联系E2与E1中的每个实体最多与另一个实体集中的一个相互关联
一对多联系(1:n联系)
多对一联系(n:1联系)
多对多联系(m:n联系)
- 实体集与参与类型
如果实体集中的每个实体都必须参与联系R,则称实体集对联系R的参与是强制的,或全部参与,否则是随意的,或部分参与
- 联系的属性
联系也可以包含属性,这种情况多出现在多对多联系中
实体联系图
实体-联系模型用
实体-联系图(E-R图)对现实世界建立概念模型
- E-R图包含如下成分
- 椭圆表示属性,属性写在框内
- 矩形表示实体集,实体集名写在框内
- 菱形框表示联系,联系名写在框内
弱实体集
一般地,如果一个实体集的任何属性集都不足以形成该实体集的码,则称该实体集为弱实体集,相反的,存在码的实体集称为强实体集
每个弱实体必须存在依赖于
一个强实体
弱实体集必须与另一个称为标识实体集或属主实体集的强实体集相关联才有意义
将弱实体集与其标识实体集相关联的联系称为标识性联系
分辨符
、部分码
关系数据模型
关系数据库结构
- 关系
域是具有相同类型的值的集合,域中的元素个数为该域的基数,记作
|D|
n个域的笛卡尔集的每个元素称为一个n-元组(简称元组),第i个元素为第i个分量
基数为|D1| * |D2| * ... * |Dn|
域上的关系是笛卡尔积的任意字集
在关系数据库中,关系通常用关系名命名,并被看作一个二维表
表的每一列对应于一个分量。列通常是命名的,称为属性
表的第一行是表头,给出各列的属性名
关系的每一个属性都必须是原子的
- 关系模式
粗略的说,关系模式概念对应于程序设计语言中的类型概念,它是型,定义关系的结构
我们把关系模式简记为R(A1,A2,...,An)
R是关系名,A是属性名
关系的型用关系模式刻画,关系的值即关系在某一时刻的快照,又称为关系实例
关系数据库模式由若干域的定义和一组定义在这些域上的关系模式组成
关系数据库的值就是这些关系模式对应的关系在某一时刻的值
- 关系的码
主码用于表示由多个码中选出的作为唯一识别关系元组的码,而所有的码又称候选码。码中的属性称为主属性,不在任何码中的属性称为非主属性
从E-R数据库到关系模型
基本E-R图的转换
- 属性处理
- 派生属性:
忽略
- 复合属性:
忽略复合属性本省,直接考虑它的成分属性
- 多值属性:
如果多值属性m是实体集E的属性,k是E的主码,则关系Rm的属性由m和K组成
多主码时由m和K1、K2...Kn组成
- 将基本E-R图转换成关系模式
- 每个强实体集用一个关系表示
- 每个弱实体集用一个关系表示
- 每个集合用一个关系表示,但是若实体集于其标识实体集之间的存在依赖联系将被忽略
- 如果两个关系具有相同的码,则可以合并它们
关系数据库标准语言SQL
- SQL语言的特点
- 集多数数据库语言于一身
- 高度非过程化
- 面向集合的操作方式
- 一种语法两种使用方式
- 功能强大,语言简洁
数据定义
- SQl的数据类型
CHAR(n) VAECHAR(n) BIT(n) BIT VARYING(n) INT SMALLINT NUMERIC(p,d) DEC(p,d) FLOAT(n) REAL DATA TIME
- 定义、修改和删除基本表
1.创建基本表
CEARTE TABLE Teachers
(Tno CHAR(7) PRIMARY KEY,
Tname CHAR(10) NOT NULL,
Sex CHAR(2) CHECK (Sex='男' or Sex='女'),
Birthday DATE,
Title CHAR(6),
Dno CHAR(4),
FOREIGN KEY(Dno) REFERENCES Departments(Dno));
2.修改基本表
使用 ALTER TABLE语句修改基本表
向基本表中添加列:
ALTER TABLE <> ADD []<>
对于已存在的列修改缺省值:
ALTER TABLE Student ALTER Sex DEFAULT '女';
ALTER TABLE Student ALTER Sex DROP DEFAULT;
删除已存在的列
ALTER TABLE Courses DROP Pno
3.删除基本表
DROP TABLE <表名> {CASCADE|RESTRICT}
- 建立和删除索引
CREATE [UNIQUE][CLUSTER] INDEX <索引名>
DROP INDEX <索引名>
- 模式定义和删除
CREATE SCHEMA Supply_schema AUTHORRIZATION wangqiang;
DROP SCHEMA <模式名> CASCADE|RESTRICT
数据查询
- select语句的一般形式
SELECT Cno,Cname,Period,Credit FROM Courses;
SELECT * FROM Courses;
SELECT 2016-year(Birthday) AS Age FROM Students;
SELECT DISTINCT 2016-year(Birthday) Age FROM Students;
SELECT Tname,Sex FROM Teachers WHERE Grade<60;
SELECT DISTINCT Sno FROM SC WHERE Grade<60;
SELECT Sname, Speciality FROM Students WHERE year(Birthday) BETWEEN 187 AND 1990;
SELECT Sname, Speciality FROM Students WHERE year(Birthday) NOT BETWEEN 187 AND 1990;
SELECT Sno,Sname FROM WHERE Speciality IN ('软件工程','计算机科学与技术');
SELECT Sno,Sname FROM WHERE Speciality NOT IN ('软件工程','计算机科学与技术');
SELECT Cname FROM Courses WHERE Cname LIKE '数据%'
SELECT Sno,Sname FROM Students WHERE LIKE '李__'
SELECT * FROM Courses WHERE Cname LIKE 'C_%' ESCAPE '';
ESCAPE定义\为转义字符
SELECT * FROM SC WHERE Grade IS NULL;
- 排序和分组
将查询结果排序:
ORDER BY <排序列> [ASC|DESC]{,<排序列>[ASC|DESC]}
- 聚集函数
SELECT COUNT(*) FROM SC WHERE Cno='CS302';
SELECT MIN(Grade),AVG(Grade),MAX(Grade) FROM SC WHERE Cno='CS302';
- 分组
SELECT Sno,AVG(Grade) FROM SC GROUP BY Sno;
SELECT Sno,AVG(Grade) FROM SC GROUP BY Sno HAVING AVG(Grade)>85;
- 连接查询
SELECT Cname,Grade FROM SC,Course WHERE SC.Cno=Courses.Cno AND Sno = '200605098';
SELECT Cname,Grade FROM SC,Course WHERE SC.Cno=Courses.Cno AND Cno='CS202' AND Grade>90;
SELECT Student.Sno,Sname,Cname,Grade FROM Student,SC,Course WHERE Students.Sno=SC.Sno AND SC.Cno=Course.Cno;
- 嵌套查询
IN引出的子查询
SELECT Sno,Sname FROM Students WHERE Sex = '女' AND Speciality IN (
SELECT Speciality FROM Students WHERE Sname ='王丽丽'
);集合的比较引出的子查询
SELECT Sno,Sname,Speciality,Birthday FROM Students WHERE Speciality <> '软件工程' AND Birthday > ALL(
SELECT Birthday FROM Students WHERE Speciality = '软件工程'
);存在量词引出的子查询
SELECT Sno,Sname FROM Students S WHERE EXISTS (
SELECT * FROM SC WHERE Sno=S.Sno AND Cno = 'CS403');
数据更新
- 插入单个元组
INSERT INTO Students VALUES(......);
INSERT INTO Students(......) VALUES(......);
- 插入查询结果
INSERT INTO Cardinf(Card-no,Name,Balance) SELECT Tno,Tname,100.00 FROM Teachers WHERE Dno ='IE';
- 删除
DELETE FROM Students WHERE Sno ='98757';
DELETE FROM Students;
删除所有记录
DELETE FROM SC WHERE Sno IN (
SELECT Sno FROM Students WHERE Speciality = '计算机软件于理论');
- 修改
UPDATE Teachers SET Title = '副教授' WHERE Tno='B050041';
UPDATE SC SET Grade = Grade + 5 WHERE Grade < 60 AND Cno IN (
SELECT Cno FROM Courses WHERE Cname='软件工程');
视图
定义视图和删除视图
- 定义视图
CREATE VIEW SE_Students AS SELECT Sno,Sname,Sex,Birthday,Dno FROM Students WHERE Speciality = '软件工程' WITH CHECK OPTION;
表示该视图是可更新的
CREATE VIEW Student_Grade(Sno,Sname,Cname,Grade) AS SELECT S.Sno,Sname,Cname,Grade FROM Students S,SC,Courses C WHERE S.Sno=C.Sno AND C.Cno= SC.cno;
- 删除视图
DROP VIEW <视图名> [CASCADE|RESTRICT]
基于视图的查询
视图是命名的导出表,从用户角度讲,查询时使用视图与使用基本表并无区别
基于视图的更新
所有视图都是直接或间接由基本表定义的。基于视图的更新最终要转换成对定义视图的基本表的更新。并不是所有视图都可以更新。(●'◡'●)
视图的作用
- 使用视图可以使一些查询表达更加简洁
- 视图提供了一定程度的逻辑独立性
- 视图的安全保护作用
- 视图使得用户能够以不同角度看待相同的数据
完整性与安全性
完整性概述
数据库的完整性是指数据库中的数据的正确性、一致性和相容性。数据库中的数据要成为有意义的信息,必须满足一定的语义约束条件。
- 约束分类
- 类型(域)约束:说明给定类型的合法取值
- 属性约束:说明属性的合法值
- 关系约束:说明关系的合法取值
- 数据库约束:说明数据库的合法取值,通常涉及多个关系
实体完整性是一种关系约束,参照完整性是一种数据库约束,而用户定义的完整性可以是上述四种约束的任何一种
静态约束是关于数据库正确状态的约束
动态约束是数据库从一种正确状态转移到另一种状态的约束
- DBMS对完整性的支持
- 说明和定义完整性约束条件的方法
- 完整性检查机制
- 违约处理
实体完整性和参照完整性
实体完整性
- 每个关系应该有一个主码,每个元组的主码值唯一确定该元组
- 主码的任何属性都不能取空值
参照完整性
1.参照完整性与E-R模型
如果是由E-R图得到的,则由联系集转换得到的每一个关系都存在参照完整性
如果来源是弱实体集,包含外码,外码不能取空值
2.违反参照完整性的更新
3.保证参照完整性的措施
拒绝
级连
SQL中的参照完整性
SQL支持参照完整性。
用户定义完整性
属性约束
属性上的约束是指属性的取值必须来自其定义的值域
关系约束
关系约束说明关系的合法取值,常常涉及多个同一关系的多个属性和/或多个属性元组(否则可以看作属性约束)
断言与数据库约束
断言是一种命名约束,它表达了数据库状态必须满足的逻辑条件。
触发器
触发器是特殊类型的储存过程,当某个事件发生时它被自动执行
- 指明什么事件发生和满足什么条件执行触发器
- 指明触发器执行什么样的动作
- SQL中的触发器
CREATE TRIGGER OverdraftTrigger
AFTER UPDATE OF Balance ON Account
REFERENCING NEW ROW AS nrow
FOR EACH ROW
WHEN(nrow.balance<0)
BEGIN ATOMIC
INSERT INTO Loan VALUEA(......);
END
安全性概述
- 数据库安全保护的多层面
- 物理层
- 人际层
- 网络层
- 数据库系统层
- 操作系统层
- 数据库安全保护的任务
- 未经授权读区数据(窃取信息)
- 未经授权修改数据
- 未经授权删除数据
保护数据设计以下几个任务
- 防止对数据的未经过授权的存取,确保敏感信息没有被不“需要知道”这些信息的人访问的到
- 防止未经过授权的人员删除和修改数据
- 监视对数据的访问和更改等使用情况
SQL的授权
授权与收回
- 授权语句
GRANT SELECT ON Students TO PUBLIC;
GRANT ALL PRIVILEGES ON Students TO U1;
GRANT ALL PRIVILEGES ON Students,Courses TO U1,U2 WITH GRANT OPTION;
GRANT INSERT,UPDATE(Grade) ON TABLE SC TO U3;
- 收回权限
REVOKE <权限列表> ON <对象名> FROM <用户/角色列表> {CASCADE|RESTRICT}
SQL对角色的支持
- 创建角色和角色授权
CREATE ROLE <角色名>
GRANT ALL PRIVILEGES ON Account,Loan,Depositor,Borrower TO Teller;
- 使用角色授权
GRANT <角色列表> TO <用户/角色列表>
GRANT Manager TO niuxianghui WITH ADMIN OPTION;
- 收回授予角色的权限
可以像从用户回收权限一样,使用REVOKE语句回收授予角色的授权
- 收回角色
REVOKE <角色列表> FROM <用户/角色列表> {CASCADE|RESTRICT}
其他安全措施
- 审计技术
- 数据加密