在 Postgres 12 中,我正在跟踪照片。每个都很大,每个大约 6 到 8 兆。为了快速浏览,我会将缩略图与完整图像一起存储。full 和 thumbnail 都是 BYTEA 类型的列。
为了性能,我想避免在只需要缩略图时加载完整图像。据我了解,当访问一行时,所有 BYTEA 字段值都将加载到内存中。因此,即使在查询中未明确请求时,向用户显示缩略图列表也必然会在服务器上加载完整的照片。
所以我将把照片表分成两部分,将缩略图存储在主表中,并将缩略图存储在单独的子表中,一对一。
在这种情况下,子完整照片表携带其父缩略图行的 ID 作为外键。该外键列在逻辑上也可以用作主键。
我可以将孩子的一列指定为外键和主键吗?如果是这样,是否有任何注意事项需要注意?
主键和外键
是的,一点没错:
吐司
bytea
列存储在普通列数据之外(在所谓的“toast 表”中)并且不会被检索,除非您将它们包含在 SELECT 列表中。从手册中引用
这仅意味着即使查询被强制执行 Seq Scan,也不会检索 bytea 列,直到确定需要发回的行。因此,如果您的查询对 100 万行进行了 seq 扫描,但只返回了 1 行,则只会读取一个 bytea 值并将其发送到客户端。
请注意,如果缩略图足够小,缩略图实际上可能是内联存储的(而不是在 toast 表中)(TOASTing 仅在小于约 2k 的大小时触发)
列是单独烘烤的,因此将两个图像保存在一个表中没有问题。只有出现在
SELECT
列表中的图像才会被删除。此外,如果 an
UPDATE
不影响 toasted 列,则不必重写它们。