基本上,在Catalog内会包含Tables及Columns两个表,其中Tables表存储数据库中每一个表的摘要信息,如表名、表字段数、行数等。而Columns表则存储每个表字段的摘要信息,如表名称、字段名称等。表的内容如图3-11所示。
3-4 数据库设计
在创建数据库前,首先我们要决定这个数据库需要提供哪些信息(数据项),然后再根据这些数据项的特点来组织表的结构。
3-4-1 Entities & Relationship
Entities被广泛地使用在数据库环境中,用来代表可被区分的对象。在数据库中,除了有Entities外,还有Relationship将数据库内Entities连接在一起。当然也可以将Relationship视为是Entities的一种。
例如,在产品供应数据库中,厂商数据以及产品数据是可被区分的对象,所以在数据库中以Entities对象存在,而在这两个Entities对象之间有一个Relationship存储厂商数据以及产品数据的对应关系,也就是存储厂商供应哪些产品。下图为产品供应数据库的Entities/Relationship Diagram,简称ERDiagram,在图中以四方形表示Entities,以菱形来表示Relationship。
前面说过,Entities是用来表示对象,存储任何我们想要记录的对象信息,换句话说,Entities(及Relationship)必须具有属性,这些属性也必须被定义在数据库内。例如,在厂商数据中,我们要记录厂商代号、厂商名称、统一编号等信息,因此,数据库中的厂商Entities具有厂商代号、厂商名称、统一编号等属性。
3-4-2 数据正规化
在设计数据库时,应该尽量以“一个数据只出现在一个地方(one fact in one place)”设计规则为准,尽量避免数据重复。而数据正规化的概念也就是为了达成这个设计规则所衍生出来的,将一个表分割成多个表存在数据库中。
Coddy将整个数据正规化的动作分为多个层次,如图3-13所示,在每一个层次中定准则条件,只要表能够符合前几层设置的正规化条件,我们就可以称这个表为第几个正规表。例如,关联是数据库内的表符合低一层的正规化条件,表内都是存储Scalar,因此,我们说该表1NF(first Normal Form)。所以,我们可以说数据正规化的过程就是在建立正规表(Normal Forms)。
在设计数据库时,虽然我们可以将数据做多层的正规化,然而实际上,我们往往只会做三层正规化。一般表只要能符合3NF或BCNF,在执行数据存取上就不会有问题了,只有少数的特殊状况要继续往下正规化。所以一般听到的数据正规化都是指3NF。
现在,我们就直接以下图的产品供应表为例,来说明如何将表正规化。首先,我们先从1NF开始,1NF的正规化条件为:在表内只包含有意义数据的最小单位。我们可以发现在下面的表中所有存储的数据都是实际的值,因此表符合1NF。
接下来,继续往下一层正规化,往2NF迈进,2NF的正规化条件为:表符合NF,且所有非键值的数据与主键值之间无对应关系存在。由上图的表中,可以发现主键值厂商代号与非主键值厂商名称、地区、区码等字段有对应关系,只要表内存储的厂商代码相同,则其他字段(厂商名称、地区、区码)内存储的数据也就一定相同。因此,产品供应表不符合2NF。
这时,只要在表中,将与主键值具有对应关系的字段数据,连同对应的主键值删除,并另外建立成一个表(主键值仍然会存在于原来的表中)。最后,别忘了要在新建立的表中将重复的数据删除,如图3-15所示。
经过第二层正规化后,表的主键值与非主键值之间就不再具有任何的相关性存在。3NF的正规化条件为:符合2NF,且所有非键值的数据之间无相互依赖关系存在。
在上图的厂商表中,地区以及区号这两个非主键值的字段具有对应关系存在,只要地区名称相同,则区号数据就一定相同,因此厂商表不符合3NF。
这时,只要在表中将具有对应关系的字段数据删除,另外建立成一个表,并将表中重复的数据删除即可,如图3-16所示。
再次,检查表的内容,发现所有的表内已经不存在任何具有对应关系的字段,完成数据正规化的动作。
3-5 SQL语句
SQL是Structure Query Language的缩写,它是一种标准的关系型数据库查询语言,通过SQL语句的执行可以对数据库内容(表及记录)进行定义、修改或查询。由于在许多的数据库管理系统(如Access,SQL等)以及数据库程序语言(如Visual Basic,Delphi等)内都会支持SQL语法,因此对SQL语法有基本的认识是非常重要的。
不过,必须注意的是并非每一个SQL语句在任何数据库软件中都可以运行。其实大部分的数据库软件都是属于部分支持SQL语言,而非完全支持,而且每个软件所支持的范围也不一定相同,因此在使用特殊的SQL语句前最好先确定数据库软件是否支持该SQL语句。
基本上SQL语言可分为两类,一类是与数据定义有关的称为DDL (Data Define Language)数据定义语言,另一类则是与表内的记录存取有关的称为DML(Data Manipulation Language)数据处理语言。
3-5-1 DDL数据定义语言
SQL的DDL(Data Define Language)语言是处理与数据库内数据有关语句,它的指令范围包含自定数据类型、添加表、修改表、建立表索引、设置Primary Key等动作。
不过,一般来说,有关数据库的设置动作,我们通常是在数据库系统上直接通过数据库管理系统软件的操作来完成,而较少会采用这种利用SQL DDL语言执行的方式,而且这些DDL语句也无法在使用Microsoft Jet数据库引擎的数据库上运作。
常用的DDL语言包含有Create Table语句(建立新的表)、Drop Table语句(删除指定的表)及Alter Table语句(修改表的设计)。例如,可以利用下面的CREATE TABLE语句在作用中的数据库内建立一个名称为“币别信息”的表。
CREATE TABLE 币别信息
( 币别代号 CHAR(4) ,
币别符号 CHAR(6) ,
币别名称 CHAR(10)
)
在这个新建立的表中,将包含“币别代号”、“币别符号”以及“币别名称”等三个字段。有关SQL语句的使用方法及说明,将会在第8章中有详细的介绍,在这我们仅先列出它的使用指令。
3-5-2 DML数据处理语言
SQL的DML(Data Manipulation Language)语言主要是用来处理与数据库记录内容有关的操作,可以进一步根据执行的指令动作是否会更改表内存储的记录内容,将DML指令下分为两类。
一种是会使表内的记录内容产生异动的,如记录的添加、修改及删除等动作,这种会更改表记录内容的SQL DML语言又称为Active Query Language。必须注意的是,在执行这种Active Query Language时,只能作用在单一表上,而且它不会返回任何的数据项。
常用的Active Query Language有:Insert语句(在指定的数据上新增记录)、Delete语句(