从 0 到 1 实现CloudBase云开发 + 低代码全栈开发活动管理小程序(04)

41 阅读3分钟

第 4 章:数据库设计 (MySQL 版)

“NoSQL 是一场说走就走的旅行,而 MySQL 是那张必须要买的回程票。”

在上一章我们确定了使用 MySQL。很多同学可能会问:“都 2025 年了,为什么还要用 SQL?” 答案很简单:因为安全感。在报名扣库存、投票防刷这种场景下,关系型数据库的事务机制 (Transaction) 依然是王者。

4.1 为什么我们要用 MySQL?

  1. 结构化数据的归宿: 用户、活动、报名记录,这些数据天然就是结构化的,用表 (Table) 来存再合适不过。
  2. JSON 的灵活: MySQL 5.7+ 引入了 JSON 数据类型。我们可以在 config 字段里存 JSON,既享受了 SQL 的严谨,又有了 NoSQL 的灵活。
  3. 关系维护: JOIN 查询虽然被诟病性能,但在后台管理这种复杂查询场景下,它比 NoSQL 的多次查询拼装要方便得多。

4.2 ER 图设计:理清表之间的暧昧关系

我们一共设计了 5 张核心表。

4.2.1 Users(用户表)

存储用户的基本信息。

字段名类型描述示例/备注
idBIGINT主键自增
openidVARCHAR(64)微信 OpenID唯一索引 (UK)
accountVARCHAR(32)内部账号随机生成,如 "AXF12309"
nicknameVARCHAR(64)昵称
avatar_urlVARCHAR(255)头像URL
roleENUM角色'user', 'admin', 'super_admin'
created_atDATETIME创建时间自动生成
updated_atDATETIME更新时间自动更新
deleted_atDATETIME删除时间用于软删除

4.2.2 Activities(活动表)

核心表,存储活动的基础信息和配置。

字段名类型描述示例/备注
idBIGINT主键自增
titleVARCHAR(100)活动标题"2025春季摄影大赛"
descriptionTEXT活动描述富文本内容
cover_urlVARCHAR(255)封面图
start_timeDATETIME开始时间
end_timeDATETIME结束时间
typeENUM活动类型'registration', 'vote'
is_activeTINYINT上架状态1: 上架, 0: 下架
creator_idBIGINT创建者IDFK -> Users.id
componentsJSON页面组件配置[{"type":"image",...}]
reg_configJSON报名配置{"fields":[...]}
vote_configJSON投票配置{"options":[...]}

4.2.3 Registrations(报名表)

记录用户的报名信息。

字段名类型描述示例/备注
idBIGINT主键自增
activity_idBIGINT活动IDFK -> Activities.id
user_idBIGINT用户IDFK -> Users.id
form_dataJSON动态表单数据{"name":"张三", "phone":"..."}
payment_proofVARCHAR(255)支付凭证图片 FileID
statusENUM审核状态'pending', 'approved', 'rejected'
payment_statusENUM支付状态'pending', 'success', 'failed'

4.2.4 Votes(投票表)

记录投票动作。

字段名类型描述示例/备注
idBIGINT主键自增
activity_idBIGINT活动IDFK -> Activities.id
user_idBIGINT用户IDFK -> Users.id
option_idsJSON投票选项列表["opt_1", "opt_2"]

4.2.5 Barrages(弹幕表)

记录实时弹幕。

字段名类型描述示例/备注
idBIGINT主键自增
activity_idBIGINT活动IDFK -> Activities.id
contentVARCHAR(255)弹幕内容
typeVARCHAR(20)类型'registration', 'vote'

4.3 JSON 字段的妙用

Activities 表中,我们把页面配置存在 components 字段里。 在查询时,MySQL 可以直接解析 JSON:

-- 查询所有使用了“倒计时”组件的活动
SELECT * FROM Activities
WHERE JSON_CONTAINS(components, '{"type": "countdown"}');

(当然,云函数里我们通常用 ORM 来做这件事,不用手写这种 SQL。)


本章小结: 我们设计了一套“混合模式”的数据库结构:严谨的关系表 + 灵活的 JSON 字段。这既保证了数据一致性,又没丢掉页面配置的灵活性。下一章,我们将看看如何在云函数里操作这些表。

下一章(05-云开发架构详解)