数据库系统中文件附件保存的最佳办法
作者: http://blog.csdn.net/jacklondon
http://blog.csdn.net/jacklondon/archive/2010/10/26/5966558.aspx
开发数据库系统的人很多,我相信也有很多人碰到过要将文件保存在数据库中的问题。常见的数据库系统,都有 blob/image/binary 之类的字段类型,用于处理这个问题。
软件开发人员,都会碰到这个问题,也都会被这个问题困住一两个星期。
以 Java/JDK 为例, JDBC 驱动程序中,对这个问题也经过多年、历经多次版本升级,才能解决。而且代码还不能跨数据库。
C# 也一样,总之是麻烦。
其实,这个问题可以有另一思路,更简单,更高效。值得系统架构师们考虑:
1. 在数据库中,单独用一个表,处理所有各类文件,只保存文件的信息
TT_BINARY_DATA_INFO (bin_uuid, file_size, file_name,data_type,compress_format,memo,created_dt,created_by,updated_dt,updated_by,updated_cnt)
上面的表中, compress_format 为文件压缩格式,可以不压缩,也可以用 zip 压缩格式,或者其它。
2. 在指定目录中,保存文件内容(按年月划分子目录,或者不分子目录),文件名为 uuid.dat
采用这一种方案的原因是,数据库系统通常处理不好二进制数据,要么数据多了很占用磁盘空间,导致数据库性能下降、备份时间更长;要么是文件大了无法保存。而采用以上方案,这些问题都不存在:备份更快了;文件大了也能轻松应付;程序更容易写;不论哪种数据库都可以用。
这一解决方案,目前在国内基本无人知晓,但在国外,举例来说,Bugzilla/phpBB 都提供了选项,用户可以把文件内容保存在数据库中、或者保存在指定目录中。并且,它们的文档中,都推荐把文件内容,存放在指定目录中下。想必它们经过认真的对比,发现“把文件内容,存放在指定目录中下”更好吧。我也觉得这种方法更好,自从知道这种解决方法,我把我所负责的项目,都转换成这种方式了,效果很不错。