assets 新增 content_hash 列(唯一索引,迁移 016;存量行保持 NULL 不参与去重)。上传在安全性校验后、转码前对原始字节算 SHA-256: 命中即刷新 created_at/updated_at(重启 7 天清理保护窗)并返回 已有 URL,跳过 GIF/WebP 验证、转码与落盘。并发同内容上传由唯一 索引 + INSERT ... ON CONFLICT DO NOTHING 兜底,落败者删落盘文件 复用胜出者路径。命中响应带 reused: true。仅精确去重,视觉相似 检测(pHash)有意不做。
11 lines
674 B
SQL
11 lines
674 B
SQL
-- 上传内容去重:assets.content_hash 存原始上传字节的 SHA-256(hex)。
|
||
-- 同一内容重复上传时复用已登记素材(同一行、同一文件),不再重复落盘。
|
||
-- 唯一索引是并发去重的正确性基础:两个并发上传同内容时,后到的
|
||
-- INSERT ... ON CONFLICT (content_hash) DO NOTHING 落空,转而复用先到的行。
|
||
-- 存量行不回填(需读全量文件,代价高):保持 NULL,不参与去重;
|
||
-- PG 唯一索引容许多个 NULL,互不冲突。
|
||
|
||
ALTER TABLE assets ADD COLUMN IF NOT EXISTS content_hash TEXT;
|
||
|
||
CREATE UNIQUE INDEX IF NOT EXISTS idx_assets_content_hash ON assets (content_hash);
|