减少数据库冗余方法谈

Author: 王守银 Date: 2001年 50期

?牐犚话阍诟骼嗍菘夤芾硐低持校家杓粕尚矶嗟氖菘狻MǔJ菘庵懈髯侄蔚拿啤⒗嘈汀⒖矶榷际歉萦没У氖导市枰谙低晨⑹鄙杓仆瓿傻模低吃诵惺贝蠖嗖换岣谋涫菘獾慕峁估嘈汀O低成杓浦腥绻菘庵凶侄蔚睦嘈汀⒖矶却笮∩杓撇缓鲜剩徒斐纱罅渴菘占涞睦朔选R蛭猇FP数据库管理系统数据库的特性是,当增加一条数据库记录时,即使没有输入任何数据,也要占用的相当的磁盘空间。因为在设计一个数据库的结构时,每个字段都要考虑最大数据输入时的情况,如在一个人员管理系统数据库的设计时,工作单位、家庭住址、通信地址等数据内容的字段一般都采用字符型,其宽度大小都要考虑最大输入情况,这样即使大多数记录的数据内容不多,也要占用同样多的数据空间。当一个数据库中的记录数非常大时,就会造成大量磁盘空间的浪费,那么能否采用一种方法来解决这种造成磁盘空间大量浪费的问题呢?
  ?牐犖颐侵溃痹赩FP6系统中建立一个数据表时,如果数据表中存在一个以上的备注字段,将会产生一个与该数据表同名的备注文件,后缀为.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看做备注块的大小。
  ?牐犚话闱榭鱿拢梢酝ü齧line()读取备注中某一行中的数据值,而备注字段每一行的字符大小可以通过SET MEMOWIDTH TO nColumns来指定备注字段的宽度,这个nColumns值的大小在8到8192之间,用户可以根据数据库中某一宽度最大字符型字段的宽度设置这个值,如在数据库中家庭住址为最大值,最多需要60个字符宽度,那么我们可以把nColumns的值设为60,这样就完成了对备注字段的设置。
  ?牐犃私饬苏庑┲逗螅颐蔷涂梢岳帽缸⒆侄蔚恼庑┨匦酝ü喑淌迪直缸⒆侄未娲⑵渌址妥侄文谌荨?
  ?牐牷舅悸肥牵涸谏杓频氖菘庵校杓埔桓霰缸⒆侄斡美创娣庞没?需要保存、字符宽度比较大的多个字符型字段内容,通过程序控制分别把输入的数据保存在备注字段中的某一行并在数据后加入回车换行字符,这样就保证了每一个字段内容对应于备注字段中的一行记录内容,这样存储就保证了在备注字段中只存放有用的数据内容,而不保存后缀空格等无用信息,当大宽度字符型字段比较多并且数据库的记录数非常大时,利用这种方法减少数据冗余效果更加明显。下面是笔者以一个简单的例子演示这种方法实现的过程:
  ?牐?1.一个数据库,包括姓名、性别、其它内容三个字段,这里姓名、性别为字符型,宽度为别为8和2,其它内容设为备注类型,存放人员的联系电话、工作单位、家庭住址、通信地址等内容,设计完成后,增加一条空记录内容。
  ?牐?2.新建一个表单,如^50020501a^所示:
  ?牐牨淼ブ械男彰⑿员鸨嗉蚨杂κ菘庵邢嘤Φ氖葑侄危诒淼ブ械腎NIT事件中写入如下代码:
  ?牐燬ET MEMOWIDTH TO 60
  ?牐?&以下为对编辑框提取数据内容;
  ?牐爐hisform.text3.value=MLINE(其它内容,1)
  ?牐爐hisform.text4.value=MLINE(其它内容,2)
  ?牐爐hisform.text5.value=MLINE(其它内容,3)
  ?牐爐hisform.text6.value=MLINE(其它内容,4)
  ?牐犜诹档缁啊⒐ぷ鞯ノ弧⒓彝プ≈贰⑼ㄐ诺刂繁嗉蛑械腖OSTFOCUS事件中分别写入如下代码:
  ?牐燦RWZ=1 &表明该字段内容为备注字段中的第几条内容,1代表联系电话,2代表工作单位,3代表家庭住址,4代表通信地址;
  ?牐燦R=''
  ?牐燜OR I=1 TO 4 &代码共有4个字段内容取自备注字段,用户可根据情况来设定;
  ?牐營F I=NRWZ
  ?牐燦R=NR+ALLT?煟═HIS.VALUE)+CHR(13)
  ?牐燛LSE
  ?牐燦R=NR+MLINE?煟ㄆ渌谌荩琁)+CHR(13)??
  ?牐燛NDIF
  ?牐燛NDFOR
  ?牐燫EPL其它内容WITH NR
  ?牐犝庋桓黾虻サ牟馐员淼ゾ屯瓿闪耍诵姓飧霰淼タ梢钥吹剑淙朐诒嗉蛑械氖萁岜4嬖诒缸⒆侄沃校麓卧诵惺笨山缸⒆侄沃械哪谌萑〕隼矗庋秃芊奖愕乩靡桓霰缸⒆侄卫幢4娑喔鲎址妥侄文谌荩迪旨跎傧低呈菘獾拇排炭占淙哂唷8菡庵址椒ǎ没Э晌τ孟低持性黾诱庵止δ芾醇跎偈莸娜哂嗔浚行巳さ亩琳卟环烈皇浴?