2.2 知识要点
1.数据库设计理论基础
在设计数据库之前,应该对数据库设计的基本概念有一个充分的了解。逻辑数据库设计规范需要使用一些标准化的方法把原始数据分割成多个相关的表,规范化数据库的特征是表的宽度较窄(表中的列数较少),数量较多,而未规范化数据库的特征是表的宽度较宽(表中的列数较多),数量较少。
在关系数据库设计理论中,规范化规则规定了一个设计良好的数据库必须取舍的一些属性。这些规范化规则非常复杂,已经超出了本书的学习范围。但有一些简单的规则可以帮助我们设计出合理的数据库。这些规则有:
- 每个表都应该具有标识符(关键字);
- 一个表应该只存储一种实体的数据;
- 表中不应该有允许空值的列;
- 表中不应该有重复的数据值和列。
2.创建数据库及表
在Visual FoxPro 6.0中,除了在项目管理器窗口中创建数据库外,还可以使用CREATE DATABASE命令建立数据库,分别包括扩展名为.dbc、.dct和.dcx的3个文件,用户不能直接修改这些文件。
打开数据库时,可以在项目管理器窗口中选择要打开的数据库,也可以使用OPEN DATABASE命令打开数据库。
创建表结构其实就是设计字段的基本属性。可以使用表设计器、表向导或SQL命令来创建表结构,对表结构的修改可以使用MODIFY STRUCTURE命令。有关表操作的几个常用命令见表2-1所示。
表2-1 有关表操作的常用命令
本章将以图书管理为例,设计一个“Books.dbc”数据库,该数据库包含“图书.dbf”、“读者.dbf”、“借阅.dbf”等表。在这个数据库中能了解到所有图书的信息、读者的信息、图书借阅情况等。
3.浏览记录
在Visual FoxPro 6.0中,可以通过“浏览”窗口或“编辑”窗口浏览表中的记录。“浏览”窗口和“编辑”窗口可以相互切换。
使用LIST或DISPLAY命令可以显示记录。LIST与DISPALY命令的区别是:LIST命令连续显示表中记录,直到显示全部记录为止,而DISPLAY命令是显示当前记录。使用这两个命令都可以有条件的显示记录。
4.定位记录
定位记录包括记录指针的绝对移动和相对移动两种方式。绝对移动记录指针使用GO或GOTO命令,相对移动记录指针使用SKIP命令,见表2-2所示。
表2-2 记录定位命令
测试记录指针经常使用EOF()、BOF()、RECNO()函数,打开表时表中记录指针情况见表2-3所示。
表2-3 打开表时表中记录指针情况
在“浏览”或“编辑”记录窗口可以直接对记录进行修改,也可以使用EDIT、CHANGE或BROWSE命令在“浏览”或“编辑”记录窗口进行修改,但修改记录的方式是逐条进行的。
如果要成批修改记录,可以使用成批替换记录REPLACE命令。
5.数据统计
(1)统计记录
统计记录个数,使用COUNT命令,命令格式如下:
COUNT [<范围>] [TO <内存变量>][FOR <条件>]
该命令统计指定范围内满足条件的记录个数,结果可存入内存变量。
(2)数值字段列向求和
数值字段列向求和使用SUM命令,格式如下:
SUM [<范围>] [<数值表达式列表>] [TO <内存变量列表>] [FOR <条件>]
该命令对当前表中数值型字段列向求和。若省略所有选项,则对表中的所有数值型字段列向求和。<数值表达式列表>是由数值型字段组成的表达式,使用该选项,仅计算各个数值表达式的值,各表达式之间用逗号间隔。如果使用TO <内存变量列表>选项,将各个数值表达式的值或数值型字段的值依次赋给各个内存变量,内存变量的个数必须与数值表达式的个数相同。
(3)数值字段列向求平均值
使用AVERAGE命令可以快速计算数值字段的平均值,其命令格式如下:
AVERAGE [<范围>] [<数值表达式列表>] [TO <内存变量列表>][FOR <条件>]
该命令对当前表中数值型字段列向求平均值。AVERAGE命令与SUM命令的用法完全相同,不同之处是前者对数值型字段或数值表达式列向求平均值,后者求和。
6.建立索引
Visual FoxPro 6.0中的索引是由指针构成的文件,这些指针在逻辑上按照索引关键字的值进行排序。索引文件和表文件分别存储,并且不改变表中记录的物理顺序。实际上,创建索引就是创建一个由指向.dbf文件记录指针构成的文件。若根据特定顺序处理记录,可以选择一个相应的索引,使用索引还可以加速对表的查看和访问。
在Visual FoxPro 6.0中,索引分为主索引、候选索引、普通索引和唯一索引4种类型。
一个数据库表只能建立一个主索引,可以建立多个候选索引。自由表不能建立主索引。一个表可以建立多个候选索引和普通索引,每一个索引决定了该表记录的一种逻辑排列顺序。
建立索引可以在表设计器的“索引”选项卡中设置,并且可以设置主索引。使用命令方式只能建立普通索引、唯一索引(UNIQUE)或候选索引(CANDIDATE),但不能建立主索引。
(1)建立普通索引命令
INDEX ON <索引表达式> TO <单索引文件名> [FOR <条件>]
建立的单索引文件名的扩展名为.idx,是为了兼容以前版本建立的索引文件。
(2)结构复合索引文件命令
INDEX ON <索引表达式> TAG <索引名> [FOR <条件>] [ASCENDING | DESCENDING] [UNIQUE] [CANDIDATE]
结构复合索引文件与其表文件具有相同的文件名(扩展名不同)。
(3)非结构复合索引文件命令
INDEX ON <索引表达式> TAG <索引名> OF <索引文件名> [FOR <条件>] [ASCENDING | DESCENDING] [UNIQUE]
非结构复合索引文件名由用户指定,但不能与表同名。非结构复合索引中不能定义候选索引。
7.使用索引
(1)打开索引文件
SET INDEX TO <索引列表>
索引列表中各索引文件用逗号分开,可以包含.idx索引和.cdx索引。与表文件名相同的结构复合索引文件在打开表时自动打开。
USE <表名> ORDER <标识名>
打开表的同时指定主控索引。
(2)设置主控索引
SET ORDER TO [<数值表达式> | [TAG] <索引名> [OF <复合索引文件名>] [ASCENDING | DESCENDING]]
(3)使用索引快速查找记录
SEEK <表达式>
只能在索引文件中查找记录。
(4)删除索引
删除索引可以在表设计器的“索引”选项卡中删除。使用命令删除结构索引的格式如下:
DELETE TAG <索引名> DELETE TAG ALL 表示删除全部索引。
8.设置字段属性
数据库表的字段属性设置包括:设置字段标题,设置字段注释来标识字段信息,设置字段默认值,设置字段输入掩码和显示格式,设置字段有效性规则来限制输入字段的数据内容等。数据库表具有这些字段属性,而自由表没有这些属性,这也是数据库表与自由表的一个区别。
字段级规则是一种与字段相关的有效性规则,在插入或修改字段值时被激活,多用于数据输入正确性的检验。
记录级规则是一种与记录相关的有效性规则,当插入或修改记录时激活,常用来检验数据输入和正确性。记录被删除时不使用有效性规则。记录级规则在字段级规则之后和触发器之前激活,在缓冲更新时工作。
触发器是一个与表紧密相关的表达式,当对表中的记录进行插入、更新或删除操作时激活相应的触发器。触发器是作为某个特定表的属性而存在的,如果将一个表从数据库中移走,与这个表相关的触发器也立即被删除。触发器表达式必须是一个逻辑表达式,返回真(.T.)或假(.F.)值。
每个表最多创建3个触发器:插入触发器、更新触发器和删除触发器。
9.工作区的使用
所谓工作区就是在内存中为表独立开辟的存储空间。要使用多个表,就要使用多工作区。一个工作区就是一个编号区域,Visual FoxPro 6.0定义的32767个工作区。在应用程序中通常使用该工作区中表的别名来标识工作区。表别名是一个名称,它可以引用工作区中打开的表。
(1)使用数据工作期
使用“数据工作期”窗口可以观察到打开的表。要打开“数据工作期”窗口,可以在“命令”窗口输入SET命令。每个数据工作期包含了它自己的一组工作区,这些工作区包括工作区中打开的表、表索引及表之间的关系。在数据工作期打开表时,系统指定最低可用的工作区号。
(2)指定工作区
当前工作区是指正在使用的工作区。可以通过“数据工作期窗口”或用SELECT命令把任何一个工作区设置为当前工作区。指定工作区的命令是:
SELECT <工作区号> | <别名> | <0>
(3)在工作区打开或关闭表
使用USE命令打开表的格式如下:
USE <表名> [ALIAS <别名>] [AGAIN]
在指定工作区打开多个表,其USE命令格式如下:
USE <表名> IN <工作区号> | <别名> | <0>
可以在“数据工作期”窗口中查看各工作区打开的表。
在一个工作区中不能同时打开多个表。
(4)使用表的别名
表的别名是指在工作区中打开表时为该表所定义的名称。可以自定义别名,否则系统默认就以表名作为别名。若一张表在多个工作区中被打开,系统默认在表名后依次加_a、_b……除此之外,用户还可以使用USE <表名> ALIAS <别名>命令来指定别名。
如果使用包含AGAIN子句的USE命令,可以同时在多个工作区中打开同一个表;如果在每个工作区中打开该表时都没有指定别名,这时系统根据情况自动为表指定别名。
在别名后加上“.”或“->”,然后再接字段名,可以引用其他工作区的字段。
(5)表的独占与共享使用
独占使用是指一张表只能被一个用户打开。Visual FoxPro 6.0在默认状态以独占方式打开。
共享使用是指一张表可以被多个用户同时打开。
系统的默认打开方式可以通过“工具”菜单中的“选项”设置,或用下列命令:
SET EXCLUSIVE OFF &&默认打开方式为共享 SET EXCLUSIVE ON &&默认打开方式为独占
例如:
USE 图书 SHARED &&以共享方式打开“图书”表 USE 图书 EXCLUSIVE &&以独占方式打开“图书”表
(6)利用缓冲访问表中的数据
数据缓冲是指先将对表记录的修改存放在缓冲区中,用户决定是否用缓冲区中的数据更新表文件。它是VFP6.0在多用户环境下用来保护对表记录所做的数据更新和数据维护操作的一种技术。
- 数据缓冲的包括记录缓冲和表缓冲两种类型。
- 记录缓冲:当记录指针移动或关闭表时,缓冲区自动更新表中的相应记录。
表缓冲:当发出更新表的命令或关闭表时更新表。
10.建立表间关系
Visual FoxPro 6.0中数据库表之间有3种关系:一对一关系、一对多关系和多对多关系。
两个表之间的一对一关系不常使用,因为在许多情况下,两个表的信息可以简单地合并成一个表。
一对多关系是关系数据库中最普遍的关系。“一”方使用主关键字或候选索引关键字,而“多”方使用普通索引关键字。
在使用多对多关系的数据库时,需要创建第3个表,把多对多关系分解成两个一对多的关系,第3个表起桥梁作用。
建立表间关系包括建立表间临时关系和建立表间永久关系。在“数据工作期”窗口建立两个表之间的关系,这种关系是临时关系。当关闭数据库表时,这种关系也随之撤销。使用SET RELATION命令也可以建立表间的临时关系,命令格式如下:
SET RELATION TO <关联表达式> INTO <工作区号>|<别名> [ADDITIVE]
不带参数的SET RELATION TO命令撤销关系。
永久关系是数据库表之间的一种关系,不仅运行时存在,而且一直保留。表之间的永久关系是通过索引建立的。
11.临时关系与永久关系的区别
- 临时关系是用来在打开的两个表之间控制相关表之间记录的访问;而永久关系主要是用来存储相关表之间的参照完整性,也可以作为默认的临时关系或查询中默认的连接条件。
- 临时关系在表打开之后使用SET RELATION命令建立,随表的关闭而解除;永久关系永久地保存在数据库中而不必在每次使用表时重新创建。
- 临时关系可以在自由表之间、库表之间或自由表与库表之间建立,而永久关系只能在库表之间建立。
- 临时关系中一个表不能有两个主表(除非这两个主表是通过子表的同一个主控索引建立的临时关系),永久关系则不然。
12.参照完整性
建立参照完整性涉及生成一系列规则,以便在输入或删除记录时,能保持已定义的表间关系。实施参照完整性规则,可以确保以下几方面:
- 当主表中没有记录时,记录不得添加到相关表中。
- 主表的值不能改变,如果改变它将导致相关表中出现孤立的记录。若某主表记录在相关表中有匹配记录,则该主表记录不能被删除。
Visual FoxPro 6.0的参照完整性规则包括更新规则、删除规则和插入规则。
用户也可以编写自己的触发器和存储过程代码来实施参照完整性。
在建立参照完整性之前必须先清理数据库,所谓清理数据库就是物理删除数据库各个表中所有带删除标记的记录。