第3章 数据库和表.docx
《第3章 数据库和表.docx》由会员分享,可在线阅读,更多相关《第3章 数据库和表.docx(50页珍藏版)》请在冰豆网上搜索。
![第3章 数据库和表.docx](https://file1.bdocx.com/fileroot1/2023-1/27/dac57063-d9b3-4f85-93fb-61f49bfd3b33/dac57063-d9b3-4f85-93fb-61f49bfd3b331.gif)
第3章数据库和表
第3章数据库和表
在VF6中,数据库(database)和表(table)是两个不同的概念。
表是处理数据、建立关系数据库和应用程序的基础单元,用于存储收集来的各种信息;而数据库是表的集合,它控制这些表协同工作,共同完成某项任务。
数据库是指存储在外存上的有结构的数据集合。
在VF6的数据库中,不存储数据,只存储数据表的属性,以及组织、关联表和视图等,并可在其中创建存储过程。
此外,使用数据库还给能访问远程数据源,并可创建本地和远程表的视图。
3.1数据库设计概述
3.1.1数据库设计的一般步骤
数据库设计过程的关键在于明确VF6中数据的存储方式与关联方式。
在各种类型的数据库管理系统中,为了能够更有效、更准确地为用户提供信息,往往需要将关于不同对象的信息存放在不同的表中,VF6也是如此。
比如一个教学管理系统数据库,包含有如下两个表:
一个表用来存放学生基本情况,而另一个表用来存放课程情况。
现在要查看某一个课程及选修该课程的学生情况,就需要在两个表之间建立一个联系。
所以在设计数据库时,首先要把信息分解成不同相关内容的组合,分别存放在不同的表中,然后再告诉VF6这些表相互之间是如何进行关联的。
注意:
虽然可以使用一个表来同时存储学生信息和课程信息,但这样数据的冗余度太高,而且无论对设计者来说,还是对使用者来说,在数据库的创建和管理上都将非常麻烦。
设计数据库的一般步骤如下所示。
1 分析数据需求确定数据库要存储哪些信息。
2 确定需要的表文件一旦明确了数据库所要实现的功能,就可以将必需的信息分解为不同的相关主题,在数据库中为每个主题建立一个表。
3 确定需要的字段这实际上就是确定在表中存储信息的内容,即确立各表的结构。
4 确定各表之间的关系仔细研究各表字段之间的关系,确定各表之间的数据应该如何进行连接。
5 改进整个设计可以在各表中加入一些数据作为例子,然后对这些例子进行操作,看是否能得到希望的结果。
如果发现设计不完备,可以对设计作一些调整。
在最初的设计中,不必担心发生错误或遗漏。
在数据库设计的初始阶段出一些错,通过VF6极易修改。
一旦数据库中拥有大量数据,并且被用到报表、表单或是应用程序中之后,再要进行修改就非常困难了。
所以在确定数据库设计之前一定要做适量的测试、分析工作,排除其中的错误和不合理的设计。
也正因如此,在连编应用程序之前,应确保设计方案已经考虑得比较全面。
作为设计的示范,现以某校的教务处教学管理系统为例,介绍数据库设计的过程。
3.1.2确定数据库的用途
确定数据库用途最主要目的是弄清用户需求,并做较明确的描述处理。
设计数据库时要注意两点:
一是要强调用户的参与。
在分析数据库需求时,最好和数据库的使用人员多交换意见,并根据用户提出的要求,推敲数据库需要回答哪些问题。
二是要充分考虑到数据库可能的扩充和改变,提高数据库的灵活性。
只有创建一个设计灵活的数据库,才能保证所建立的应用程序具有较高的性能。
如教务处的“教学管理”数据库,应存放教与学两方面的信息,即有关学生的情况、教师的情况、课程安排以及考试成绩等方面的信息。
要求从中可以查出每个学生各门课程的成绩,某门课程由哪位教师担任、哪些学生选修了这门课程,以及这门课程的考试成绩等数据信息。
如有可能,应尽量使用表格形式来描述这些数据信息。
在实际教学管理过程中,有关的表格和要求摘录如下。
1.学生登记卡
学生登记卡是学生入学时登记的一种卡片,其中包含学生基本信息情况,其样表参见表3.1。
表3.1学生登记卡
学号
姓名
性别
出生日期
专业
入学成绩
贷款否
照片
0103001
王丽丽
女
1983.3.23
外贸
626.5
.T.
身份证
籍贯
家庭地址
电话
专长
奖励
处分
病史
1101081983
0323011A
安徽
北京海淀区学院路13号
62313380
唱歌
高中时连续三年三好生
无
无
简历
1990年入北京师大附小读书,1995年考入北京师大附中读书,2001年考入北京语言文化大学
2.学生成绩表
学生成绩表是用来统计学生成绩的一种表格,其基本表格格式参见表3.2
表3.2学生成绩表
课程名称:
电脑文秘应用教师姓名:
白丽文
学号
姓名
平时成绩
期中成绩
期末成绩
0103001
王丽丽
95
88
90
……
3.1.3确定需要的表文件
确定数据库中需要的表是数据库设计过程中技巧性最强的一步。
因此仅仅根据用户想从数据库中得到的结果(包括要打印的报表、要使用的表单等),只能确定需要数据库回答的问题。
至于表的结构、表与表之间的关系,用户是不可能提出的,所以只能根据用户的需要通过分析归纳来确定需要哪些表,并将需要的信息分门别类的归纳到相应的表中。
也就是说,在设计数据库时,应将不同主题的信息存储在不同的表中。
在设计数据库的时候,首先分离那些需要作为单个主题而独立保存的信息,然后设计这些主题之间有何关系。
通过将不同的信息分散在不同的表中,可以使数据的组织工作和维护工作更简单,同时也容易保证应用程序具有较高的性能。
例如,根据上面提出的“教学管理”数据库的要求,考虑这个数据库需要哪些表:
首先,为了得到学生和教师的信息,应该为学生和教师各建一个表,把这两个表分别叫作“学生”表和“教师”表,其中存放有关学生和教师的基本情况。
3.1.4确定需要的字段
表是由多个记录组成的,而每个记录又由多个字段组成。
在确定了所需表之后,接下来应根据每个表中需要存储的信息确定该表需要的字段,这些字段既包括描述主题信息的字段,又包括建立关系的主关键字字段。
为了保证数据的冗余性小且不遗漏信息,在确定表所需字段时应遵循以下6条规则。
1.字段唯一性
数据表中不能有与表内容无关的数据,必须确保一个数据表中的每个字段直接描述该表的主题。
例如,在“成绩”表中无须学生年龄的信息,该表中就不应包含有“年龄”及其相关字段。
2.字段无关性
即同一数据表中字段间不能有相互推导或计算的关系。
例如,只要记录学生的“出生日期”就可以计算出年龄,同样,总成绩通常是根据平时成绩、期中成绩和期末成绩计算出来的,因此,无须保留“年龄”和“总成绩”字段。
这样做可以节省数据库中存储数据的空间,同时也可防止对表中数据作修改时出现错误,从而实现在不影响其他字段的情况下,能够对任意字段进行修改。
3.使用主关键字段
实体完整性要求,数据库中的每个表都必须有一个主关键字唯一确定存储在表中的每条记录。
通常要用主关键字的值来查找记录,其长度直接影响数据库的操作速度,所以它不能太长,以方便记忆和输入。
4.外部关键字
在创建新表时,应保留与其他表相链接的少量信息,如“学号”、“课号”等字段。
这些用于“链接”的字段就是外部关键字。
5.收集所需的全部信息
即确保所需的数据信息都包括在设计的表中,或者可由这些表中的数据计算出来。
6.以最小的逻辑单位存储信息
如果把多个信息放入一个字段中,以后要获取单独的信息就会很困难,所以尽量把信息分解成较小的逻辑单位存储。
根据以上原则,可为“教学管理数据库”的各个表设置字段如表3.3~表3.7所示。
表3.3“学生”表中的字段
字段名
学号
姓名
性别
出生日期
专业
入学成绩
贷款否
照片
简历
身份证
籍贯
家庭地址
电话
特长
奖励
处分
病史
类型
C
C
C
D
C
N
L
G
M
C
C
C
C
C
C
C
C
宽度
7
8
2
8
10
5.1
1
4
4
18
10
50
15
60
60
60
60
注意:
这个“学生”表的表结构在教学管理数据库中又根据常用和非常用字段分成了“学生”表和“学生其他情况”表。
所以,在教学管理数据库中创建表时要把这里列出来的字段分别放在“学生”表和“学生其他情况”表里。
具体分法见表3.8的表3.9。
表3.4“课程表”
字段名
课号
课名
周课时
学分
专业类别
类型
C
C
N
N
C
宽度
6
30
2,0
2,0
1
记录
09001
电脑文秘应用
4
4
A
09002
信息管理
4
4
A
09003
计算机基础
2
2
B
09004
C++程序设计
4
4
B
09005
数据库原理
4
4
B
02005
英语B
(一)
4
4
B
02006
英语B
(二)
4
4
B
02001
英语A
(一)
4
4
A
02002
英语A
(二)
4
4
A
表3.5“教师”表
字段名
教师编号
姓名
性别
生日
职称
类型
C
C
C
D
C
宽度
5
8
2
8
6
记录
01025
谷京生
女
19620619
副教授
02012
高坤
男
19650312
副教授
03076
孙小雨
男
20500109
教授
08005
赵欢乐
女
19731215
讲师
09003
白丽文
女
19701204
副教授
09001
贾浩春
男
19530315
教授
表3.6“成绩”表
字段名
学号
课号
平时
期中
期末
字段名
学号
课号
平时
期中
期末
类型
C
C
N
N
N
类型
C
C
N
N
N
宽度
7
8
5.1
5.1
5.1
宽度
7
8
5.1
5.1
5.1
记录
0103011
09001
95.0
88.0
90.0
记录
0101019
02001
83.0
85.0
84.0
0108015
09003
75.0
87.0
82.0
9909010
09001
90.0
82.0
86.0
0108015
02005
80.0
89.0
91.0
9909010
09002
84.0
96.0
92.0
0103001
02001
91.0
83.0
85.0
0109039
09003
76.0
78.0
60.0
0103002
09001
78.0
86.0
81.0
0109039
02005
85.0
88.0
81.0
0008035
09003
80.0
90.0
90.0
9901009
02001
90.0
87.0
82.0
0008035
02005
95.0
93.0
90.0
9901009
02002
85.0
80.0
88.0
0008035
02006
90.0
91.0
87.0
9902010
09001
65.0
75.0
63.0
0103002
02001
90.0
97.0
96.0
9902010
09002
60.0
50.0
51.0
0101019
09001
88.0
69.0
76.0
9909018
09003
67.0
72.0
70.0
9909010
09003
88.0
65.0
72.0
9909018
09004
76.0
76.0
76.0
9909010
09004
70.0
90.0
84.0
9909018
02005
78.0
60.0
65.0
9909010
09005
80.0
70.0
70.0
9909018
02006
78.0
60.0
65.0
9909010
02005
78.0
84.0
82.0
9902010
02001
93.0
89.0
90.0
9909010
02006
82.0
75.0
78.0
9902010
02002
90.0
96.0
97.0
表3.7“专业”表
字段名
专业名称
专业类别
负责人
研究方向
类型
C
C
C
C
宽度
10
1
8
30
记录
中文
A
司马巩文
中西文化比较
外贸
A
高树生
中国纺织品贸易对全球的影响
英语
A
王国玉
中西语言文学比较
数学
B
梁菲菲
计算语言
计算机
B
李明
电子商务
其中,“学生”表中的“学号”字段、“教师”表的“教师编号”字段、“课程”表的“课号”字段和“专业”表中的“专业名称”字段,是对应表的主关键字段;而“成绩”表的“学号”和“课号”字段,则为该表的外部关键字段,用来联系“学生”表和“课程”表。
3.1.5确定各表之间的关系
到目前为止,已经把信息分成了各个表,在每个表中可存储各自的数据。
可是,这些表是独立的,还需要在这些表之间定义关系。
VF6将利用这些关系来查找数据库中有联系的信息并将它们重新组合,得到有意义的信息。
1.一对一关系
两表间的一对一关系不经常使用,因为在许多情况下,可将两个表中的信息合并成一个表。
也可能出于某种原因不想合并,比如,有些信息是不常用的,或者某些信息是机密的,不应给每个人看到。
例如“学生登记卡”中保留的一些特殊信息(如病例资料或受到的奖励及处分等),这些信息不需要经常查看,或者只能由学校的某些授权单位查看。
所有可创建一个以“学号”为主关键字的单独表来存储这些信息,学生基本情况表与这张表是一对一的关系。
2.一对多关系
一对多关系是关系型数据库中最普遍的关系。
例如“专业”表和“学生”表之间就是一对多的关系,因为一个学生只能有一个专业(这里不考虑第二学历的情况),而每个专业则有多个学生。
3.多对多关系
在具有多对多关系的两表之间,如果将一个表的主关键字添加到另一个表中,那么就会出现同一信息保存多次的情况,这样不利于信息的管理和维护。
因此,在设计数据库时,应将多对多关系分解成两个一对多关系,其方法就是在具有多对多关系的两个表之间创建第3个表。
在VF6中,把用于分解多对多关系的表称为“纽带表”,因为它们在两个表之间起着纽带的作用。
纽带表可能只包含了它所连接的两个表的主关键字也可以包含其他信息。
在纽带表中,两个字段连在一起就能使每个记录具有唯一值。
例如,“学生”表和“课程”表之间就是多对多的关系:
每门课程可以有多个学生选修,同样一个学生也可以选修多门课程。
而“成绩”表就是“学生”表和“课程”表之间的纽带表,通过“成绩”表把“学生”表和“课程”表联系起来。
比如,通过“学生”表和“成绩”表,可以查出某个学生各门功课的成绩;而通过“课程”表和“成绩”表,可以查出某门课程都有哪些学生选修,以及这门课程的考试成绩等信息。
如果考虑到一个教师可能不止开一门课,而同一门课也可能有几位教师同时讲授的情况,那么“教师”表和“课程”表也是多对多的关系。
为此,也应该设置一个纽带表,以把“教师”表和“课程”表分解成两个一对多关系。
基于以上考虑,在“教学管理数据库”中再增加两个表,“学生其他情况”表和“任课”表。
将原来“学生”表中的一些不常用或需要保密的字段移入“学生其他情况”表中;而“任课”表作为“教师”和“课程”表之间的纽带表,应将“教师”表的主关键字“教师编号”和“课程”表的主关键字“课号”放入其中。
调整后的“学生”表、“学生其他情况”和“任课”表中的字段,分别如表3.8~表3.10所示。
表3.8“学生”表中的字段
字段名
学号
姓名
性别
出生日期
专业
入学成绩
贷款否
照片
简历
类型
C
C
C
D
C
N
L
G
M
宽度
7
8
2
8
10
5.1
1
4
4
记录
0103001
王丽丽
女
1983-3-23
外贸
626.5
.T.
略
略
0103002
王小刚
女
1983-7-20
外贸
641.5
.F.
略
略
0101019
张红军
男
1982-4-2
中文
450
.F.
略
略
9901009
乌兰
女
1981-5-6
中文
480
.F.
略
略
0108015
高丽雅
女
1983-8-23
数学
587.5
.T.
略
略
0008035
达古拉
男
1982-7-25
数学
600.5
.F.
略
略
9909010
李天宁
男
1981-2-21
计算机
622.5
.T.
略
略
0109039
邬军
女
1983-6-3
计算机
654
.T.
略
略
9909018
赵欣欣
男
1982-4-12
计算机
652
.F.
略
略
9902010
马小莎
女
1981-5-21
英语
522.5
.F.
略
略
表3.9“学生其他情况”表
字段名
学号
身份证
籍贯
家庭住址
电话
特长
奖励
处分
病史
类型
C
C
C
C
C
C
C
C
C
宽度
7
18
10
50
15
60
60
60
60
记录
0103001
1101081983
0323011A
安徽
北京海淀区江岸小区34幢3单元302
62313380
唱歌
高中时连续三年三好生
无
无
0103002
4206231983
07200101
湖北
湖北襄樊市白马小区3幢2单元304
4741873
跳高
足球
高中时被评为特等生
无
无
0101019
5301201982
04020233
云南
云南昆明市江北小区4幢3503219单元502
4133224
围棋
无
无
无
0108015
5301201981
05060231
云南
云南昆明市江北小区4幢3单元502
503219
跳舞
篮球
无
无
无
0008035
1101081983
08230112
湖南
北京海淀区育新小区64幢1302
62338090
排球
足球
2000年被评为三好学生
无
无
9909010
1101081982
0725012A
江苏
北京海淀区永生小区13幢2单元302
82903132
讲演
无
无
无
0109039
1101081981
05210132
四川
北京西城区方生小区34幢3单元402
65883030
集邮
2000年获校集邮展三等奖
无
肺炎
9909018
1101081983
06030122
四川
北京海淀区富润小区3幢402
63227878
象棋
1999年获北京数学竞赛一等奖
因作弊受处分
无
9902010
1101081982
04120224
黑龙江
北京海淀区阳光小区2幢3单元101
62113434
长跑
足球
2000年获北京市长跑第2名
无
无
0108015
1101081981
0521011X
黑龙江
北京海淀区金星岸小区5幢4单元302
67857979
摄影
1999年获优秀作品奖
无
无
表3.10“任课”表
字段名
教师编号
课号
字段名
教师编号
课号
类型
C
C
类型
C
C
宽度
5
6
宽度
5
6
记录
02012
02005
记录
09001
09003
02006
02005
09003
09004
09003
09002
09001
09005
09001
09001
02006
02006
09003
09001
02012
02001
09001
09002
02012
02002
这样,在“教学管理数据库”中共有7个表:
“学生”、“教师”、“课程”、“任课”、“成绩”、“专业”和“学生其他情况”。
其中“学生”表和“学生其他情况”表是通过“学号”联系起来的一对一的关系,而“专业”表与“学生”表、“学生”表与“成绩”表、“课程”表与“成绩”表、“课程”表与“任课”表、“教师”表与“任课”表之间都是通过对应字段联系起来的一对多关系。
在一对多关系中,位于“一”方的表称为“父表”,和父表有关系的对应表为子表,父表也称为主表或主控表,子表又称为相关表或受控表。
主表是一对一或一对多关系中被其他表所引用的表,相关表是引用其他表中字段的表。
在一对一或一对多关系中,父表用于建立关系的字段必须是主关键字,而子表中用于建立关系的字段是外部关键字。
3.1.6完善数据库
在设计数据库时,由于信息复杂和情况变化会造成考虑不周,如某些表没有包含属于自己主题的全部字段,或者包含了不属于自己主题的字段。
此外,在设计数据库时经常忘记定义表与表之间的关系,或者定义的关系不正确。
因此,在初步确定了数据库需要包含哪些表、每个表含哪些字段以及各个表之间的关系以后,还要重新研究一下设计方案,检查可能存在的缺陷,并进行相应的修改。
只有通过反复修改,才能设计出一个完善的数据库系统。
3.2创建数据库
数据库设计完成后,就可以创建数据库了。
VF6数据库文件的扩展名式DBC。
数据库可以单独使用,也可以合并到一个项目中,用项目管理器进行管理。
3.2.1建立数据库文件
所有相关联的数据库对象,例如表、视图、连接和存储过程,都存放在一个数据库容器中,在数据库设计完成后,需要在VF6中建立起相应的数据库文件,然后才能在数据库中添加数据库对象。
可以使用向导、设计器创建数据库,也可以使用CREATDATABASE命令来创建数据库。
下面结合“教学管理数据库”的建立,讨论如何创建数据库。
利用“数据库设计器”创建数据库
【例3.1】利用“数据库设计器”来创建“教学管理数据库”。
①在项目管理器中选择“数据”选项卡,然后选择“数据库”,单击“新建”按钮,打开“新建数据库”对话框,如图3.1所示
图3.1新建数据库对话框
②在“新建数据库”对话框中单击“新建数据库”按钮,打开“创建”对话框。
③在“创建”对话框中,确定数据库的类型、名称和保存位置。
其中数据库类型和保存位置是默认的(因为已经建立了工作目录)不需要改变,但应在“名称”文本框中输入用户自己给数据库取的名字。
在这里输入“教学管理数据库”。
④单击“保存”按钮,系统将打开“数据库设计器”对话框,操作界面参见图3.21。
打开“数据库设计器”对话框的同时会在屏幕上出现一个数据库设计器工具栏。
可以用数据库设计器工具栏快速访问与数据库相关的选项。
“数据库”菜单中包含了各种可以用的数据库命令。
此外,在“数据库设计器”中单击鼠标右键,可以显示出快捷菜单。
到此为止,“教学管理数据库”已经建立。
单击“数据库设计器”右上角的关闭按钮,画面就回到“项目管理器”窗口中,这时,可以看到刚刚建立的“教学管理数据库”已经显示在项目管理器窗口中,结果参见图2.13。
在创建数据库的同时,系统也建立了表、本地视图