乐于分享
好东西不私藏

uni-app数据库设计与云开发实践

uni-app数据库设计与云开发实践

uni-app数据库设计与云开发实践

作者:雷达鸭技术团队系列定位:时间线·项目开发期 | 功能模块·用户认证关键词:uniCloud、NoSQL数据库、云函数、云对象、Schema设计、索引优化、触发器> 阅读时间:约 20 分钟系列导航:上篇·架构设计 → 下篇·功能实现 | 微信一键登录功能开发 | 专题:华为登录 · 数据库与云开发 · AI辅助开发实践雷达鸭App已首发华为应用商店


开篇:Serverless不是没有后端,是后端换了个写法

很多人对uni-app云开发有个误解:以为用了uniCloud就不需要设计数据库了,直接写代码往里塞数据就行。实际做下来你会发现,NoSQL数据库设计比关系型数据库更需要提前想清楚——没有外键约束、没有事务保证、没有JOIN查询,数据关系全靠你自己维护。

这篇文章把项目的数据库设计和云开发实践完整摊开——从集合设计到索引优化,从云函数架构到触发器使用,从开发踩坑到生产调优。


一、为什么选uniCloud而不是自建后端

先说结论:一个人做的项目,自建后端是奢侈

维度
自建后端
uniCloud云开发
服务器成本
每月几百起
免费额度够用
运维负担
需要自己维护
零运维
开发效率
写接口+部署+调试
写云函数直接用
数据库
需要安装配置
开箱即用
扩容
手动操作
自动扩容
限制
自由度高
有平台约束

对于雷达鸭这种日活几千级别的应用,uniCloud的免费额度完全够用。省下来的服务器成本和运维时间,可以全部投入产品迭代。

但云开发也有约束——数据库是NoSQL,没有SQL的灵活性;云函数有执行时间限制(默认10秒);冷启动延迟不可控。这些约束在架构设计时必须考虑进去。


二、数据库集合设计

2.1 核心集合总览

集合名
用途
数据量级
读写频率
items
内容核心表
千级
读多写少
submit_requests
提交/申请
百级
写多读少
users
用户主表
千级
读多写少
user_tokens
登录凭证
千级
读写均衡
user_sessions
会话信息
千级
读写均衡
user_devices
设备记录
千级
写多读少
content_list
内容数据
百级
读多写少
operation_logs
操作日志
万级
写多读少
audit_logs
审核日志
百级
写多读少
track_events
埋点事件
十万级
写极多读少
payment_logs
支付日志
百级
写多读少

2.2 items(内容核心表)

这是整个应用最核心的数据表,存储所有内容条目的信息。

字段名
类型
索引
说明
_id
String
主键
自动生成
title
String
普通索引
条目标题
cover_url
String
-
云存储的封面图地址
summary
String
-
一句话简介(20字以内)
category
String
普通索引
所属分类
tags
Array
-
自定义标签数组
attributes
String
-
扩展属性描述
tier
String
-
分级标识
business_mode
String
-
运营模式
redirect_url
String
-
跳转目标URL
redirect_type
String
-
目标类型:web/miniprogram/app
is_owned
Boolean
普通索引
是否已被关联
owned_by
String
-
关联者用户ID
status
String
普通索引
状态:active/hidden/pending
view_count
Number
-
浏览次数
click_count
Number
-
点击跳转次数
create_time
Number
降序索引
时间戳,用于按最新排序
update_time
Number
-
更新时间戳

Schema配置示例

{  "bsonType""object",  "required": ["title""cover_url""summary""category""redirect_url"],  "properties": {    "title": {      "bsonType""string",      "maxLength": 50,      "description""条目标题,必填,最多50字符"    },    "category": {      "bsonType""string",      "enum": ["type_a""type_b""type_c""type_d""type_e""type_f""other"],      "description""分类,必须是预定义值之一"    },    "status": {      "bsonType""string",      "enum": ["active""hidden""pending"],      "defaultValue""pending",      "description""状态"    },    "create_time": {      "bsonType""timestamp",      "defaultValue": {        "{Date.now()}_${Math.random().toString(36).substr(2, 8)}.jpg`

时间戳+8位随机字符串,冲突概率可以忽略。


六、生产环境优化清单

优化项
实施方式
效果
索引优化
高频查询字段全部加索引
查询延迟降低90%
批量写入
埋点数据攒够10条批量写入
数据库操作减少90%
冷启动规避
action路由+定时触发器
首次调用延迟降低60%
数据清理
定时触发器清理过期数据
数据库体积减少50%
客户端缓存
5分钟本地缓存策略
重复请求减少70%
图片CDN
云存储+OSS加速
图片加载速度提升50%

写在最后

数据库设计是整个项目的基础,改起来成本最高。我的经验是:先把核心查询场景想清楚,再设计集合和索引。不要一上来就画ER图,先把"首页要查什么数据"、“详情页要查什么数据”、"管理后台要查什么数据"列出来,然后反推集合设计。

NoSQL的设计思路和关系型数据库完全不同——关系型是先设计表结构再写查询,NoSQL是先想清楚查询场景再设计数据结构。顺序反了,后面填坑的成本会很高。

相关专题:第三方登录集成方案 — 用户表设计和多端登录的数据处理


参考资料

  • uniCloud云数据库文档
  • uniCloud云函数文档
  • uniCloud云对象文档
  • NoSQL数据库设计最佳实践