数据库相关知识

1.三范式

第一范式:

 如果关系模式R的每个关系r的属性值都是不可分的原子值,那么称R是第一范式的模式。(例如关系模R(Name,Address,Phone)如果一个人有两个电话号码,那么在关系中至少要出现两个元组,以便存储这两个号码)

第二范式:

如果R是1NF,且每个非主属性完全函数依赖于侯选键,那么称R是第二范式(2NF)的模式。(消除局部依赖)

补充:

侯选键:某个关系模式的属性集为U,x是U的一个子集.如果x->U在R上成立,那么称x是R的一个超键。如果x->U,但对于x的任一真子集x1都有x1->U不成立,则x是R上的一个候选键。

主属性与非主属性:如果A是关系模式R的候选键中的属性,那么称A是R的主属性;否则称A是R的非主属性。

举例:

 设关系模式R(S#,C#,SCORE,T#,TITLE)的属性分别表示学生学号,选修课程的编号,成绩,任课教师工号和教师职称。(S#,C#)是R的侯选键。

 分析:R上有两个FD:(S#,C#)->(T#,TITLE)和C#->(T#,TITLE),由此可见前一个依赖是局部依赖,所以不是2NF。如果把R分解成R1(C#,T#,TITLE)和R2(S#,C#,SCORE),此时R1和R2都是2NF模式。

第三范式:

补充:如果X->Y,Y->A,且Y推导不出X和A不属于Y,那么称X->A是传递依赖。

如果关系模式R是1NF,且每个非主属性都不传递依赖于R的侯选键,那么称R是第三范式的模式。

2.存储过程和函数的区别是什么?

 解答:

 存储过程是用户定义的一系列SQL语句的集合,涉及特定表或其他对象的任务,用户可以调用存储过程。而函数通常是数据库已定义的方法,它接受参数并返回某种类型的值,并且不涉及特定用户表。

3.游标的作用是什么?如何知道游标已经到了最后?

 解答:

 游标用于定位结果集的行。通过判断全局变量@@FETCH_STATUS可以判断其是否到了最后。通常此变量不等于0表示出错或到了最后

4.事务是什么?

 解答:事务是作为一个逻辑单元执行的一系列操作。一个逻辑工作单元必须有4个属性,成为ACID(原子性,一致性,隔离性,持久性)。

 原子性:事务必须是原子工作单元,即对其数据修改,要么全都执行,要么全都不执行。

 一致性:一个事务独立执行的结果,应保持数据库的一致性,即数据不会因事务的执行而遭受到破坏。事务结束时,所有的内部数据结构(如B树索引或双向链表)都必须是正确的。

 隔离性:多个事务并发执行时,系统应保证与这些事务先后单独执行时的结果一样。

 持久性:一个事务一旦完成全部操作后,它对数据库的所有更新应永久地反映在数据库中。

5.数据库的并发控制(两种锁)

 并发操作带来的三个问题:

 1)丢失更新的问题(两个事务同时对一资源进行修改,在一事务还未提交时,另一事务进行修改,这样得到的最后结果是,仅仅保留了后一个事务对原数据的操作);2)读取脏数据(一事务对原数据进行了修改(此时在数据库中的值已经变为修改后的值),但是还未提交,这时又另一事务对该数据进行读取,但是后来,第一个事务进行了回滚操作,也就是原数据的值恢复到原值,但是第二个事务已经读了它修改后的值,这个值就成为脏数据。);3)不可重复读问题。(某一事务需要两次读取同一数据项A,但是在两次读操作的间隔中,另一事务T2改变了A的值。因此,该事务两次读了不同的值)

  接下来引出两种锁(排他型锁X,共享型锁S)

  排他型锁(X锁,写锁):从字面意思也可以看出,具有排他性,也就是如果事务T对某个数据加了X锁,那么在T对R解除封锁之前,不允许其他事务再对该数据添加任何类型的锁。(可以解决丢失更新的问题)

  共享型锁(S锁,读锁):如果事务T对某数据加上S锁后,仍允许其他事务再对该数据加S锁,但在对该数据的所有S锁都解除之前决不允许任何事务对该数据加X锁 (S锁的引进是因为X锁的并发控制并发度低,只允许一个事务独锁数据,而其他申请封锁的事务只能排队去等。为此,降低要求,允许并发的读,就引入了共享型锁)

6.触发器

  触发器是一个能由系统自动执行对数据库修改的语句。有时也称为主动规则或事件-条件-动作规则。

 例子:下面是应用于选课关系SC的一个触发器。这个触发器规定,在修改关系SC的成绩值时,要求修改后的成绩一定不能比原来的低,否则就拒绝修改。

 

CREATE TRIGGER TRIG2 //说明触发器的名字为TRIG2
AFTER UPDATE OF SCORE ON SC //给出触发事件,即对关系C的成绩值修改后激活触发器。此处"After"为触发器动作时间,"update"为触发事件,"ON SC"短语命名了触发器的目标表
REFERENCING
   OLD AS OLDTUPLE//修改前的元组变量
   NEW AS NEWTUPLE//修改后的元组变量
FOR EACH ROW //动作间隔尺寸,表示触发器对每一个修改的元组都要检查一次,如果没有这一行,则表示“FOR EACH STATEMENT”即只检查一次。
WHEN (OLDTUPLE.SCORE>NEWTUPLE.SCORE)//动作事件条件
    UPDATE SC //接下来的都是动作体
    SET SOCRE=OLDTUPLE.SCORE
    WHERE C#=NEWTUPLE.C#;
//撤销时可用DROP TRIGGER TRIG2

 

7.什么叫做SQL注入式攻击?如何防范?

 解答:所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串中,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构造动态SQL,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击。

防范:利用表单输入的内容构造SQL命令之前,把所有输入内容过滤一番就可以。

过滤的方式:

1)。替换单引号。2)限制权限。3)用存储过程来执行所有查询,。。。不是很懂,后面就省略了。。。

 8.聚集索引和非聚集索引

 当文件中记录的数目和数据量很大时,查找速度会明显下降。为了提高速度,必须对文件建立索引。根据记录中某种排序顺序建立的索引,称为有序索引。

索引文件由两部分组成:索引和文件。由于主文件建立多,数据量大并且占据大量物理块,因此在主文件中查找,速度会很慢。如果对记录建立索引,那么相对主文件而言,索引空间小,因而查找速度就快。

 顺序文件:在这种组织中,记录是按查找键值升序或降序的顺序存储的。

 对顺序文件可以建立几套不同的索引。如果索引的查找键值的顺序与主文件的顺序一致,那么这种索引成为主索引,也称为聚集索引。(一般地,主索引的查找键往往是文件的主键) 如果查找键的值的顺序与主文件的顺序不一致,那么这种索引称为辅助索引,或非聚集索引。

posted @ 2013-10-05 23:13  wj704  阅读(333)  评论(0编辑  收藏  举报