2、【数据库技术】关系数据库

二、关系数据库

1、相关名词

    关系数据库系统是支持关系模型的数据库系统,关系模型由三部分组成:数据结构、关系操作集合、关系的完整性。

    在关系模型中最重要的数据结构就是关系,关系就是一张表,设计关系就是设计一张表,元组就是表中的一行,属性是表中的一列,属性名是给属性起的名字。

    (1)属性:即实体的特征

    (2)域:每个属性的取值范围构成的集合。

    (3)候选键:关系中能唯一标识一个元组的某一属性或属性组的的最小组合(即不含多余属性)。

    (4)主码:即主键,在一个关系的若干候选键中随意指定一个作为主键,不能够重复,不能为空,如果为空,则称失去了实体完整性。

    (6)外码:外键,如果一个表格中的数据来源于另一个表,那么称这个列为外键。外键错误称为失去了引用完整性。

    数据库的完整性:实体完整性、参照完整性、用户自定义完整性。

    实体完整性:要求每个关系(表)有且仅有一个主键。每一个主键值必须是唯一,而且不允许为“空”(NULL)或重复。

    参照完整性:对于永久关系的表,在更新、插入或删除记录时,如果只修改其一,就会影响数据的完整性。

    用户自定义完整性:就是针对某一具体应用的数据必须满足的语义约束。包括非空、 唯一和布尔条件约束三种情况。

    关系模式是对关系的描述,五元组形式化表示为:R(U, D, DOM, F)其中:
    R — 关系名
    U — 组成该关系的属性名
    D — 属性组U中属性所来自的域
    DOM — 属性向域的映射关系
    F — 属性间的数据依赖关系集合

    关系数据库语言分为**关系代数、关系演算和结构化查询语言(SQL)**三大类。

    五种基本的关系代数运算:选择、投影、并、差、笛卡尔积。笛卡尔成绩、选择和投影运算如下:

    关系演算包括元组关系演算和域关系演算。

    关系数据库中的函数依赖关系:设R(U)是属性集U上的关系模式,X、Y是U的子集,对于R(U)的任意一个关系r,r中不能存在两个元组在X上的属性值相等,而在Y上的属性值不等,则称X函数确定Y或者Y函数依赖X,记做:X -> Y。

    三个基本定义

    (1)完全函数依赖:在R(U)中,如果X -> Y,并且对于X的任何真子集X`,都有X` not->Y,则称为Y对X完全依赖,记做:X->(F)Y。

    (2)部分函数依赖:如果X->Y,当Y不完全依赖于X,则称Y对X部分函数依赖,记做:X ->§Y。

    (3)传递函数依赖:在R(U)中,如果X->Y,(Y不是X的子集),Y not->X,Y->Z,则称Z对X传递函数依赖,记做:X->Z。

    第一范式(1NF):在关系模型中,当且仅当所有域只包含原子值,即每个分量都是不可再分的数据项,则称实体E是第一范式。

    第二范式(2NF):当且仅当实体E是第一范式,且每一个非主键属性完全依赖主键(没有不完全依赖),则称实体E为第二范式。

    第三范式:当且仅当实体E是第二范式,且E中没有非主键属性传递依赖于码时,则称实体E为第三范式。

    如果一个关系模式是单关键字,则没有部分函数依赖问题,肯定是2NF。

    镜像技术:是指将数据库或关键数据复制到另一磁盘上,并在数据库更新时保持镜像数据与主数据库同步。

2、索引

    在说数据库索引之前,我们先介绍几个其他的知识点:

(1)数据库结构

    数据库结构是指在计算机的存储设备上合理存放的相关联的有结构的数据集合的结构。一个数据库结构含有各种成分,包括数据库、数据表、字段、过滤器等。

数据库(Database)

    一个数据库由一个或一组数据表组成。每个数据库都以文件的形式存放在磁盘上,即对应于一个物理文件。不同的数据库,与物理文件对应的方式也不一样。

数据表(Table)

    简称表,由一组数据记录组成,数据库中的数据是以表为单位进行组织的。一个表是一组相关的按行排列的数据;每个表中都含有相同类型的信息。表实际上是一个二维表格,例如,一个班所有学生的考试成绩,可以存放在一个表中,表中的每一行对应一个学生,这一行包括学生的学号,姓名及各门课程成绩。

记录(Record)

    表中的每一行称为一个记录,它由若干个字段组成。

字段(Field)

    也称域。表中的每一列称为一个字段。每个字段都有相应的描述信息,如数据类型、数据宽度等。

(2)数据库索引

    索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。例如这样一个查询:select * from table1 where id=10000。如果没有索引,必须遍历整个表,直到ID等于10000的这一行被找到为止;有了索引之后(必须是在ID这一列上建立的索引),即可在索引中查找。

(1)概念
    为了提高访问数据库的效率,可以对数据库使用索引。当数据库较大时,为了查找指定的记录,则使用索引和不使用索引的效率有很大差别。索引实际上是一种特殊类型的表,其中含有关键字段的值(由用户定义)和指向实际记录位置的指针,这些值和指针按照特定的顺序(也由用户定义)存储,从而可以以较快的速度查找到所需要的数据记录。

    数据库索引的内部实现是采用B+树来实现的,B+树是一种【平衡树】,相关的内容可以参见我的另一篇博客:https://www.cnblogs.com/Long-w/p/9778102.html。

(2)索引的分类
    索引分为聚簇索引和非聚簇索引两种,聚簇索引 是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快。

    根据数据库的功能,可以在数据库设计器中创建三种索引:唯一索引、主键索引和聚集索引。

