数据表结构的设计
当读者您在决定开发一个数据库管理项目时,最先着手的工作就应是数据库表结构的设计了。可以这么说,表结构的设计是开发数据库管理项目的基石,一个糟糕的表结构设计,可能会严重延误您的项目开发周期,使您大量的劳动时间为此付之东流。
好了,还是用实例来说明吧。还记得教学管理实例“学生库.mdb”,是由两个数据表组成的吗?我们一直说“基本情况”数据表,而没有提及另一个“学习情况”数据表。现在让我们从头说起。
假设,教学管理实例“学生库.mdb”只有一个数据表,表名称为“学生情况”。它包含学生的全部情况列表,表1列出了该表的部分字段及内容。
学号 |
姓名 |
性别 |
出生日期 |
…… |
0001 |
李玉红 |
女 |
1986.10.13 |
…… |
0002 |
张小明 |
男 |
1985.04.05 |
…… |
0003 |
刘文涛 |
男 |
1986.05.27 |
…… |
表1
现在假设想增加学生的学习成绩情况,如果不假思索,这张数据表的字段列表将如表2所示设计。
学号 |
姓名 |
性别 |
出生日期 |
年级 |
语文 |
数学 |
体育 |
0001 |
李玉红 |
女 |
1986.10.13 |
一年级 |
85 |
78 |
中 |
0002 |
张小明 |
男 |
1985.04.05 |
二年级 |
91 |
83 |
良 |
0003 |
刘文涛 |
男 |
1986.05.27 |
一年级 |
77 |
90 |
优 |
表2
表2的每条记录既包含学生的基本情况,也包含了学生的学习成绩情况。如果真有这样一张表的话,那么每个学生只能记录一年级的成绩。二年级的成绩怎么办呢?您会发现,将不得不再增加一条新的记录,而这条记录的前一部分,学号、姓名、性别、出生日期字段是重复的。进一步想,如果我要追踪每个学生在中学阶段的学习成绩又该怎么办?
好的解决办法就是将表2一分为二,将学号、姓名、性别、出生日期作为“学生基本情况”数据表,而新建一个“学习情况”数据表。该表包括了下面的字段:年级、语文、数学、体育。
每一学期的成绩,都可记录在“学习情况”数据表中。如表3所示
年级 |
语文 |
数学 |
体育 |
一年级 |
85 |
78 |
中 |
二年级 |
91 |
83 |
良 |
一年级 |
77 |
90 |
优 |
表3
您很快就能指出该表的错误,是谁的语文成绩85、数学成绩83……,确实该表没有提供这方面的任何信息。相信您很快会给出解决方法,在这张表上增加“姓名”字段。如表4所示
姓名 |
年级 |
语文 |
数学 |
体育 |
李玉红 |
一 |
85 |
78 |
中 |
张小明 |
二 |
91 |
83 |
良 |
刘文涛 |
一 |
77 |
90 |
优 |
表4
乍一看,问题似乎得到了解决,从表4中我们得知李玉红在一年级的语文85分、数学78分、体育成绩为中。在一个班级内,这样表结构也许是不错的,但是如果数据库反映的是整个学校学生的情况,那么你应对校长要求该校不能有重名的学生。这显然是可笑的,症结出在你的表结构设计。用“李玉红1、李玉红2”区别两个人来解决问题,显然不是好办法。
这样我们分析,在“学生库.mdb”设计到的所有字段中,哪些值在表中是唯一的呢?“学号”字段,在一个学校中是不可能把一个学生安排两个学号的。也就是说在一个学校里可能有三个叫李玉红的学生,但只能有一个“0001”的学号。下面我们用“学号”替代“姓名”字段,表结构如表5所示
学号 |
年级 |
语文 |
数学 |
体育 |
0001 |
一 |
85 |
78 |
中 |
0001 |
二 |
79 |
85 |
中 |
0002 |
二 |
91 |
83 |
良 |
0003 |
一 |
77 |
90 |
优 |
表5
从表5我们得知,“0001”号学生一年级时语文85分,二年级语文79分。但是“0001”号是谁呢?通过查看“基本情况”数据表,在那会发现“0001”号学生是李玉红。
当您查找两个相互关联的数据表时,可能因看错行的原因导致查找错误,而计算机是不会出错的,利用搭建之星应用项目,可以迅速找到“0001”和“李玉红”之间的关系而不会出错。
请记住,“基本情况”数据表与“学习情况”数据表是相链接的,而链接的纽带是“学号”字段。这样链接起来的两个数据表的集合,我们称为数据库。一个数据库可以有一个或多个数据表,但至少有一个。
小结一下,在设计表结构时,必须避免冗余字段,每一个数据表中只需包含那些绝对需要的字段,如果某个数据可以从另一个表中提取出来,那么这个表就不要包含该数据字段。如表5所示,就不要设计“姓名”字段。这样设计表结构优点是显而易见的。如节省硬盘空间、方便数据输入和维护。假设“李玉红”的名字写错了,应为“李虹”,那么只要在“基本情况”数据表中修改一处就可了。
在“基本情况”数据表中“学号”是唯一字段,而“学习情况”数据表可以有许多条记录,“学号”字段的值相同(如表7所示,第一、二条记录学号值相同。),所以,“基本情况”数据表中的每一条记录,对应“学习情况”数据表中的多条记录,这种“基本情况”数据表和“学习情况”数据表之间的链接方法称为一对多的链接。简称一对多。