减少数据库冗余方法谈 王守银 2001年 50期 一般在各类数据库管理系统中,都要设计生成许多的数据库。通常数据库中各字段的名称、类型、宽度都是根据用户的实际需要在系统开发时设计完成的,系统运行时大多不会改变数据库的结构类型。系统设计中如果数据库中字段的类型、宽度大小设计不合适,就将造成大量数据空间的浪费。因为VFP数据库管理系统数据库的特性是,当增加一条数据库记录时,即使没有输入任何数据,也要占用的相当的磁盘空间。因为在设计一个数据库的结构时,每个字段都要考虑最大数据输入时的情况,如在一个人员管理系统数据库的设计时,工作单位、家庭住址、通信地址等数据内容的字段一般都采用字符型,其宽度大小都要考虑最大输入情况,这样即使大多数记录的数据内容不多,也要占用同样多的数据空间。当一个数据库中的记录数非常大时,就会造成大量磁盘空间的浪费,那么能否采用一种方法来解决这种造成磁盘空间大量浪费的问题呢?   我们知道,当在VFP6系统中建立一个数据表时,如果数据表中存在一个以上的备注字段,将会产生一个与该数据表同名的备注文件,后缀为.FPT。当其中一个字段数据的类型为备注型(M)时,该数据表就会为该备注字段预留4个字节作为其字段的“特殊数据”,这4个字节并不是用来保存数据的,而是用来存放该条记录的备注字段数据在备注文件(.FPT)中的位置,它相当于一个指针,负责指出该条记录备注字段的数据存放在备注文件中的位置。备注文件包含一个头记录以及任意数目的块结构。头记录中包含指向下一个自由块的指针以及以字节为单位表示的块大小。头记录之后是包含块标头与备注文本的各个块,表文件中包含有用于引用备注块的块编号。备注文件中某个块的位置可由该块的编号与块的大小相乘来得到。所有的备注块均由偶数的块边界地址开始。每一备注块可以占用一个以上的连续块。备注块是备注字段的最小处理单位。在每个备注块前面的8个字节是系统占用的,这8个字节前四个字节指明块中数据的类型,第5至第8个字节代表该备注字段的长度,这样当我们设置备注块大小为64时(系统默认值为64),每个备注块实际只能存放64-8=56个字节。当存放的数据大于56个字节时,将会增加一个备注块。因此,当我们建立一个数据表时,应根据数据表中存放数据的内容来确定备注块的大小,系统默认的备注块大小为64个字节,使用设置命令SET BLOCKSIZE TO nBytes指定系统为备注字段分配磁盘空间的块的大小,如果nBytes等于0,磁盘空间按单个字节分配,如果nBytes为1~32之间的一个整数,系统分配磁盘空间快大小为nBytes乘以512,nBytes值大于32,系统将会将nBytes看做备注块的大小。   一般情况下,可以通过mline()读取备注中某一行中的数据值,而备注字段每一行的字符大小可以通过SET MEMOWIDTH TO nColumns来指定备注字段的宽度,这个nColumns值的大小在8到8192之间,用户可以根据数据库中某一宽度最大字符型字段的宽度设置这个值,如在数据库中家庭住址为最大值,最多需要60个字符宽度,那么我们可以把nColumns的值设为60,这样就完成了对备注字段的设置。   了解了这些知识后,我们就可以利用备注字段的这些特性通过编程实现备注字段存储其它字符型字段内容。   基本思路是:在设计的数据库中,设计一个备注字段用来存放用户需要保存、字符宽度比较大的多个字符型字段内容,通过程序控制分别把输入的数据保存在备注字段中的某一行并在数据后加入回车换行字符,这样就保证了每一个字段内容对应于备注字段中的一行记录内容,这样存储就保证了在备注字段中只存放有用的数据内容,而不保存后缀空格等无用信息,当大宽度字符型字段比较多并且数据库的记录数非常大时,利用这种方法减少数据冗余效果更加明显。下面是笔者以一个简单的例子演示这种方法实现的过程:   1.一个数据库,包括姓名、性别、其它内容三个字段,这里姓名、性别为字符型,宽度为别为8和2,其它内容设为备注类型,存放人员的联系电话、工作单位、家庭住址、通信地址等内容,设计完成后,增加一条空记录内容。   2.新建一个表单,如^50020501a^所示:   表单中的姓名、性别编辑框对应数据库中相应的数据字段,在表单中的INIT事件中写入如下代码:   SET MEMOWIDTH TO 60   &以下为对编辑框提取数据内容;   thisform.text3.value=MLINE(其它内容,1)   thisform.text4.value=MLINE(其它内容,2)   thisform.text5.value=MLINE(其它内容,3)   thisform.text6.value=MLINE(其它内容,4)   在联系电话、工作单位、家庭住址、通信地址编辑框中的LOSTFOCUS事件中分别写入如下代码:   NRWZ=1 &表明该字段内容为备注字段中的第几条内容,1代表联系电话,2代表工作单位,3代表家庭住址,4代表通信地址;   NR=''   FOR I=1 TO 4 &代码共有4个字段内容取自备注字段,用户可根据情况来设定;   IF I=NRWZ   NR=NR+ALLT(THIS.VALUE)+CHR(13)   ELSE   NR=NR+MLINE(其它内容,I)+CHR(13)   ENDIF   ENDFOR   REPL其它内容WITH NR   这样一个简单的测试表单就完成了,运行这个表单可以看到,输入在编辑框中的数据将会保存在备注字段中,下次运行时可将备注字段中的内容取出来,这样就很方便地利用一个备注字段来保存多个字符型字段内容,实现减少系统数据库的磁盘空间冗余。根据这种方法,用户可为应用系统中增加这种功能来减少数据的冗余量,有兴趣的读者不妨一试。