做系统开发时,数据模型就像房子的地基。地基打歪了,楼上盖得再漂亮也迟早出问题。很多项目上线后性能卡顿、改需求改到崩溃,根源往往出在数据模型没审好。
字段设计是否合理
常见问题是字段命名不统一。比如用户表里一会儿用 userName,一会儿又变成 user_name,后期对接接口时头疼不已。还有字段类型乱选,明明是性别(男/女/未知),非得用 VARCHAR(50) 存,其实一个 TINYINT 就够了。
另外注意是否留了冗余字段。比如订单表直接存了商品名称,可商品名会变,正确的做法是只存商品ID,通过关联查最新信息。
主键与索引设置
主键必须唯一且稳定。有人用身份证号当主键,结果遇到外籍用户就没法处理。推荐用自增ID或UUID,避免业务属性变化带来的影响。
索引也不能乱加。某个系统在日志表每个字段都建了索引,写入速度慢得像蜗牛。记住:查询频繁的字段才需要加索引,尤其是 WHERE 和 JOIN 条件涉及的列。
表之间的关系清不清楚
一对多、多对多关系要画清楚。比如订单和商品之间是多对多,中间必须有个订单明细表。漏了这层设计,后期统计数量、退货处理全都会出错。
外键约束要不要强制开启也得考虑。开发阶段可以关掉方便测试,生产环境建议打开,防止出现“订单指向了一个不存在的商品”这种脏数据。
能不能应对未来变化
别把模型做得太死。比如用户地址只设计成“省市区+详细地址”四个字段,后期想支持国际地址就难了。可以考虑拆成结构化字段,或者预留扩展字段如 extra_info 存 JSON。
还有一个实际案例:某公司会员等级从三个变成五个,结果代码里到处是 if-else 判断等级,数据库也没留排序字段。评审时如果提前想到这种可能,加个 level_sort 字段就能省去后续一堆麻烦。
有没有考虑查询效率
有些模型设计只顾着写入方便,完全不管查询。比如把所有操作记录塞一张大表,不做分表也不加时间分区,半年后查一个月的数据要跑十分钟。
复杂查询场景下,适当冗余是可以接受的。比如订单列表页总要显示用户昵称,每次都去联表查代价太高,可以在订单表里冗余一个 user_nickname 字段,提升响应速度。
评审时不妨问一句:这个模型支撑千万级数据还能跑得动吗?