用PostgreSQL将HTML页面、图像、PDF等文件存储在表中可以吗?还是速度较慢?我读到一些文章说这是不推荐的,但我不知道这是不是真的.

我心目中的列类型是BLOB(据我所知,它存储在一个文件中)或bytea类型,但其他类型也适用.

推荐答案

你基本上有两个 Select .您可以将数据直接存储在行中,也可以使用大型对象工具.由于PostgreSQL现在使用名为TOAST的东西将大字段移出表,因此直接在行中存储 Big Data 不会带来性能损失.字段大小仍有1GB的限制.如果这太有限,或者如果你想要一个流式API,你可以使用大对象工具,它会给你一些更像数据库中的文件描述符的东西.您将LO ID存储在列中,并可以从该ID进行读写.

我个人建议你避免使用大型物体设施,除非你绝对需要它.在TOAST中,大多数用例都是按照您预期的方式使用数据库.对于大型对象,您会给自己带来额外的维护负担,因为您必须跟踪已使用的LO ID,并确保在它们不再使用时(但以前不再使用)将其断开链接,否则它们将永远占用数据目录中的空间.还有很多设施周围都有异常的行为,这些细节让我难以理解,因为我从未使用过它们.

对大多数人来说,在数据库中存储 Big Data 会带来巨大的性能损失,那就是你的ORM软件会在每个查询中提取 Big Data ,除非你明确指示它不要这样做.你应该注意告诉Hibernate或者你用来处理这些列的任何东西,并且只有在特别要求的时候才能获取它们.

Postgresql相关问答推荐

跳过DLC中的某些类型的 node

如何接受jsonb路径中的任何密钥?

Postgres 对 WHERE 子句并行使用两个索引

尽管违反了部分索引约束,Postgres 插入仍在发生

如何查找具有包含花括号内值且遵循模式的属性的顶点?

Postgres >= 和 <= 具有特殊字符的行为

如何在 PostgreSQL 中使用正则表达式删除单词之间的所有特殊字符和多余空格

如何将两条线几何连接成一条记录?

使用 Heroku CLI、Postgres 的 SQL 语法错误

使用 RPostgreSQL 进行 UTF-8 / Unicode 文本编码

如何在 Postgres 中的列上删除唯一约束?

什么是 postgres 超级用户

如何在 PostgreSQL 触发器函数中获取表名?

如何引用使用 ON CONFLICT 中的函数的唯一索引?

在 PostgreSQL 中表示Sparse稀疏数据

在不存在的行上有select for update块

理解 Postgres 行大小

如何从另一个脚本运行 postgres sql 脚本?

PostgreSQL 表变量

如何为 postgres 编写 DELETE CASCADE?