供应商和产品是多对多关系,供应商名不能写进产品条目里。判断一条信息该挂在哪层用一个问题:换掉供应商,这条信息会不会变?不变的(型号、参数、认证)属于产品;变的(成本、MOQ、交期)属于这一对关系,不属于任何一方;只跟供应商有关的(工厂地址、产线、联系人)属于供应商。此外要按腐烂速度分层:参数以年计、认证 2-3 年、报价数周至数月、库存数天,混在一起存会让整份资料的可信度被最快腐烂的那项拖垮。
供应商与产品的关系怎么想:多对多、角色与腐烂速度分层
从一个具体的麻烦说起
你有一个型号 CP-100,A 厂在做。你在产品资料里写:
型号:CP-100
供应商:A 厂
出厂价:¥3,200
交期:25 天
看起来很合理。三个月后出现两件事:
第一件:A 厂产能排满,你找了 B 厂做同款,价格 ¥3,050,交期 30 天。这条记录该怎么写?
第二件:A 厂还给你供另外 12 个型号。你要查“A 厂总共给我供哪些东西”,只能把所有产品条目翻一遍。
这是多对多关系:一个型号可能有主供、备供、打样三家;一家供应商又供你十几个型号。
“供应商及对应的产品资料”这句话里,最难处理的其实是「对应」这两个字——它不是一个字段,是一层独立的关系。
一条判据:换掉供应商,这条信息会不会变
要把信息分对层,不需要背字段清单,只要问这一句:
如果我换一家供应商做同一个型号,这条信息会不会变?
三种答案,三个归属:
不会变 → 属于产品
型号名、结构形式、最大流量、壳体材质、外形尺寸、产品认证。这些是产品自身的属性,谁做都一样(如果不一样,那就不是同一个产品,见后面)。
会变 → 属于这一对关系,不属于任何一方
出厂价、起订量、交期、最小包装、付款条件、这家给你的折扣。
这些既不属于产品也不属于供应商——它们属于“你和这家供应商就这个型号达成的条件”。这是最容易放错的一类:塞进产品里,第二家供应商就没地方放;塞进供应商里,同一家供应商不同型号的价格就打架了。
只跟供应商有关 → 属于供应商
工厂地址、产线情况、资质证书、联系人、沟通习惯、账期。这些不随产品变。
这条判据的好处是它能处理你没见过的信息。碰到一条不知道该放哪的资料,问一遍就有答案了,不用回来查表。
分完之后是三层:
产品事实 供货关系 供应商
┌────────┐ ┌──────────┐ ┌──────────┐
│ CP-100 │◄───────┤ 价 / MOQ ├───────►│ A 厂 │
│ 参数 │ │ 交期 / 角色│ │ 地址/资质 │
│ 认证 │ └──────────┘ └──────────┘
└────────┘ ┌──────────┐ ┌──────────┐
▲ │ 价 / MOQ │ │ B 厂 │
└────────────┤ 交期 / 角色├───────►│ 地址/资质 │
└──────────┘ └──────────┘
中间那一层是关键。很多人的资料结构里没有中间层,所以第二家供应商一出现就崩。
一个边界情况
“如果两家做出来的参数不一样怎么办?” —— 那就不是同一个产品。
这种情况比想象中常见:型号名撞了,实际结构和性能有差异。这时候正确处理是拆成两个产品条目,而不是在一个条目里放两套参数。硬塞在一起的后果是你永远不知道页面上展示的是哪一家的性能。
三类供应商角色,信息需求不一样
关系层里有一个字段值得单独说:角色。
同一个型号的三家供应商,你需要知道的东西完全不同:
| 角色 | 你实际需要的信息 | 不需要的 |
|---|---|---|
| 主供 | 完整参数、价格、交期、产能、质量记录 | — |
| 备供 | 能不能替代(参数是否一致)、大致价格、启用需要多久 | 详细产能、长期质量记录 |
| 打样 | 样品周期、打样费、最小试制量 | 批量价格、量产交期 |
不区分角色的后果是:你给每家都建一套完整字段,然后发现备供和打样那两套永远填不满。填不满的字段会持续给你“资料没做完”的心理负担,最后你会放弃维护整个结构。
字段该按角色的实际需要来设,不是按“最完整的那种情况”来设。
腐烂速度分层:这一篇最该记住的一条
前面讲的是信息属于谁。这一节讲的是信息能活多久——这一条比前面重要,但几乎没人在设计资料结构的时候考虑它。
产品资料里的东西,有效期差了两个数量级:
| 信息 | 有效期 | 过期后的后果 |
|---|---|---|
| 型号、结构、材质、外形 | 数年 | 基本不变 |
| 产品认证证书 | 2–3 年 | 过期还挂在页面上 = 合规风险 |
| 出厂价、起订量 | 数周至数月 | 失效还在报 = 亏钱,或临时改口失信 |
| 产能、当前交期 | 数周 | 承诺不了但已经承诺了 |
| 库存 | 数天 | 基本不该进事实层 |
把它们混在一份资料里存,会发生一件很隐蔽的事:
整份资料的可信度,等于其中腐烂最快那一项的可信度。
因为你打开这份资料的时候,没法只信一半。看到价格是三个月前的,你会顺带怀疑旁边的参数是不是也过期了——即使参数三年都没变。一份“部分可信”的资料,在使用的时候等于不可信,你还是会去翻原始文件确认。
由此得出两条推论
推论一:不同腐烂速度的信息分开存,各自带有效期。
参数和认证可以放在一起(都是慢的),价格和交期要单独存并标明“报价有效期到某日”。分开的好处是你能一眼看出“哪部分需要复核、哪部分不用管”。
推论二:腐烂太快的东西,要么标有效期,要么干脆不存。
库存就是典型。库存以天为单位变化,你不可能每天更新,存进去的每一条从第二天起就是错的。它的正确位置是每次需要时去问,不是存下来。
判断标准:你能不能在它腐烂之前更新它? 不能,就别存——存一个你知道会过期的值,比不存更糟,因为它会被当成事实使用。
这条思路的通用形态
按变化频率把东西分开,是个通用的结构原则,不只用在产品资料上:变化慢的和变化快的放在一起,整体的维护成本会被快的那部分决定。写代码的人对这个规律很熟;产品资料完全同理。
分家的另一个理由:密级
上面按腐烂速度分家,还有一个理由要求分得更彻底一点:这三层的密级完全不同。
- 产品事实(参数、认证)→ 本来就要公开
- 供货关系(成本、MOQ)→ 绝不能公开
- 供应商(工厂名、地址)→ 绝不能公开
后两层一旦跟着构建流程上线,客户拿着工厂名直接找厂,你这单就没了。所以分层不只是为了整洁,是为了让“能不能公开”变成一个由文件位置就能回答的问题,而不是每次靠人判断字段。
这件事的完整做法在事实层的两种死法那篇。这里只强调结论:分层的时候顺手把密级边界和层边界对齐,后面能省掉一整类风险。
查询模式决定存储形态
结构想清楚了,才轮到“用什么工具存”。顺序不能颠倒——先挑工具的人最后都会被工具的结构逼着改数据模型。
判断工具,看你的查询长什么样。产品事实的查询有三个特征:
- 精确:查的是“CP-100 的最大流量”,答案唯一
- 按主键:几乎总是“给定型号,取它的字段”
- 量小:几百条量级,不是几百万条
这三个特征决定了文本文件就够用。放在 Git 里,好处是能 diff(改了什么一目了然)、能回滚(改错了退回去)、AI 能直接读写、构建时能自动校验,成本为零。
什么时候真的该升级:
| 信号 | 该换成什么 |
|---|---|
| 多人同时改,经常冲突 | Airtable / Notion 这类协作表格 |
| 要给不懂技术的同事填表 | 同上(关键是有表单界面) |
| 条目过千且要复杂筛选(“找出所有 SS316 且带 ATEX 且交期 <30 天的”) | 数据库 + 查询层 |
| 要给外部系统提供接口 | 数据库 + API |
注意这几个信号都不是“数据变多了”,而是使用方式变了。单纯条目变多(几百到一两千)不构成升级理由。
两个错误的升级方向
别一上来就上向量库做 RAG。 你的查询是精确的、答案唯一的。用语义相似度召回一个必须精确的值,是把确定的事变成概率问题。RAG 解决“我不知道答案在哪份文档里”,事实层解决“我知道答案在哪个字段里”。
别为了“以后可能需要”提前上数据库。 几百条数据配一套数据库+后台,你会把时间花在维护那套东西上,而不是维护数据本身。事实层的价值在数据准不准,不在存储技术。
一个常见的混存错误
最后说一个很容易犯的:把“常做的型号”和“客户问过但没做过的型号”混在一起。
前者是事实——你确实能供,参数确实核过。 后者是线索——某个客户问过,你觉得也许能找到供应商做。
混在一起的后果是致命的:AI 基于事实层批量生成产品页时,会把线索也生成成页面。于是你站上出现了一堆你其实供不了的产品,客户询盘进来你答不上,转化率和信任一起掉。
线索不该占事实层的位置。 它属于选品待办清单,是另一份东西。事实层里的每一条,都应该是“客户现在问,我就能报”的状态。
落地要点
- 三层拆开:产品事实 / 供货关系 / 供应商,中间层不能省
- 关系层带角色字段(主供 / 备供 / 打样),字段按角色实际需要设
- 快腐烂的信息单独存并带有效期;更新不了的(库存)干脆不存
- 层边界和密级边界对齐
- 先定结构再选工具;几百条用文件,升级看使用方式而不是数据量
三层的结构模板(YAML 版和 Airtable 字段版都给)、角色字段枚举、有效期字段规范,在产品事实层工具箱里。
小结
- 供应商和产品是多对多,中间必须有独立的关系层,否则第二家供应商一出现结构就崩
- 判据:换掉供应商这条信息会不会变 → 不变归产品、变归关系、只跟厂有关归供应商
- 两家参数不一样,那就不是同一个产品,拆成两条
- 供应商分主供 / 备供 / 打样,字段按角色实际需要设,别按最完整情况设
- 整份资料的可信度等于其中腐烂最快那一项的可信度——所以按腐烂速度分开存
- 更新不了的东西别存(库存),存一个你知道会过期的值比不存更糟
- 层边界和密级边界对齐,能省掉一整类泄露风险
- 先定结构再选工具;升级的信号是使用方式变了,不是数据量变大
- 别把“问过但没做过”的线索混进事实层,否则会生成出你供不了的产品页
→ 下一篇:事实层的两种死法:漏出去,和放过期
RELATED / 相关推荐
接着读这些
按同一分类、系列与标签为你挑选。
事实与表达分离:为什么产品资料要单独存一层
改一个参数要翻好几个页面,根源是事实和表达混在一起了。这篇讲怎么把"型号存在吗、参数多少、谁能供"这类事实单独存成一层,让页面、报价单、询盘回复全部从它派生——以及一个能立刻看清你有没有真的建立事实源的判断标准。
事实层的两种死法:漏出去,和放过期
产品事实层不会因为建不起来而失败,只会因为两件事失败——该藏的漏出去了,该更新的放过期了。两件事的解法是同一条思路:用架构代替纪律。凡是靠"记得别写""记得去更新"维持的规则,时间长了一定失守。
从供应商资料到网站产品页:这条链上的顺序为什么不能换
从供应商发来一份 PDF 到产品页上线,中间有五个环节,顺序不能换。跳过关键词登记这一步,新页面会和自己站上已有页面抢同一个词;把核对挪到最后,审核必然退化成走过场。这篇逐段讲清每个"为什么必须是这个顺序"。