本节摘要:以客户管理为背景,把数据建模的完整动作走一遍:拆业务、定主表、配字段、连关系、灌样数、做验收。数据层是全册反复强调的地基,这一节教的不只是操作,更是一套「先想清楚再动手」的建模工序。
装配台立住了,第一位进场的是数据建模。1.1 讲过「数据模型驱动」的道理,这一节把它落到手上:我们给销售部门建一套客户管理的数据底座,后面 2.3 的页面、2.4 的首应用、第 3 章的审批与权限,全都长在这套底座上。
销售负责人是这样描述需求的:「我们要管客户,客户下面有联系人,跟进过的每一条记录都要留痕,谈成的要转商机。」建模就是把这段话翻译成表结构。逐句拆解:客户是独立实体,单独成表;联系人挂在客户下面,一张联系人表加一颗多对一关系字段;跟进记录是流水,一张表、按时间排;商机介于客户与跟进之间,单独成表并引用客户。拆完得到四张表,关系如下:
拆业务的口诀是「名词成表、动词成流程、修饰成字段」。需求陈述里的名词——客户、联系人、商机、跟进——各自成表;「留痕」「转商机」这类动作后面交给工作流;「等级」「来源」这类修饰词落成字段。初学者最常见的建模错误是把「跟进」设计成客户表里的一个文本字段——流水塞进户口本,三个月后就没法按时间检索了。
建表入口在数据表管理界面,新建后逐颗拧字段螺丝。客户表最终的字段清单如下,注释里写明每颗的选型理由:
customers 客户表字段清单(界面逐项配置) company_name 单行文本 客户名称,设为必填;列表页用它做主显示列 level 单选 客户等级,选项在字段配置里维护,后续可加不可删旧值 source 单选 客户来源:展会、转介绍、广告、自然来访 owner 多对一 负责人,关联内置用户表 → 3.x 自动带出反向「名下客户」 status 单选 状态:潜在、跟进中、成交、流失;第3章工作流按它触发 estimated 金额数字 预估金额,选金额型而非纯数字,聚合图表才能正确汇币种 last_contact 日期 最近联系日,配合筛选做「超期未跟进」视图 remark 多行文本 备注,长文本不进列表页,避免拖垮加载
字段选型的三条经验。其一,能用单选别用文本:「A 级」「A级」「a级」会在文本字段里共存的,单选字段从源头堵死脏数据。其二,关系字段优先于手填 ID:负责人字段选「多对一」关联用户表,而不是让销售手输姓名——前者能联动权限和筛选,后者只是一串字符。其三,金额与数量分开:混合着「元」与「件」的数字列是图表灾难的开始。
联系人、商机、跟进三张表照方抓药,字段更少:联系人拿姓名、职务、手机加一颗指向客户的关系字段;跟进记录拿主题、内容、日期加两颗关系字段(谁跟进的、跟进哪个客户)。四张表全部建完控制在二十分钟内——建模在界面上就是点选与命名,慢的从来不是手,是事前没想清楚。
关系字段是数据层的传动轴。以联系人表为例,在联系人表里加「所属客户」字段,类型选多对一、目标选客户表,保存后到客户表这边看——反向的「一对多」子表关联已经自动出现,表单里可以加子表格直接录联系人。配置生成的底层结构大致是:
// 联系人表 contacts 的关系字段(界面配置后自动生成,无需手写) { "name": "customer", "type": "bigInt", "interface": "m2o", // 多对一接口标识 "target": "customers", // 指向客户表 "foreignKey": "customer_id", // 外键落在联系人表一侧 "title": "所属客户", "uiSchema": { "title": "所属客户", "x-component": "Select" } // 界面呈现为下拉选择 }
理解这颗螺丝的两头很重要:外键在「多」的一侧,所以关系字段建在联系人表上,客户表自动获得反向能力;反过来,如果你在客户表上先建「联系人」一对多字段,外键同样落在联系人表——两颗螺丝拧的是同一根轴,建哪头看你顺手。多对多(如「商机的产品清单」)则是第三种形态,会生成中间表,第 6 章的行业案例里会用到。
⚠️ 常见坑:先建一堆独立表、最后再补关系。关系字段一旦晚建,已经录入的数据要逐条回填关联,工作量翻倍。正确顺序永远是:先画关系图,再建表,建表时顺手把关系字段拧上。
💡 关键直觉:建模质量用「半年后还敢不敢改」来检验。字段语义清楚、关系挂在正确一侧的模型,半年后加需求是加积木;反之则是拆墙。
空表验收不出问题。给四张表各灌几条样例数据——客户七八家、每家一两条联系人、跟进记录覆盖不同日期,样例数据故意放两条脏的:一条缺客户名称、一条负责人留空。然后做四个验收动作:按状态筛选客户,确认单选字段可筛;从某客户下钻到联系人与跟进,确认关系可导航;按负责人筛出「名下客户」,确认反向关联可用;打开脏数据看列表表现,确认必填约束生效。四项全过,数据底座验收完毕,可以进 2.3 上界面了。
问:什么时候该把一张表拆成两张?经验判据是「一个格子开始想填多个值」。客户表里想记多个联系人、想记多条跟进,就是拆表的信号——拆出联系人表与跟进记录表,用关系字段连回去。反过来,如果某个字段在整张表里几乎人人相同(比如「数据来源系统」),它就不值得独立成表,放个单选字段足矣。
问:建错了字段能改吗?能,改名、改选项、调整顺序都是界面操作;但字段类型变更要谨慎——文本改数字会触发数据转换,转不动的值怎么办,先在试验环境演练一遍再动生产。更稳的思路是把「建错」消化在灌样数阶段:2.4 的验收动作里特意放了脏数据,就是为了让错误在样例里暴露,而不是在真实数据里爆发。
建模自查四问(建完每张表过一遍): 1. 这张表的一句话业务定义是什么?说不出来就还没想清。 2. 哪个字段是主显示列?列表页靠它辨认行。 3. 有没有字段想填多个值?有就是拆表信号。 4. 枚举字段(单选)的选项定了吗?上线后加选项容易、改旧值难。