在PostgreSQL中将像HTML页面、图片、PDF等文件存储到表格中,会导致速度变慢吗?我看过一些文章说这样做不被推荐,但我不知道其中是否属实。我考虑使用的列类型是BLOB(据我所知,它会存储成一个文件)或bytea类型,也可以使用其他类型。
您基本上有两种选择。您可以直接将数据存储在行中,也可以使用大对象设施。由于PostgreSQL现在使用称为TOAST的东西将大字段移出表,因此在行中直接存储大量数据不应该有性能损失。字段大小仍然存在1 GB的限制。如果这太受限制,或者如果您需要流式API,则可以使用大对象设施,它提供了类似于数据库中文件描述符的东西。您在列中存储LO ID,可以从该ID读取和写入。
我个人建议您避免使用大对象设施,除非绝对需要。通过TOAST,大多数用例可以通过正常使用数据库来覆盖。但是,使用大对象会增加额外的维护负担,因为您必须跟踪已使用的LO ID,并确保在不再使用它们时取消链接它们(但不是先链接),否则它们将永久占用您的数据目录空间。还有很多设施其异常行为的详细信息我并不清楚,因为我从未使用过它们。
对于大多数人而言,在数据库中存储大量数据的主要性能问题是,ORM软件会在每次查询时提取大量数据,除非您明确指示它不这样做。您应该注意告诉Hibernate或您正在使用的任何其他软件将这些列视为大列,并且仅在特定请求它们时才获取它们。
bytea
是二进制数据的好选择。如果数据是文本形式且与数据库具有相同的编码,您也可以使用text
或varchar
。 - Daniel Lyons