数据库系统概论知识点

有些东西就直接略过了,有的打算另开篇幅来分析。

● 数据模型

第一类是概念模型。第二类是逻辑模型和物理模型。

数据模型通常由数据结构、数据操作和完整性约束组成。

概念模型:

1.实体:客观存在并可相互区别的事物称为实体。

2.属性:实体所具有的某一特征称为属性。

3.码:唯一标识实体的属性集称为码。

4.域:域是一组具有相同数据类型的值的集合。

5.实体型:用实体名及其属性名集合来抽象和刻画同类实体,称为实体型。

6.实体集:同一类型实体的集合称为实体集。

7.联系:实体(型)内部的联系和实体(型)之间的联系。

 

E-R图表示实体型、属性和联系的方法:

实体型:用矩形表示,矩形框内写明实体名。

属性:用椭圆形表示,并用无向边将其与相应的实体型连接起来。

联系:用菱形表示,菱形框内写明联系名,并用无向边分别与有关实体型连接起来,同时在无向边旁标上联系的类型(1:1,1:n或m:n)。

 

● 关系数据库

笛卡尔积:是域上面的一种集合运算。

给定一组域D1,D2,…,Dn,这些域中可以是相同的域。D1,D2,…,Dn的笛卡尔积为D1×D2×…Dn = {(d1,d2,…,dn)|di∈Di,i=1,2,…n}

其中每一个元素(d1,d2,…,dn)叫做一个n元组或简称元组。

元素中的每一个值di叫做一个分量。

若关系中的某一属性组的值能唯一地标志一个元组,则称该属性组为候选码。

若一个关系有多个候选码,则选定其中一个为主码。

候选码的诸属性称为主属性。不包含在任何候选码中的属性称为非主属性和非码属性。

在最简单的情况下,候选码只包含一个属性。在最极端的情况下,关系模式的所有属性是这个关系模式的候选码,称为全码。

 

● 关系代数

image

 

1.选择:选择又称为限制。它是在关系R中选择满足给定条件的诸元组。

2.投影:关系R上的投影是从R中选择若干属性列组成新的关系。

3.连接:它是从两个关系的笛卡尔积中选取属性间满足一定条件的元组。

 

聚合函数:count(对元组计数) total(求总和) max min avg

 

 

● 数据定义

1.定义模式

CREATE SCHEMA <模式名> AUTHORIZATION <用户名>

2.删除模式

DROP SCHEMA <模式名> <CASCADE | RESTRICT>

其中CASCADE | RESTRICT两者必选其一。

选择了CASCADE(级联),表示在删除模式的同时把该模式中所有的数据库对象全部一起删除。

选择了RESTRICT(限制),表示如果该模式中已经定义了下属的数据库对象(表、视图等),则拒绝该删除语句的执行。

3.定义表

create table “S-T”.SC (Sno CHAR(9), Cno CHAR(4),Grade SMALLINT,

primary key (Sno,Cno),

foreign key (Sno) reference Student (Sno)),

foreign key (Cno) reference Cource(Cno)

);

4.修改基本表

ALTER TABLE <表名>

[ ADD <新列名> <数据类型> [ 完整性约束 ]]

[ DROP <完整性约束名>]

[ ALTER COLUMN <列名> <数据类型>];

5.删除表

DROP TABLE <表名> [RESTRICT | CASCADE];

若选择RESTRICT,则表的删除是有限制条件的。欲删除的基本表不能被其他表的约束所引用(如CHECK,FOREIGN KEY等约束),不能有视图,不能有触发器,不能有存储过程或函数等。

若选择CASCADE,则表的函数没有限制条件。

6.建立索引

CREATE [UNIQUE] [CLUSTER] INDEX <索引名>

ON <表名> (<列名> [<次序>] [,<列名>] [<次序>]]…);

UNIQUE表明此索引的每一个索引值只对应唯一的数据记录。

CLUSTER表示要建立的索引是聚簇索引。指索引的顺序与表中记录的物理顺序一致的索引组织,因此对于经常更新的列不宜建立聚簇索引。

create unique index Cno on SC (Sno ASC, Cno DESC);

7.删除索引

DROP INDEX <索引名>;

在RDBMS中索引一般采用B+树,HASH索引来实现。

 

● 数据查询

SELECT [ALL | DISTINCT] <目标列表达式> [, <目标列表达式>]…

FROM <表名或视图名> [, <表名或视图名>]…

[WHERE <条件表达式>]

[GROUP BY <列名1> [HAVING <条件表达式>]]

[ORDER BY <列名2> [ASC | DESC]]

 

字符匹配:

%代表任意长度(可以为0)的字符串。

_代表任意单个字符。

如果查询的字符串本身含有这些符号,则使用   \  进行转义。

 

