前面曾经说过,数据库管理系统是数据库系统中最重要的部分,用户对数据库的所有存取动作都是通过数据管理系统来执行的,而许多的数据管理、维护也都交由DBMS来完成,因此,在数据库管理系统中至少要提供下列功能:
1. 数据定义
数据定义是指定义数据库内数据的类型、数据的长度等,例如,在数据库内增加一个数据文件时,必须对数据文件内的各个属性进行数据定义。因此,DBMS必须能够接受原有的数据定义格式,并且转换成适当的数据格式存储。换句话说,在DBMS中必须包含每一种数据定义语言(DDLs)的语言处理组件。
2. 数据处理
DBMS必须能够对数据库内现存的数据做查询、修改、删除等动作,或是在数据库中增加数据。因此,在DBMS中必须包含数据处理语言(DML)的处理组件。
3. 数据安全及正确
DBMS必须能监视用户存取数据库的需求,对于每一个数据存取需求在执行前都会与设置的准则条件加以验证,并且拒绝所有违反安全设置或验证规则的存取需求。
4. 数据实时复原
数据库的数据可能会因为操作的错误或设备的损耗而损坏,这时DBMS(或是其他相关的软件组件,称为转换管理员)必须提供数据实时复原控制能力,让数据库能够在最短的时间内恢复正确的数据。最常见的方法是将以前备份的数据重新加载。
5. 数据目录
DBMS必须提供数据目录功能,存储数据库中所定义的信息,数据目录是数据库内所有不同于Schema及对应存储的地方。换句话说,数据目录内包含详细的表示数据库系统本身所关切的各种对象。所以,我们也可以将数据目录视为是数据库的数据库。
6. 效率
在数据库中可以使用不同的存取程序来执行相同的存取动作,而不同的存取程序会有不同的执行效率。DBMS必须提供效率最佳化功能,使所有的数据存取需求能够以最佳化的效率来执行。这个最佳化的程序是由DBMS中的重要组件Optimizer来决定的。
因此,当用户在存取数据库的内容时,只要设置他们想要取得什么数据,而不需要指定如何去取得这些数据的程序,数据库系统将会自动以最佳化的程序来执行数据存取动作。
3-3 关系型数据库
关系型数据库开始于1970末期至1980初,截至目前为止市面上已有数百种的关系型系统,已成为最通用的数据库系统。到底什么是关系型系统呢?简单地说,关系型数据库是以表(Table)的类型将数据提供给用户,而用户的数据存取动作都可以说是利用旧的表来产生新的表。
3-3-1 数据的表示方法
关系型系统必须符合数据库以表类型提供用户的需求,这里的表是关系型系统的逻辑结构,而非实体结构。实际上在实体层中,系统可以使用任何的一般存储结构,如循序文件、索引、链接等。而在逻辑层中,则是将这些实体层结构进行对应,并建立成表。
前面所说的逻辑结构,只对ANSI/SPARC结构中的概念层与外部层有作用,对于内部层而言逻辑结构不具有任何意义。所以,在概念层与外部层中数据库可能是关系型的,而在内部层则绝对不是关系型的。
在关系型数据库中,整个信息内容只有一个表示方式,那就是明确的数据值。也就是说,数据库内所有的数据都是Atomic,这里的Atomic是指具有意义的数据的最小单位,因此,表中单一字段对应位置内存储的一定是单一的数据值,而不会是一群数据。
比较特别的是,在关系型数据库中,是以表间相同的字段值来表示表的关联性,而不是在表中存储指针数据,将一个表连接到另一个表。如图3-3所示,厂商数据与供应数据利用厂商数据字段进行关联,将两个表中存储相同厂商代号的数据连接在一起。
3-3-2 表
一般来说,我们可以将数据库的结构分为数据库DataBase、表Table以及记录Record三层。在一个数据库内可包含多个表,而每个表内则存储着数条记录。当我们设计一个数据库程序时,通常会将所有在程序使用到的表存放在同一个数据库内,如图3-4所示。
所谓的表是指直接由一个数据文件读出的完整数据,也就是代表实际存储的表本身,它通常被视为是一个特定信息内容的数据集合,如下图为“厂商数据”表画面,在这个表中存储了厂商数据有关的信息。
基本上,我们可以将表想成一个二维数组,表中的每一行代表一条记录,而每一列则代表一个字段,例如在上图的“厂商数据”表中存储了3条记录,而每一条记录都是由3个字段所构成的,这3个字段分别代表厂商代号、厂商名称、统一编号信息。
当我们在创建一个表时,必须先考虑这个表的主要用途以及它所必须包含的信息,然后再将这些信息分别定义成不同的字段。不同的数据库系统所提供的字段设置项目不同,基本上字段的设置内容包括有字段名称、数据类型、长度、允许空等项目。
根据不同的字段特性,可以为字段指定适当的数据类型,对于需存储文字数据的字段应定义为文字类型,而对于内容只有数字或数据内容,需做数值运算的字段则应定义为数值类型。
3-3-3 键
在关系型数据库中,表间具有数据相关性,为维护数据的完整性,避免与表数据修改后丧失其关联性,在表中定义适当的主键(Primary Key)与外键(Foreign Key),通过定义键维护表间的关联性。
主键(Primary Key)是能辨识记录的最小字段组,换句话说就是表的最小Identify Key。例如在客户表中,每一条客户数据有其个别的客户代号,通过客户代号的内容,就可以直接找到唯一的一条客户记录,故客户代号可以是客户表的主键。被设为Primary Key的字段,其内容值必须具有唯一性且不能是空白。
外键(Foreign Key)是指表中指向于其他表Primary Key的字段,若被参考的Primary Key包含有多个数据行,则Foreign Key也必须包含有同样个数的数据行,与Primary Key字段一一对应。
3-3-4 表索引
在表中可以为某些字段定义索引,这个索引文件内存储着排序汇整后的字段数据内容与对应在表中的位置。当我们要对某一字段执行数据查询操作时,可以通过该字段的索引文件找到数据在表中的位置,再取得查询的结果。
由于通常表的索引文件会比表本身小,所以一般来说通过索引搜寻数据的速度会比直接在表上查询的速度快,不过相对的建立索引文件会占用磁盘空间,且数据更新的速度可能会较慢。
在表中为常用来查询的字段做索引文件,可以加速查询的动作,这对于包含有大量数据的表而言非常重要。不过若是经常同时对两个字段的内容进行搜寻,则必须将两个字段的内容制作成一个索引,而不是分别各自制作各自的索引。
3-3-5 视图
当我们编写数据库程序时,经常会利用Select语句将一个或数个表的内容筛选列示出来,例如在成绩管理系统中需要列出所有总平均不及格的学生,这种通过数据选取或筛选动作而产生的虚拟表就称为视图View。
View可以由多个数据文件合并出来,或是从一个数据文件取出部分数据或部分字段所构成的虚拟表。由于View并不像Table在数据库中是独立存在的,而且View的内容很可能会与多个表有关,因此,View可执行的动作会受到限制,用户只能对View执行数据查询的操作。
View只是在数据库管理系统中存储定义内容,并不是真的以表存在,因此,当我们对View执行数据查询时,并无法直接操作,而必须先将查询指令进行转换。
我们可以将常用的窗体查询定义成View存储于数据库内,在程序中需要列出定义为View的数据时,只需在程序中调用执行该View的名称,即可得到所需要的数据内容。
下图为SQL Server的视图属性窗口画面,在文本框中用户可以在Create View语句后设置View名称,在AS语句后设置视图的内容(Select语句)。
3-3-6 存储过程
当我们开发数据库程序时,经常会应用到SQL语法对数据库的内容进行存取,一般都会将这些存取数据库的动作直接写在程序中。如果数据库的内容是提供给多个程序使用或是需要以不同的程序开发相同的软件时,就必须在每一个程序中重复编写SQL语句,而且一但要修改,也必须到每一个程序中修改。
因此在数据库中允许我们将执行的操作直接定义在数据库中,编写程序时只要调用该数据库程序即可执行程序的内容,感觉上与程序模块化相似。这样将数据库的处理动作定义在数据库服务器端不但能够将数据存取的动作集中化处理维护方便外,更能加速数据库存取动作的执行效率,因为数据库服务器会对这些服务器端的程序先进行编译。
所有执行于数据库的动作都可以定义存储为存储过程(Stored Procedure),而且在一个存储过程中可以包含多个SQL指令,也可以定义多个变量来连接多个处理动作。我们可以将数据库中通常执行的数据处理动作定义为存储过程,以提供应用系统的调用,同时也可通过参数的设置使程序的执行更加具有弹性。
上图为SQL Server“存储过程的属性”窗口,在文本框中用户可以在Create Procedure语句后设置存储过程的名称,在Create Procedure与AS关键词间可以声明此存储过程的参数,参数可以是传入参数也可以是传出参数,若为传出参数则需在参数声明时加上OUTPUT字样,而在AS关键词后则是设置该存储过程所有执行的数据库存取动作。
3-3-7 触发器
触发器(Trigger)触发程序也是一种存储过程,只不过它会在数据库被修改时自动执行,这与对象的事件有点相似。在一个表中只能有一个Insert、一个Delete及一个Update触发器,这三种触发器分别在新增数据、删除数据及改变数据后触发运行,可以将这三种触发过程定义在同一个Trigger中,也可以各自独立。
下图为SQL Server的触发器属性窗口画面,用户可以在CREATE TRIGGER关键词后设置触发程序的名称,在ON关键词后设置引用这个触发程序的表名称,在FOR关键词后设置引用这个触发程序的事件(Insert,Delete或Update),若同时引用于一个以上的事件需用逗号做分隔,而在AS关键词后则是设置该存储过程所有执行的数据库存取动作。
3-3-8 数据目录
数据目录(Catalog)是指存储数据库所有Schema