默认情况下,我会选择Postgres,文档建议这样做是可以的。
- 这是一个明智的想法吗?
- 备份数据库会成为一个完整的噩梦吗?有经验的人可以分享一下吗?
- 是否存在任何可靠性问题?
- 这会影响数据库其他部分的性能吗?请记住,每个图像只会访问数据库一两次。
我有在Oracle和MySQL中以这种方式存储图片的经验。性能和可靠性不是问题,备份才是关键。备份会变得很大,因为备份费时又昂贵,所以节省空间是个好主意。如果只需通过从数据库中删除图片就可以将数据库缩小80%,那么把它们存储在其他地方可能是个好主意。备份单独的文件更加高效,因为你可以轻松创建仅包含新的和修改过的图片的增量备份。
我建议:
将原始图像存储为blob(具有间接存储的二进制大对象)在您的表中:用于原始图像存储,但分离备份。请参见Ivan's answer,PostgreSQL additional supplied modules,How-tos等。
将原始图像作为bytea(或blob)存储在另一个(统一的)数据库中(使用DBlink):在这种情况下,我更喜欢bytea,但blob几乎相同。分离数据库是“统一图像网络服务”的最佳方式。
将处理后的图像(通常是缩略图)存储为bytea(具有直接存储的BYTE数组)在您的表中:将小图像缓存以快速发送到Web浏览器(避免渲染问题)并减少服务器处理。还要缓存基本元数据,例如宽度和高度。数据库缓存是最简单的方法,但请检查您的需求和服务器配置(例如Apache模块):store thumbnails at file system可能更好,比较性能。请记住,它是一个(统一的)Web服务,因此可以存储在一个没有备份的单独数据库中,为多个表提供服务。另请参见PostgreSQL binary data types manual,tests with bytea column等。
我的经验仅限于 SQL Server,但是我有数百万个大于10KB的PDF文件存储在数据库中,而且性能仍然表现得相当不错。当然需要使用索引。对于这么多数据,完整的数据库备份所需时间与预期相符。再次强调,这适用于 MS-SQL Server!