select Sno from SC where Grade IS NULL;    //IS不能用=代替。

 

外连接:

select student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade From Student LEFT OUT JOIN SC ON (Student.Sno = SC.Sno);

From Student LEFT OUT JOIN SC USING (Sno);   //用USING去掉结果中的重复值。

左外连接列出左边关系中所有的元组,右外连接列出右边关系中所有的元组。

 

带有ANY SOME或ALL谓词的子查询

> ANY    大于子查询结果中的某个值              某个

> ALL    大于子查询结果中的所有值               所有

用聚集函数实现子查询要比直接用ANY或ALL查询效率要高。

 

带有EXISTS/NOT EXISTS谓词的子查询

select Sname from Student where exists (select * from sc where Sno = Student.Sno AND Cno = ‘1’);

 

集合查询

集合操作主要包括并操作UNION、交操作 INTERSECT 和差操作 EXCEPT

 

update Student set Sage = Sage + 1;

 

● 视图

1.建立视图

CREATE VIEW <视图名> [(<列名> [,<列名>]…)]

AS <子查询>

[WITH CHECK OPTION];

create view只是把视图的定义存入数据字典,并不执行其中的select语句。

2.删除视图

DROP VIEW <视图名> [CASCADE];

3.更新视图

通过视图来插入,删除,修改数据。

由于视图是不实际存储数据的虚表,因此对视图的更新,最终要转换为对基本表的更新。

 

● 数据库安全

授权与回收:

1.GRANT

GRANT <权限> [,<权限>]…

ON <对象类型> <对象名> [,<对象类型> <对象名>]…

TO <用户> [,<用户>]…

[WITH GRANT OPTION];

将对指定操作对象的指定操作权限授予指定的用户。

2.REVOKE

REVOKE<权限> [,<权限>]…

ON <对象类型> <对象名> [,<对象类型> <对象名>]…

FROM <用户> [,<用户>]…[CASCADE | RESTRICT];

 

● 数据库完整性

检查记录中主码值是否唯一的一种方法是进行全表扫描,全表扫描是十分耗时的,为了避免对基本表进行全表扫描,RDBMS核心一般都在主码上自动建立一个索引,如B+树索引。

 

check (sex = ‘女’ OR Sname NOT LIKE ‘Ms.%’)

 

定义触发器

create trigger insert_or_update_sql

Before insert or update on teacher

for each row

as begin

     if(new.job=’教授’) and (new.sal < 4000) then

                     new.sal  := 4000;

    end if;

end;

删除触发器

DROP TRIGGER <触发器名> ON <表名>;

 

● 关系数据理论

X → Y, 但Y∉X则称X → Y是非平凡的函数依赖。

X → Y, 但Y∈X则称X → Y是平凡的函数依赖。

 

在R(U)中,如果X → Y,并且对于X的任何一个真子集X’,都有X’→ Y不成立,则称Y对X完全函数依赖。

若X → Y,但Y不完全函数依赖于X,则称Y对X部分函数依赖。

 

规范化过程:

image

 

● 数据库设计

1、需求分析:了解用户的数据需求、处理需求、安全性及完整性要求;
2、概念设计:通过数据抽象,设计系统概念模型,一般为E-R模型;
3、逻辑结构设计:设计系统的模式和外模式,对于关系模型主要是基本表和视图;
4、物理结构设计:设计数据的存储结构和存取方法,如索引的设计;
5、系统实施:组织数据入库、编制应用程序、试运行;
6、运行维护:系统投入运行,长期的维护工作。

 

数据字典各部分的描述

数据项:数据流图中数据块的数据结构中的数据项说明

数据项是不可再分的数据单位。对数据项的描述通常包括以下内容:

数据项描述={数据项名,数据项含义说明,别名,数据类型,长度,

取值范围,取值含义,与其他数据项的逻辑关系}

其中“取值范围”、“与其他数据项的逻辑关系”定义了数据的完整性约束条件,是设计数据检验功能的依据。

若干个数据项可以组成一个数据结构。

数据结构:数据流图中数据块的数据结构说明

数据结构反映了数据之间的组合关系。一个数据结构可以由若干个数据项组成,也可以由若干个数据结构组成,或由若干个数据项和数据结构混合组成。对数据结构的描述通常包括以下内容:

数据结构描述={数据结构名,含义说明,组成:{数据项或数据结构}}

数据流:数据流图中流线的说明

数据流是数据结构在系统内传输的路径。对数据流的描述通常包括以下内容:

数据流描述={数据流名,说明,数据流来源,数据流去向,
  组成:{数据结构},平均流量,高峰期流量}

