在PostgreSQL中存储图像
好吧,所以我正在开发一个应用程序,该应用程序将使用运行PostgreSQL的Linux后端将图像用前端用C#.NET编写到Windows盒中,尽管前端几乎无关紧要。我的问题是:
- 在Postgres中处理图像的最佳方法是什么?
每个图像大约4-6兆像素,我们存储的图像多达3000个。也许还需要注意:这不是一个Web应用程序,最多将有大约两个前端同时访问数据库。
解决方案
回答
在数据库中,有两个选项:
- bytea。将数据存储在列中,作为备份的一部分导出。使用标准数据库功能进行保存和检索。根据需求推荐。
- 斑点。将数据存储在外部,通常不作为备份的一部分导出。需要特殊的数据库功能才能保存和检索。
过去,我使用bytea列取得了巨大的成功,可存储10 + gb的图像并具有数千行。 PG的TOAST功能几乎抵消了Blob具有的任何优势。无论哪种情况,我们都需要包括元数据列,以用于文件名,内容类型,尺寸等。
回答
试试这个。我使用大对象二进制(LOB)格式在数据库中存储生成的PDF文档,其中一些文件大小超过10 MB。
回答
10年后更新
在2008年,我们要在其上运行数据库的硬盘驱动器将具有与要在其上存储文件的磁盘不同的特性,并且成本要高得多。如今,有更好的解决方案来存储10年前不存在的文件,我将撤销此建议,并建议读者查看此主题中的其他一些答案。
原版的
除非绝对必要,否则请不要将图像存储在数据库中的图像中。我知道这不是Web应用程序,但是如果没有共享的文件位置,则可以指向将文件的位置保存在数据库中。
//linuxserver/images/imagexxx.jpg
那么也许我们可以快速设置网络服务器并将网络网址存储在数据库中(以及本地路径)。虽然数据库可以处理LOB和3000张图像(4-6兆像素,假设500K图像),但1.5 Gig并不是很多空间文件系统,比数据库设计得更好。
回答
关于jcoby的回答:
bytea是"常规"列,也意味着在获取值时会将其完全读取到内存中。相比之下,Blob可以串流到stdout中。这有助于减少服务器内存占用量。特别是当我们存储4-6个MPix图像时。
备份Blob没问题。 pg_dump提供了" -b"选项,以将大对象包括到备份中。
因此,我们可能会猜测,我更喜欢使用pg_lo_ *。
关于克里斯·埃里克森的回答:
我会说相反的话:)。当图像不是我们唯一存储的数据时,除非绝对必要,否则不要将它们存储在文件系统中。始终确保数据一致性并将数据"合为一体"(数据库)是非常有益的。顺便说一句,PostgreSQL在保持一致性方面很棒。
但是,确实,现实通常对性能要求很高;-)会迫使我们从文件系统提供二进制文件。但是即使那样,我仍倾向于使用DB作为二进制文件的"主"存储,所有其他关系始终保持链接,同时提供一些基于文件系统的缓存机制来优化性能。