
当一个团队开始持续产出内容素材的来源问题会从注意一下变成必须能查。客户会问、平台会问、内部交接也需要说明。靠记忆和零散表格撑不了多久需要一个能检索的台账。这篇讲表结构与实现要点。一、先明确这个系统要回答什么问题不要一上来就设计字段。先写清楚它要回答的问题字段自然就有了。问题一这条素材是从哪来的。自己生成的、外部获取的、还是别人交付的。问题二能不能用于某个用途。指定一个用途能不能立刻筛出可用的素材。问题三某个项目用了哪些素材。反过来也要能查因为交付时要附清单。问题四某个素材被用在了哪些地方。授权范围变了的时候要知道影响面有多大。四个问题覆盖了双向关系素材到项目、项目到素材。表结构必须支持双向查询否则迟早要重建。二、核心表结构最小可用版本是三张表。-- 素材表一条记录对应一个文件 asset(id, name, kind, source_type, origin_ref, license, created_at) -- 项目表一个交付单元 project(id, name, client, status, delivered_at) -- 使用关系多对多 usage(asset_id, project_id, purpose, added_at)三张表里usage是最容易被省掉的一张。省掉的后果是素材用在哪只能靠文件名猜一旦项目多了就查不动。三、来源字段怎么设计来源是最关键的一组字段需要拆开而不是塞进一个文本列。字段含义取值示例source_type来源类别generated / external / deliveredorigin_ref来源指向生成记录编号、下载页面备注license授权性质own / licensed / unknownlicense_note关键限制仅个人使用、可用于商业作品四个字段里license用枚举值而不是自由文本是为了能直接筛选。用文本写可以商用允许商用能用于商业用途看起来信息更全实际筛不出来。license_note才放自由文本记录具体限制。两者分工明确一个用于机器筛一个用于人看。四、批量入库与校验素材通常是一批一批进来的入库要做成批量动作并带上校验。def ingest(rows, conn): ok, skipped 0, [] for r in rows: if not r.get(source_type): skipped.append((r[name], missing source_type)) continue if r[source_type] external and not r.get(origin_ref): skipped.append((r[name], external without origin_ref)) continue upsert_asset(conn, r) ok 1 return ok, skipped校验规则里最值得保留的是第二条外部来源的素材必须写清 origin_ref。这条规则挡住的是最常见的情况——下载了一堆素材事后谁也说不清是从哪来的。把校验放在入口比事后清理便宜得多。入库时提示一次成本几秒钟等到要用的时候才发现缺失就只能重新找。五、检索怎么快速筛出可用的素材台账的价值在检索不在存储。三个常用查询值得做成固定视图。查询一按用途筛。给定用途筛出license满足条件的素材。SELECT a.name, a.license, a.license_note FROM asset a WHERE a.license own OR (a.license licensed AND a.license_note LIKE %商业%) ORDER BY a.created_at DESC;查询二按项目反查。给定项目列出用到的全部素材用于生成交付清单。SELECT a.name, a.source_type, u.purpose FROM usage u JOIN asset a ON a.id u.asset_id WHERE u.project_id :project_id ORDER BY u.added_at;查询三查孤立素材。没有被任何项目使用过的素材。这一条能发现两类问题入库了但一直没用以及本该被引用却漏了关系。SELECT a.name FROM asset a LEFT JOIN usage u ON u.asset_id a.id WHERE u.asset_id IS NULL;六、和交付流程怎么衔接台账如果不接进日常流程很快就会停止更新。三个衔接点。衔接点一入库即登记。素材到手就登记不要攒着。攒一次的成本是一次性整理攒三次就没人愿意做了。衔接点二交付即生成清单。交付前用查询二导出素材清单附在交付包里。这一步几乎零成本但客户体验差别很大。衔接点三授权变化即回归检查。某个音源或素材的授权范围变了用查询二反查影响面逐个确认。没有台账的话这一步只能凭印象。七、四个工程上的坑坑一把来源写成一个自由文本字段。看着省事实际无法筛选。至少要拆成类别指向授权三部分。坑二省掉使用关系表。素材和项目是多对多用一列外键表达不了。省掉它反查就做不了。坑三校验只做在批量导入。单条补充登记时同样要校验否则缺口都从这里进。坑四没有时间字段。缺少创建时间最近入库的一批有哪些这类问题就查不出来而这是最常用的检索方式之一。八、小结素材台账要解决的是双向可查从素材能查到项目从项目能查到素材。表结构三张起步来源字段拆成类别、指向、授权三部分授权用枚举而不是文本校验放在入库入口。做到这几条来源问题就从靠回忆变成查一下。入口在 www.suno-api.io/create技术文档在 www.suno-api.io/docs。