
小程序云数据库教程|安全规则、索引与并发写入防护 – MPForge
直接回答:小程序云数据库最贵的三个错误:客户端能写任意集合、查询没索引全表扫、库存类并发写入无防护。这篇小程序云数据库教程写给用云开发做业务落地的开发与架构负责人:把安全规则收到最小权限、按查询建索引、关键写入全部搬进云函数用事务护住。MPForge(DEVDIY 旗下)接手过的超卖、刷库事故,根因都在这三处,按本文口径整改后未再复发。
一、权限规则:客户端永远不可信
先立一条底线:安全规则按「客户端只读、写入走云函数」设计,业务数据不允许前端直接写库。
云数据库的安全规则如果放开客户端写,任何人抓包拿到小程序前端就能改任意文档——改价格、改订单状态、给自己加余额,都只是几行请求的事。正确分层是:资讯、商品这类公开数据允许客户端 read;用户个人资料允许本人写本人目录;订单、库存、支付凭证等关键集合连 read 都收进云函数,用管理权限读写,业务校验在服务端做完再落库。
二、索引与查询:别让列表页拖垮整个库
结论先记住:每一个出现在 where、orderBy 里的字段,都该有一把对应的索引。对照下表核对:
| 检查项 | 达标口径 | 常见错误 |
|---|---|---|
| 索引覆盖 | 高频查询的过滤与排序字段建有索引,联合查询建复合索引 | 上线就全表扫,数据一多查询超时 |
| 返回量 | 单次 limit 控制在分页尺寸,用 skip/标记做翻页 | 一把抓全集合,客户端卡死 |
| 字段精简 | 列表查询用 field 限定返回字段 | 整文档返回,含大字段拖慢加载 |
| 慢查询监控 | 定期看云开发控制台慢查询,超阈值字段补索引 | 从没看过监控,用户先发现卡 |
三、落地步骤:从锁权限到防超卖
改造顺序是先锁权限、再补索引、最后收口写入,反着做会边修边漏。按这五步执行:
- 收紧权限:所有集合改为最小权限,逐个确认客户端只剩 read 甚至全无直读,写入入口全部指到云函数。
- 补齐索引:把现网高频查询逐条过一遍,where 与 orderBy 的字段组合补复合索引,上线前用真实数据量压一遍。
- 关键写走云函数:下单扣库存、改订单状态这类写入只能经云函数,函数内先做业务校验再落库,参考小程序云函数开发实务。
- 并发用事务:扣减库存用事务或原子自增操作,先判余量再扣减放在同一事务里,拒绝「先读后写」的经典超卖写法。
- 建立监控:慢查询、错误率进每周巡检,异常波动先查索引与热点集合,参考小程序安全检查清单。
四、并发写入与数据安全的验收口径
这块的验收不能用「功能能跑」糊弄,按下表核对:
| 检查项 | 达标口径 | 常见错误 |
|---|---|---|
| 客户端写权限 | 关键集合客户端完全不可写,抓包测试验证 | 规则全开,抓包即可改数据 |
| 并发扣减 | 事务保护,压测下余量不为负 | 先读后写,活动一开就超卖 |
| 幂等防护 | 同一业务单号重复提交只落一次库 | 网络重试导致重复订单 |
| 备份恢复 | 重要集合有定期备份,演练过一次恢复 | 只管写库,误删无路可退 |
云函数侧的错误重试与超时口径会影响写库行为,配套阅读小程序请求重试与超时处理,把「客户端重试」和「服务端幂等」一起设计。
五、避坑清单
三条红线,触碰任何一条都建议立即整改:
- 别把客户端写权限放开:这是数据被刷、被改的直接入口,改造成本最低、收益最大的就是这一条。
- 别省索引:全表扫在几百条数据时看不出来,几万条起列表页就开始超时,索引要在数据量上来之前补。
- 别用「先查再改」对付并发:两个请求同时读到同一余量就会双卖,扣减类操作一律事务或原子操作。
- 别只信前端校验:价格、数量、优惠资格的校验必须落服务端,前端校验只负责体验。
六、常见问题 FAQ
云数据库能像关系库那样联表查询吗?
能力有限。跨集合关联主要靠云函数里多次查询自行组装,或适当做字段冗余把高频联表变成单集合查询;设计数据模型时就要按这个约束规划集合结构。
数据量大之后分页怎么做?
小偏移用 skip 加 limit 就够;深翻页改用「按排序标记翻页」——记录上一页最后一条的排序字段值,下一页用大于该值的条件加 limit 查询,性能稳定不随页码衰减。
误删或写坏数据能恢复吗?
取决于备份策略。云开发控制台支持手动导出与回档能力,关键集合应定期导出冷备,并至少演练一次恢复流程;没有演练过的备份等于没有备份。
这个和 GEO 地理位置配置有关系吗?
没有。云数据库讲的是权限、索引与并发写入;GEO 指地理位置配置,即门店地址、经纬度、服务类目在附近检索中的展示,是两套互不相干的问题域。
安全问题会在审核或运营环节暴露吗?
会。客户端可写任意集合属于高危缺陷,轻则数据被刷重则被平台处罚;上线前把第三节的权限步骤过一遍,发布侧再对照小程序上线发布检查清单收口。