搭建论坛《搭建之星》论坛数据库交流 → [学习]数据表结构设计


  共有2647人关注过本帖树形打印

主题:[学习]数据表结构设计

帅哥哟,离线,有人找我吗?
admin
  1楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 搭建官方
等级:管理员 帖子:5504 积分:20561 威望:9 精华:5 注册:2002-4-5 17:08:42
[学习]数据表结构设计  发帖心情 Post By:2007-9-10 9:14:08

数据表结构的设计

当读者您在决定开发一个数据库管理项目时,最先着手的工作就应是数据库表结构的设计了。可以这么说,表结构的设计是开发数据库管理项目的基石,一个糟糕的表结构设计,可能会严重延误您的项目开发周期,使您大量的劳动时间为此付之东流。

好了,还是用实例来说明吧。还记得教学管理实例“学生库.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所示,第一、二条记录学号值相同。),所以,“基本情况”数据表中的每一条记录,对应“学习情况”数据表中的多条记录,这种“基本情况”数据表和“学习情况”数据表之间的链接方法称为一对多的链接。简称一对多


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部

返回版面帖子列表

[学习]数据表结构设计








签名