数据表的组成
数据库就是储存数据的地方。关系型数据库是由许多数据表(Table)所组成,资料表又是由许多笔记录(Row 或Record)所组成,而纪录又是由许多的字段(Column 或Filed)所组成。假设我们是一个电子商务网站,现在要纪录使用者的数据,你可能会想到要纪录使用者的账号、密码、姓名、电话、住址以及E-mail 等数据;这一些你所要纪录的项目,每一个项目就是一个字段。所以我们将这些字段做个整理,分析出这些字段的长度、数据型态、是否必须要有数据后,得到下列数据表的规格表:
我们先利用Access 2000 先将这个数据表建好,首先先打开Access 2000,则出现下列对话盒:
选择「Access 空白数据库」选项来建立新的数据库,并将这个档案取名MyWeb 后,储存于C:\Inetpub\wwwroot\CR\CH05 的下:
Access 2000 就会将这个数据库存在我们指定的之下,并自动将扩展名命名为mdb,表示这个档案是Access 数据库档案。现在这个数据库就建立好了,但是这个数据库里面是空的,里面还没有任何数据表。所以我们开始将字段一个个的填上去,我们在「使用设计检视建立数据表」上按两下或选择开启数据表设计画面:
接下来我们依照数据规格表所定义的规格,设定每一个字段的名称、数据型态以及长度。另外要特别注意,由于我们强迫使用者不可以输入空白的字段,所以我们在「必须有数据」这一栏要选择「是」:
数据输入完毕后,我们再将数据表存盘,命名为Members。但是我们在存盘的时候,系统会出现没有定义主索引的警告,这里我们先选择「否」:
这样我们的第一个数据表就定义完成了。
当然,数据表除了定义好字段资外,还要实际拥有数据;这些数据就是我们所说的纪录。我们将每一个使用者的数据完整的输入后,每一个横列所组合起来的就是一个完整的数据,也就是我们所说的一笔记录。数据表就是由直的字段以及横的纪录所组合的。完成之后的数据表内并没有任何数据数据,所以我们先简略的输入下列三笔数据,让数据表完成。请在「Members」数据表上按两下后输入:
输入完毕后就是一个数据表了。
这样一来我们就可以在数据表内作数据的新增、编辑、查询以及删除等工作了。
主键
不过这个数据表严格说起来还有瑕疵,那就是使用者一但增加,一定会有重复的使用者账号。如果使用者账号有重复的话,使用在者登入的时候就无法确认到底是哪个使用者。所以我们必须将使用者账号设定成不允许重复,只要将这个字段设定成主键(Primary Key)就可以了:
0
外来键
字段设定成主键最主要的功能除了不允许重复外,另外还可以建立两个数据表之间的关联。将数据库的结构作一个合理的分析,适当的将数据分散到各个数据表以及建立数据表之间的关联,这个动作叫做数据库的正规化。关系型数据库有什么好处呢?我们来举一个实际的例子,假设我们的网站除了使用者的数据外,还要记载使用者的订单状况。这样一来数据表就会多了订单日期、产品名称、单价、订购数量以及小计等项目,如果这些数据都和使用者基本数据记录在一起,我们的数据表就会变成(因为会重复的输入使用者的基本数据,所以我们将使用者数据表主键的设定关掉):
1我们在上列数据表中新增了三笔资料。但是除了使用者的订单数据外,我们发现使用者的基本数据重复输入了。数据重复输入有许多坏处,第一是增加数据库的储存空间,第二是可能会导致数据输入错误,第三是不容易维护及管理。假设使用者的电子邮件信箱改变了,在这种数据库里面需要将使用者所有纪录的电子邮件信箱字段全部作更新,不但浪费数据库空间而且不好管理;所我们应该把这些重复出现的数据独立出来,再建一个订单数据表。我们在数据库对话盒中选择新建,如下图所示:
2然后输入数据表架构,输入完毕后将数据表命名为Orders,如下所示:
3由于订单数据表中要纪录订单是哪个使用者所下的,所以我们在这里产生了和Members 数据表中定义一样的UserId 字段,这个字段表示是要参考Members 数据表中的UserId 字段,所以一个字段若要参考其它字段的主键,则这个字段就叫做外来键(Foreign Key),这个字段我们在下个建立数据表的关联时会用到。数据表结构在存盘的时候依然发出没有主键的警告,在这里我们不需要建立主键,所以选择「否」存档后离开。接下来我们要设定这两个数据库之间的关联了。在设定关联之前请先确定Members 数据表是否有设定主键UserId,倘若没有请设先定完毕后再选择「数据库关联图」选项:
4出现「显示资料表」对话盒后,我们将Members 以及Orders 分别点选新增:
5新增完毕后这两个数据表就被加到「数据关联图」窗口中了,如下图所示:
6接下来我们可以利用拖放的方式,将Orders 数据表中的UserId 字段拖到Members 窗体中,就会出现「编辑关联」对话盒。我们将对话盒中的「强迫参考完整性」、「串接更新相关数据」以及「串接删除相关纪录」的选项打勾,如下所示:
7选择这些选项表示在输入订单数据表时其UserId 字段会参考Members 数据表的UserId 字段,倘若所输入的数据在Members 数据表中没有这个使用者账号,则所输入的使用者是错误的数据,所以不会被接收;这一来可以确保所输入的订单都可以找到是哪个使用者所下的。另外要删除某个使用者数据的时候,假设订单数据中还有参考到这笔要删除的纪录,则也是不允许删除;因为如果把被参考到的纪录删除,那么会造成只有订单数据却不知道是哪一个使用者下单的情形。这样一来就可以确保资料的完整性,不会造成错误的数据或是有孤儿数据等等的问题。选项设定好后,则出现下列的关联图:
8在关联图中我们看到两个资料表有一条线连起来,表示这两个数据表之间有关联的关系。到在Members 资料表旁显示数值1,表示Members 资料表的UserId 字段是主键,而且字段内的值不允许重复;而Orders 数据表旁显示∞ 符号,表示Orders 数据表的UserId 字段是外来键,表示字段的数据参考到别的字段的主键,而且允许输入重复的值(因为使用者可以下多笔订单)。所以倘若我们再输入订单数据时,随便输入一个没有在Members 数据表中存在的UserId,我们所输入的数据不会被接受外还会出现如下的警告讯息:
9所以其实关联就是一种限制(Constraint),限制使用者所输入的数据必须是正确的,以及限制数据的完整性。善用关系型数据库的一些特点,不但可以帮助我们避免输入错误的数据外,也可以让日后的维护更轻松容易。