小程序功能一多,最先失控的通常不是页面,而是数据:帖子、报价、解锁订单和会员订单互相引用,却没有清楚边界。这篇用货源广场说明集合怎么拆、云函数怎么组织,以及权限为什么必须放在云端。

一、先按业务对象拆集合
数据库建模,人话说就是“把现实里的东西分成几类,给每类东西安排固定位置”。货源广场至少有帖子、报价、解锁订单和会员订单四类对象。
帖子描述需求,报价描述供应方回应,解锁订单描述某人是否买过某条联系方式,会员订单描述时间权益。它们有关联,但不是同一件事。
先按业务对象拆集合,再按页面去想字段。
第一版不必追求完美范式,只要边界清楚、查询可验证、后续能扩展即可。
二、四个核心集合怎么设计
`posts` 保存标题、正文、品类、数量、预算、发布人、状态和时间。联系人不要直接混进公开正文,敏感字段由云函数过滤或放入独立集合。
`quotes` 保存 `postId`、报价人、金额、交付说明和状态。是否允许同一人重复报价,要用唯一条件或版本记录提前定义。
`plaza_unlock_orders` 记录用户为哪个帖子、哪个联系人版本完成解锁;`member_orders` 记录会员商品、开始时间、结束时间和支付状态。会员是时间权益,单帖解锁是对象权益,分开更容易解释。
支付状态和发货状态也要分开,支付成功后仍可能等待回调或补偿。
三、会员不是一个布尔值
不要只在用户表里放 `isVip: true`。续费、过期和退款都需要知道会员由哪笔订单产生、何时开始、何时结束。
续费时按现有结束时间顺延,提前续费才不会损失剩余时间。判断会员资格时,由服务端比较当前时间和结束时间。
四、单云函数路由还是多个函数
功能还在试错时,一个云函数加 `action` 路由比较省部署和鉴权成本;稳定后,再按支付回调、内容安全和报表导出等风险模块拆分。
switch (action) {
case 'createPost': return createPost(event);
case 'submitQuote': return submitQuote(event);
case 'unlockContact': return unlockContact(event);
case 'buyMember': return buyMember(event);
}
单函数的边界是维护成本:当文件变得很大、不同动作需要不同权限或独立扩容时,就不该继续堆条件分支。
五、权限必须在云端校验
客户端校验只能改善体验,不能阻止用户修改请求参数。云端至少要检查当前身份、目标对象归属、订单状态和操作权限。
例如解锁联系方式时,不能只检查用户是不是会员,还要检查这条帖子是否允许解锁、订单是否已发货。数据库规则要配置,复杂业务判断也要放在云函数里。
前端校验是提示,云端校验才是边界。
测试时准备三组账号:正常用户、无权限用户和篡改参数用户,第三组最容易暴露接口漏洞。
写在最后
数据库建模不是把字段填满,而是让每个对象有清楚归属,让每种权限都能追溯到具体条件。
如果你接下来要扩展小程序,先列集合、核心字段、关联 ID 和可执行动作,再开始复制页面。
你更倾向于先用一个云函数推进,还是从第一天就把函数拆细?
「小程序实战路线图」
执迷者X把云开发视为产品闭环的底座:数据如何存、权限如何判、订单如何落库,都决定了小程序能否从一个页面成长为稳定业务系统。
你现在在第 11 篇:数据库建模与云函数权限。云开发入门可先回看第 03 篇;交易链路看第 08 篇,撮合与解锁场景看第 09、10 篇,数据导出继续阅读第 12 篇:报表、PDF 与 Excel。
如果你需要把零散功能整理成可维护的数据和权限模型,可通过 联系页 描述现有业务流程。