2008年12月10日星期三

有关附件存储方式的探讨

在oracle中国家语言支持的索引问题一文中,我已经提到了优化器在处理长字符串时的一些问题。

在高丽棒子做的数据库设计中(其实我们中国人很多时候也会这么做),要么是把附件作为BLOB直接存储,要么是把附件地址保存在一个VARCHAR2的字符串中。

第一种做法非常不可取,原因在于这种做法会极大的增加数据库服务器的负担,并且在程序里处理BLOB的痛苦不是常人可以忍受的。

第二种做饭看似不错,但是考虑到通常服务器是unix/linux操作系统,因此路径会被保存为很长的路径,比如:/home/fanng/documents/attfiles/username/...(其实这还不算长),这种情况下优化器在处理长字符串时会选择错误的执行计划。因此对数据库服务器性能的影响也会很大。

个人以为,首先来说,数据库服务器本身是不适合同时存储附件的,因此第一种做法几乎可以立即排除。因为数据库服务器的资源有限,特别是I/O开销太大,最好还是只跑数据库。而应用服务器上主要是跑应用业务,因此CPU开销较大,而I/O开销相对较小,因此将附件置于应用服务器应该更好一些。可以基于文件系统来控制,并且在数据库里保存少量的信息来定位,这样就可以避免出现上文所说的两种情况。

欢迎有问题与我探讨。

没有评论: