先别急着改数据库。拿一份已经提交的真实表单记录,把每个字段的“谁在用、用来做什么、缺了会怎样”写清楚,再决定是加字段、拆字段还是换存储方式。多数情况下,扩展字段的成本远低于重做数据表,前提是先把现有字段的用途核对一遍。
打开后台导出的一条表单记录,逐列问三个问题:这个字段是谁填的、谁看的、如果它为空会不会影响后续动作。例如“需求描述”这一列,销售看它判断意向,客服看它安排回访,技术看它评估工作量。三种角色对同一列的理解可能完全不同,这正是字段不够用的常见起点。
把答案写成三列:字段名、主要使用者、缺失后果。缺失后果分为“无法联系”“无法判断意向”“无法安排排期”三类。如果某一列的缺失后果说不清楚,说明它可能本来就不该存在;如果某一列的缺失后果同时命中两类以上,说明它承载了太多职责,需要拆分。
不同角色对“客户来源”的理解往往不一致:市场部认为是投放渠道,销售部认为是转介绍人,客服部认为是首次咨询入口。与其开会争论,不如各自在纸上写出一条真实记录里该填什么,然后比对差异。差异出现的字段,就是需要新增或拆分的候选。
核对时用一条假设记录做测试:假设某客户通过朋友介绍、先打了电话、后填了表单。市场部可能填“转介绍”,销售部可能填“朋友姓名”,客服部可能填“电话”。三个答案指向三个不同的存储需求。把这三个答案都保留下来,分别建字段,比强行合并成一个“来源”字段更不容易丢信息。
第一种是直接加列。适用于新增信息与原有记录一一对应、且未来不会频繁变化的情况。例如增加“首次接触日期”,每条记录只有一个值,加一列即可。代价是每次业务变化都要改表结构,如果变化频繁,表会越来越宽。
第二种是增加附属表。适用于一条主记录对应多条附加信息的情况。例如一个客户有多次沟通记录,每次沟通有时间、方式、结论。这时不该在主表加“沟通1”“沟通2”,而应单独建一张沟通记录表,用客户编号关联。判断标准是:同一客户是否会积累多条同类信息。
第三种是把部分字段改为可配置的键值对。适用于字段名称和数量都不确定、且主要用于展示和筛选的场景。例如不同产品线需要收集的参数不同,用固定列会大量留空。键值对的代价是查询和统计更麻烦,导出后需要额外整理才能做报表。
三种做法没有绝对优劣,取决于变化频率和查询需求。变化少、查询多,选加列;变化多、查询少,选键值对;一条对多条,选附属表。
假设某荆州企业网站的表单只有“姓名、电话、留言”三列。上线三个月后,销售反馈无法区分咨询的是产品A还是产品B,客服反馈无法记录回访结果,市场反馈无法知道客户从哪个页面提交。
第一步,从现有留言内容里人工抽取二十条,标注每条的意图类别。如果二十条里有十五条可以归入产品A或产品B,说明“意向产品”值得单独建字段。第二步,确认回访结果是否一条记录只对应一次回访。如果同一客户可能回访多次,就建附属表而不是加列。第三步,页面来源可以从提交时的页面地址自动记录,不需要让用户填写,这属于技术侧可自动补充的字段。
做完这三步后,先在一个测试环境里加字段并导入历史数据,检查导出报表是否仍然可用。如果导出模板依赖固定列顺序,新增字段可能导致模板错位,这时需要同步调整导出逻辑。这个动作的结果会直接影响下一步:如果导出正常,可以进入正式环境;如果导出错位,先修导出再上线字段。
新增字段后,至少核对三处:表单提交后的通知内容是否包含新字段、后台列表页的筛选条件是否覆盖新字段、导出文件是否保留新字段。这三处任何一处遗漏,都会导致新字段虽然存进去了,但实际用不上。
另外要确认历史记录里新字段的默认值。如果设为空,筛选时可能漏掉旧记录;如果设一个固定值,又可能被误读为真实填写。比较稳妥的做法是保留为空,并在后台标注“该字段为后续新增”,让使用者知道旧记录没有这项信息。
字段扩展不是一次性的工程。每次业务角色增加或流程变化,都可能带来新的字段需求。把“谁在用、用来做什么、缺了会怎样”这张对照表保留下来,下次扩展时可以直接在表上追加,而不是重新讨论一遍。