其中“数据流来源”是说明该数据流来自哪个过程,即数据的来源。“数据流去向”是说明该数据流将到哪个过程去,即数据的去向。“平均流量”是指在单位时间(每天、每周、每月等)里的传输次数。“高峰期流量”则是指在高峰时期的数据流量。

数据存储:数据流图中数据块的存储特性说明

数据存储是数据结构停留或保存的地方,也是数据流的来源和去向之一。对数据存储的描述通常包括以下内容:

数据存储描述={数据存储名,说明,编号,流入的数据流,流出的数据流,
  组成:{数据结构},数据量,存取方式}

其中“数据量”是指每次存取多少数据,每天(或每小时、每周等)存取几次等信息。“存取方法”包括是批处理,还是联机处理;是检索还是更新;是顺序检索还是随机检索等。

另外“流入的数据流”要指出其来源,“流出的数据流”要指出其去向。

处理过程:数据流图中功能块的说明

数据字典中只需要描述处理过程的说明性信息,通常包括以下内容:

处理过程描述={处理过程名,说明,输入:{数据流},输出:{数据流},
  处理:{简要说明}}

其中“简要说明”中主要说明该处理过程的功能及处理要求。功能是指该处理过程用来做什么(而不是怎么做);处理要求包括处理频度要求,如单位时间里处理多少事务,多少数据量,响应时间要求等,这些处理要求是后面物理设计的输入及性能评价的标准。

 

● 储存过程

PL/SQL块主要有两种类型,即命名块和匿名块。前面介绍的是匿名块。匿名块每次执行时都要进行编译,它不能被存储到数据库中,也不能在其他的PL/SQL块中调用。存储过程和函数是命名块,他们被编译后保存在数据库中,可以被反复调用,运行速度较快。

利用存储过程来实现下面的应用:从一个账户转指定数额的款项到另外一个账户:

  CREATE PROCEDURE TRANSFER(inAccount INT,outAccount INT, amount FLOAT)

  AS DECLEARE

      totalDeposit FLOAT;

  BEGIN

    /*获取账户存款数额*/

   SELECT total INTO totalDeposit FROM ACCOUNT WHERE ACCOUNTNUM=outAccount;

   IF totalDeposit IS NULL THEN//若账户不存在或者没有存款;则回滚

    ROLLBACK;                              

    RETURN;

            END IF;                                                               

   IF totalDeposit <amount THEN//若账户存款不足;则回滚      

    ROLLBACK;                        

    RETURN;                         

   END IF;                            

  /*更新转出账户*/                              

  UPDATE ACCOUNT SET total=total-amount WHERE ACCOUNTNUM=outAccount

  /*更新转入账户*/

  UPDATE ACCOUNT SET total=total+amount WHERE ACCOUNTNUM=inAccount;

  COMMIT;//提交转账事务

  END;

调用存储过程语法如下:

  CALL/PERFORM PROCEDURE 过程名();

        如:CALL PROCEDURE TRANSFER(0001,0002,10000);//0001转到0002账户10000块钱!

修改存储过程名称语法如下:

  AFTER PROCEDURE 过程名1 RENAME TO 过程名2;

删除存储过程如下:

  DROP PROCEDURE 过程名();

 

● 并发控制

封锁就是事务T在对某个数据对象(例如表、记录等)操作之前,先向系统发出请求,对其加锁。加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其它的事务不能更新此数据对象。

排它锁又称为写锁。若事务T 对数据对象A 加上X 锁,则只允许T 读取和修改A , 其它任何事务都不能再对A 加任何类型的锁,直到T 释放A 上的锁。

共享锁又称为读锁。若事务T 对数据对象A 加上S 锁,则事务T可以读A但不能修改A,则其它事务只能再对A 加S 锁,而不能加X 锁,直到T 释放A 上的S 锁。

 

活锁:如果事务T1封锁了数据R,事务T2又请求R,于是T2等待。T3也请求封锁R,当T1释放了R上的封锁之后系统首先批准了T3的请求,T2仍然等待。然后T4又请求封锁R,当T3释放了R上的封锁之后系统又批准了T4的请求。。。。T2有可能永远等待,这就是活锁的情形。

避免活锁的简单方法就是采用先来先服务的策略。

 

死锁:如果事务T1封锁了数据R1,T2封锁了数据R2,然后T1又请求封锁R2,因T2已经封锁了R2,于是T1等待T2释放R2上的锁。接着T2又申请封锁R1,因T1已经封锁了R1,T2也只能等待T1释放R1上的锁。这样就出现了T1在等待T2,而T2又在等待T1的局面,T1和T2两个事务永远不能结束,形成死锁。

 

死锁的预防:

一次封锁法:一次封锁法要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行。

顺序封锁法:顺序封锁法是预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁。

 

 

BY:AloneMonkey

本文链接:http://www.alonemonkey.com/database-introductory.html

Posted in