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