-- 品牌抓取历史(append-only)。 -- -- 为什么另建一张表:crawl_tasks 每品牌只有一行(uq_crawl_tasks_brand), -- 入队/完成都是覆盖,答不了「这个品牌什么时候爬过、爬了几次、哪次没抓到」。 -- 这里每次 worker 回报写一条,与 ingest_jobs(每场秀一条)拼成完整链路: -- 抓取一次 → 上报 N 场 → 每场入库结果。 -- -- 量级:每品牌每次抓取 1 行,行宽约 160B(含索引约 200B)。 -- 全品牌跑一遍 23237 行 ≈ 4.6MB;按月重爬一年 ≈ 56MB。 -- 为防止无限增长,仓库层在写入后只保留每品牌最近 30 条(见 CrawlLogKeepPerBrand)。 CREATE TABLE IF NOT EXISTS brand_crawl_logs ( id bigserial PRIMARY KEY, brand_id bigint NOT NULL, task_id bigint NOT NULL DEFAULT 0, status varchar(16) NOT NULL DEFAULT '', -- 回报的原始状态:done / failed attempt smallint NOT NULL DEFAULT 1, -- 第几次尝试(含自动重试) shows_requested smallint NOT NULL DEFAULT 0, -- 任务上的场次上限 shows_submitted integer NOT NULL DEFAULT 0, -- 实际上报了几场 message text NOT NULL DEFAULT '', -- spider 回报的错误/说明 worker varchar(64) NOT NULL DEFAULT '', started_at bigint NOT NULL DEFAULT 0, -- 领取任务的时间 finished_at bigint NOT NULL DEFAULT 0 -- 回报时间 ); -- 品牌详情页:某品牌最近 N 条 CREATE INDEX IF NOT EXISTS idx_brand_crawl_logs_brand ON brand_crawl_logs (brand_id, id DESC);