我一直致力于改造一个非常古老的基于 Java Servlet 的 web 应用程序。webapp 允许用户上传图片。webapp 会在数据库中存储对图像的路径引用,但会将图像上传到它们所在的服务器上的目录。
webapp 的数据库已升级到 Oracle 11g,我被告知可以处理二进制信息。
所以,我的问题是,哪个更聪明?
继续将图像作为文件存储在服务器上还是将图像填充到 Oracle 11g 数据库中?
非常感谢提前
史蒂夫
是的,您可以在 Oracle 中将 BLOB 用于二进制数据。(以及许多其他数据库。)我们在这里使用它们来存储 PDF 文件。
我已经看到它以两种方式完成。将图像存储在数据库中,或者将图像存储在文件系统中,然后将文件名保存在数据库中。
存储在数据库中的优点
一切都在数据库中。你拿出一个记录,相关的图像就在那里。
您可以在文件及其关联数据之间获得数据完整性(当然,假设有良好的架构设计。)
获取数据和图像的一种逻辑操作。
我发现扩展数据库以容纳大量二进制数据比文件系统替代方案更难且更昂贵。
存储在数据库中的缺点
并非所有工具都可以轻松浏览图像。
无法轻松访问网络上的图像。
根据文件大小和数量,您最终可能会在某些表中获得大量原始数据。
加载和存储 blob 数据并不总是直截了当的。(例如,我最近为 Hibernate 编写了一个自定义数据类型来处理我们的 blobbed PDF。)
文件系统的优势
读取和写入文件可能更有效。
如果您想在网络上提供图像,您可以直接从文件系统执行此操作。
在调试期间更容易浏览图像,并且有很多免费工具可以做到这一点。
我相信将 blob 放入文件系统时更容易扩展应用程序。
文件系统的缺点
数据完整性/一致性问题。改变一些关于文件结构的东西,你在数据库中还有一个步骤要做。
备份是另一回事。
多个逻辑操作(从数据库读取,从文件系统读取)来获取图像和数据。
一个想法是将图像存储在服务器中并保留对图像实际位置的引用。这样您就可以为图片分配更多元数据,例如名称、大小、格式等,以便于查询。
存储在服务器上,然后在数据库中获取图像的数据。
即,您可以在上传时从图像中提取 EXIF 数据,然后将它们与对图像的文件系统引用一起存储。