本文适用于附件(各类文档、图片和压缩包等,下同)比较多的应用系统(如:知识管理系统、集团 ERP 管理系统),可以对大批量的文档进行树状结构化目录存储,能迅速定位到服务器端的文档,提高文档据名查询的速度。
目前大多数应用系统对附件 的存储重视不够,一般在系统应用的初期阶段附件不多,所以查询的性能体现不出来。而对于像知识管理系统这样的知识分享系统,经过多年的运行后,会产生上百万的文档,如果不对文档进行合理化的管理,那么查询性能会越用越慢。
目前对附件的存储大概有一下几种方式: 1 。把附件放在服务器端单个文件夹中,那么在附件达到上百万时,从这些文件中查询一个文件,速度是何其慢; 2 。按日期存放,这种方式应该说还不错,但这种方式会让日期文件夹无限增多,会出现有些日期文件夹中附件多,有些日期文件夹中附件少的不均衡现象; 3 。把附件存在数据库中,这种方法比较适合附件比较少的情况,如果附件达到上百万,那么当几千人并行去数据库读取附件时,那么会遇到如下问题: 1 )数据库的 I\O 性能瓶颈问题 ;2 )把文件以流的方式读入到内存,再到前台展示或下载,那么对服务器的内存负载也是一个很大的压力 ;3 )把文件以流的方式在服务器端先转化为文档,再去前台展示或下载,而转换为文档又需要一定时间,如果是一个大文档转化时间会更长; 4 )如果文件名称相同的话,那可能会遇到错误。
所以针对目前的现状,我对此提出一种方法,对附件进行树状结构化目录管理,就是把附件以原始文档或对其进行压缩形成压缩包的形式存放在硬盘上,但这些文档存放时是根据数据库中附件记录的编码 ID 以一种树状的结构进行存储的,根据文档等级配置表,对其编码 ID 进行补码后截断,根据不同等级方式进行存放,例如,按照 2 级树状结构进行存储,那么同一等级树节点中的文档数目是一样的,这样会做到文档存放均衡;也可以按照不同等级混合存放,那么文档可以局部均衡,在读取文档的时候,根据附件记录表中的编码 ID ,再次进行补码后截断,折算出文档树路径,准确定位到文档,可以直接提供给前台页面进行展示或下载,一步到位。
文档树状结构化目录管理原理:用户上传文档时在数据库文档表中产生一条记录,同时记录会自动产生一个数字型记录编码,根据系统设置好的目录树等级配置表的等级,对编码补码(补 0 )后,折算出母文件夹名称,子文件夹名称和文件名,这样就产生了文件的路径。
文档树状结构化目录分为均衡目录方式和混合存放方式,均衡存放表示所有文档是按照同一个等级存放的,例如文档编码是 123 ,根据配置表 2 级树定位为 8 位编码,补码后是 00000123 ,那么 8 ÷ 2=4 ,那么前四位( 0000 )为母文件夹,后四位( 0123 )为子文件夹和文件名,那么文件的上传路径就是 0000\0123\0123 ,根据路径上传文档即可,那么下载文档的原理和上传的原理是类似的。混合存放表示文档树状结构化目录可以按多个等级一起存储,文件上传流程图如下图 1 。
图 1
根据上面的说明,下面举例说明如何上传文档,为了举例的方便,先定义这三个数据表如下:
首先在数据库中定义 3 个表(参阅附件 1 ),它们分别是 1 )目录树等级配置表( LevelConfig ),它的字段有:编码、目录树节点等级、目录树等级位数、有效性,表示定义文档目录树的等级,一般定义二级或三级树即可,多余三级就比较繁琐,那么还要定义好等级编码的位数,这个是非常重的配置,要根据不同的数据库去配置,有效性表示目前在用的等级; 2 )另一个是文档表( Doc ),也即是存放附件的记录表,字段有:编码、文档物理名称、扩展名、文档大小、是否压缩、目录树等级编码,在存放的时候,也可以让用户选择是否压缩,如果选择了压缩,那么将以压缩包的形式上传存放到服务器硬盘上; 3 )还有一个就是文档扩展名表( DocExt ),它的字段是:编码,名称,它表示文档格式的表。
目录树等级配置表 (LevelConfig) (需要说明的是目录树等级位数我是按照 4 位晋级的,例如 2 × 4=8 ,这样每个母文件夹最多可以存放 10000 个文档)
|
|||
编码 |
目录树节点等级 |
目录树等级位数 |
有效性 |
A |
2 |
8 |
1 |
B |
3 |
12 |
0 |
C |
4 |
16 |
0 |
D |
5 |
20 |
0 |
E |
6 |
25 |
0 |
|
|
|
|
文档表 (Doc) |
|||||
编码 |
文档物 理名称 |
文档 扩展名 |
文档 大小 |
是否 压缩 |
目录树 等级编码 |
… |
|
|
|
|
|
123 |
文档 123 |
1 |
500 |
0 |
A |
124 |
图片 124 |
2 |
300 |
0 |
A |
… |
|
|
|
|
|
9527 |
文档 9527 |
1 |
9000 |
1 |
A |
… |
|
|
|
|
|
均衡存放文档数据表
文档表 (Doc) |
|||||
编码 |
文档物 理名称 |
文档 扩展名 |
文档 大小 |
是否 压缩 |
目录树 等级编码 |
… |
|
|
|
|
|
123 |
文档 123 |
1 |
500 |
0 |
A |
124 |
图片 124 |
2 |
300 |
0 |
B |
… |
|
|
|
|
|
9527 |
文档 9527 |
1 |
9000 |
1 |
A |
… |
|
|
|
|
|
文档扩展名表( DocExt ) |
|
编码 |
名称 |
1 |
Doc |
2 |
Jpg |
3 |
Zip |
4 |
Xls |
5 |
|
… |
|
混合存放方式文档数据表
根据上面定义好的数据表,现按照 2 种方式举例说明如何进行文档的树状结构化目录管理。
1. 均衡存放方式:顾名思义就是文档中的各级文档数目都是相等的,那么在存储文档时就是所有的文档都是按照同一级别存放的,例如均是按 2 级或 3 级存放,我们知道每个附件中的文档在数据库中都有一条记录,并自动产生一个编码。
l 假如按照 2 级存放,根据前面配置表定义好的规则和前面说明的原理,那么在编码前补 0 码,组成 8 位的虚拟编码是 00000123 ,前四位 0000 为母文件夹,后四位 0123 为子文件夹,同时 0123 也是文档的名称,以此类推虚拟编码 00000124 ,前四位 0000 为母文件夹,后四位 0124 为子文件夹,所以 0123 和 0124 子文件夹都在 0000 母文件夹中,那么 0000 文件中可以存放 10 × 10 × 10 × 10=10000 个文档,从母文件夹 0000 推理到母文件夹 9999 中也可以存放 10000 个文件,总共可以存放 10000 × 10000=1 亿个文档,在读取文档时据文档记录的编码,前面补 0 码组成 8 位编码。例如:编码 123 ,组成 8 位编码既是 00000123 ,从中间截断后,文档下载的路径是 …\files\0000\0123\0123 ,这样就一步到位的定位到了文档,根据不同的技术( asp.net 、 Java 、 ruby )在下载文档时,可以把文档的物理文件名和扩展名进行组合提供给前端下载, 2 级目录树状结构图,如图 2 所示, 需要说明的是 Files 表示附件的跟文件夹,之所以把它命名为 2 级树,是因为 2 级是 8 位编码,每一级节点位数是 4 位,所以对它进行 8 ÷ 4=2 ,所以称之为 2 级目录树 。
图 2
2. 混合存放方式,也就是多级混合存放,它比较灵活,具有如下一些优点: 1 )良好的扩展性,例如系统开始是 2 级目录树存放,经过一段运营后发现不够用,可以在采用三级存放,这样就形成了多级存放模式,但注意避免树层级太深; 2 )在前台界面让用户自由选择存放等级。
下面举例说明:
例如文档编码 123 是按 2 级存放,文档编码 124 是按 3 级存放,根据配置表, 2 级是 8 位编码,文档编码 123 虚拟编码是 00000123 , 3 级是 12 位编码 , 文档编码 124 虚拟编码是 000000000124 ,均按 4 位编码进行截码,那么文档树状结构目录图如图 3 所示:
图 2