PostgreSQL中的BLOB或引用


11

我需要将二进制数据文件存储在可在Ubuntu服务器上运行的PostgreSQL数据库中。最初,将有几十个文件,每个文件大小约为250kb。但是,文件数会随着时间增加。有时我可能需要从文件中提取数据以进行其他下游分析。

我已经对将二进制数据存储为BLOB或引用的古老问题进行了一些研究。两者显然都有各自的优缺点。我应该注意与PostgreSQL有关的任何特定问题吗?如果我想通过PostgreSQL函数或通过外部Python程序从文件中提取数据,是一种方法还是另一种方法更可取?

如果我将数据文件直接存储在数据库中,是否最好将它们存储在带有引用“主”表的外键的单独表中,而不是存储在包含所有其他字段的表中?

在这里阅读了问题和答案; 那里的评论建议在Linux上通过引用(在文件系统中)存储二进制文件更好。我在这里的问题特别与PostgreSQL有关,并且与从文件中提取数据进行各种分析有关。

更新:类似的问题


使用PostgreSQl,可以设置一个规则,当删除包含引用的记录时,该规则将自动删除文件系统中的文件。
jp,

我敢肯定,这个问题有多个答案。这是怎么回事?如果张贴者删除了它,是否可以查看?对此有何评论?
SabreWolfy 2011年

是的,我删除了它,因为可以避免我写的bytea的性能问题。注释可以归纳为“ bytea一切都很好,您应该确保不要在数据库中转义不可打印的字符,然后在应用程序中再次转义它们。正如araqnid所评论的,您应该改用libpq支持的十六进制转义。”
jp

Answers:


9

我认为您应该将数据作为常规bytea列存储在数据库中。这样,您可以获得数据库的所有优势,并且可以使用数据库功能(如果需要,甚至可以使用PL / Python)来处理数据。较大的数据项将自动脱机存储,因此您没有理由引入其他引用间接。

将大型二进制对象存储在数据库外部的主要原因是,如果它们太大而无法在令人满意的时间内存储和检索它们,或者它们使数据库膨胀而超出实用性,或者您需要以文件形式从以下位置访问文件:一个单独的应用程序。据我所知,这都不适用。


感谢您的详细信息。关于从单独的应用程序访问文件的观点使我意识到,将来我可能希望允许用户下载二进制文件以在其计算机上本地使用。如果文件存储在数据库中,可以这样做吗?
SabreWolfy 2011年

当然。您将需要编写一小段代码来解决此问题(例如,从数据库中获取文件数据,进行HTTP下载),但这并不是一个障碍。
Peter Eisentraut 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.