唯一索引

    唯一索引是不允许其中任何两行具有相同索引值的索引。当现有数据中存在重复的键值时,大多数数据库不允许将新创建的唯一索引与表一起保存。数据库还可能防止添加将在表中创建重复键值的新数据。例如,如果在employee表中职员的姓(lname)上创建了唯一索引,则任何两个员工都不能同姓。

主键索引

    数据库表经常有一列或多列组合,其值唯一标识表中的每一行。该列称为表的主键。在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。该索引要求主键中的每个值都唯一。当在查询中使用主键索引时,它还允许对数据的快速访问。

聚集索引

    在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引。如果某索引不是聚集索引,则表中行的物理顺序与键值的逻辑顺序不匹配。与非聚集索引相比,聚集索引通常提供更快的数据访问速度。聚集索引和非聚集索引的区别,如字典默认按字母顺序排序,读者如知道某个字的读音可根据字母顺序快速定位。因此聚集索引和表的内容是在一起的。如读者需查询某个生僻字,则需按字典前面的索引,举例按偏旁进行定位,找到该字对应的页数,再打开对应页数找到该字。这种通过两个地方而查询到某个字的方式就如非聚集索引。

优点

    在设计数据库时,通过创建一个惟一的索引,能够在索引和信息之间形成一对一的映射式的对应关系,增加数据的惟一性特点。

    能提高数据的搜索及检索速度,符合数据库建立的初衷。

    能够加快表与表之间的连接速度,这对于提高数据的参考完整性方面具有重要作用。

    在信息检索过程中,若使用分组及排序子句进行时,通过建立索引能有效的减少检索过程中所需的分组及排序时间,提高检索效率。

    建立索引之后,在信息查询过程中可以使用优化隐藏器,这对于提高整个信息检索系统的性能具有重要意义。

缺点

    在数据库建立过程中,需花费较多的时间去建立并维护索引,特别是随着数据总量的增加,所花费的时间将不断递增。

    在数据库中创建的索引需要占用一定的物理存储空间,这其中就包括数据表所占的数据空间以及所创建的每一个索引所占用的物理空间,如果有必要建立起聚簇索引,所占用的空间还将进一步的增加

    在对表中的数据进行修改时,例如对其进行增加、删除或者是修改操作时,索引还需要进行动态的维护,这给数据库的维护速度带来了一定的麻烦。

(3)索引的建立

    在SQL语言中,建立索引使用CREATE INDEX语句,其一般格式如下:

    create [unique][cluster] index <索引名>
    on <表名><列名>[<次序>][,<列名>[<次序>]] ...;

    其中,<表名>是要建立索引的基本表的名字。索引可以建立在该表的一列或多列上,各列名之间用逗号分隔。每个<列名>后面,还可以用<次序>指定索引值的排列次序,可选ASC(升序)或DESC(降序),缺省值为ASC。
    unique表明此索引的每一个索引值只对应唯一的数据记录。
    cluster表示要建立的索引是聚簇索引。所谓聚簇索引是指索引项的顺序与表中记录的物理顺序一致的索引组织。
【示例1】

    create cluster index studentsname on student(sname);

    将会在student表的sname(姓名)列上建立一个聚簇索引,而且student表中的记录将按照sname值的升序存放。

【示例2】

    create unique index stusno on student(sno);
    create unique index coucno on course(cno);
    create unique index scno on sc(sno ASC, cno DESC);

(4)索引的删除
    索引一旦建立,就由系统使用和维护它,不需要用户干预。建立索引是为了减少查询操作的时间,当如果数据增删改频繁,系统会花费许多事件来维护索引,从而降低了查询的效率,这时,可以删除一些不必要的索引。
    在SQL中,删除索引使用DROP INDEX语句,其一般格式如下:

    drop index <索引名>;

【示例】

    drop index studentname;

    删除索引时,系统会同时从数据字典中删去有关该索引的描述。

3、视图

    视图(子查询):是从一个或多个表导出的虚拟的表,其内容由查询定义具有普通表的结构,但是不实现数据存储。

    对视图的修改:单表视图一般用于查询和修改,会改变基本表的数据,多表视图一般用于查询,不会改变基本表的数据。

视图的创建及使用:

    //创建视图
    create or replace view v_student as select * from student;
    //从视图中检索数据
    select * from v_student;
    //删除视图
    drop view v_student;

作用

①简化了操作,把经常使用的数据定义为视图

    我们在使用查询时,在很多时候我们要使用聚合函数,同时还要 显示其它字段的信息,可能还会需要关联到其它表,这时写的语句可能会很长,如果这个动作频繁发生的话,我们可以创建视图,这以后,我们只需要select * from view就可以啦,这样很方便。

②安全性,用户只能查询和修改能看到的数据

    因为视图是虚拟的,物理上是不存在的,只是存储了数据的集合,我们可以将基表中重要的字段信息,可以不通过视图给用户,视图是动态的数据的集合,数据是随着基表的更新而更新。同时,用户对视图不可以随意的更改和删除,可以保证数据的安全性。

③逻辑上的独立性,屏蔽了真实表的结构带来的影响

    视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,应用一定是建立在表上的。有了视图之后,程序可以建立在视图之上,从而程序与数据库表被视图分割开来。

缺点:

①性能差

    数据库必须把视图查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,数据库也要把它变成一个复杂的结合体,需要花费一定的时间。

②修改限制

    当用户试图修改视图的某些信息时,数据库必须把它转化为对基本表的某些信息的修改,对于简单的视图来说,这是很方便的,但是,对于比较复杂的试图,可能是不可修改的。

    在定义数据库对象时,不能不加选择地来定义视图,应该权衡视图的优点和缺点,合理地定义视图。

猜你喜欢

转载自blog.csdn.net/sinat_33924041/article/details/83893433