校园墙微信小程序数据库设计文档
一、总体设计概述
本数据库设计服务于校园墙微信小程序,涵盖用户管理、内容发布、社交互动、教务系统对接等核心模块。采用MySQL/MariaDB存储,遵循第三范式(3NF)设计原则,同时结合实际业务需求进行适度反规范化优化。
二、核心表结构说明
1. 用户体系模块
1.1 用户主表 (user
)
字段名 | 类型 | 说明 | 约束 |
---|---|---|---|
id | VARCHAR(255) | 用户ID(建议改用UUID) | 主键 |
openid | VARCHAR(40) | 微信唯一标识 | 唯一索引 |
phone | VARCHAR(255) | 手机号 | 唯一索引 |
nickName | VARCHAR(255) | 昵称 | |
avatarUrl | VARCHAR(255) | 头像URL |
优化建议:
- 将
id
改为BIGINT
自增主键,openid
设唯一索引 phone
字段使用VARCHAR(11)
并添加正则校验
1.2 学生绑定表 (user_student
)
字段名 | 类型 | 说明 | 约束 |
---|---|---|---|
id | INT | 自增ID | 主键 |
openid | VARCHAR(40) | 微信ID | 外键->user.openid |
studentId | VARCHAR(18) | 学号 | 唯一索引 |
2. 内容发布模块
2.1 动态表 (status
)
字段名 | 类型 | 说明 | 约束 |
---|---|---|---|
id | BIGINT | 动态ID | 主键 |
content | TEXT | 动态内容 | 全文索引 |
images | JSON | 图片URL数组 | |
openid | VARCHAR(40) | 发布人 | 外键->user.openid |
优化建议:
- 增加
status_type
字段区分普通/置顶动态 - 添加
location
字段存储地理信息
2.2 评论表 (comments
)
字段名 | 类型 | 说明 | 约束 |
---|---|---|---|
id | BIGINT | 评论ID | 主键 |
content | TEXT | 评论内容 | |
status_id | BIGINT | 关联动态ID | 外键->status.id |
parent_id | BIGINT | 父评论ID | 自关联外键 |
3. 二手交易模块 (shop
)
字段名 | 类型 | 说明 | 约束 |
---|---|---|---|
id | INT | 商品ID | 主键 |
seller_openid | VARCHAR(40) | 卖家微信ID | 外键->user.openid |
price | DECIMAL(10,2) | 价格 | 索引 |
location | SET('中区','南区','北区') | 交易区域 |
优化建议:
- 增加
category
字段分类(书籍/数码等) - 添加
view_count
字段记录浏览数
三、关键关系模型
1. ER图概要
erDiagram
USER ||--o{ STATUS : "发布"
USER ||--o{ COMMENTS : "评论"
STATUS ||--o{ COMMENTS : "包含"
USER ||--o{ SHOP : "出售"
USER ||--o{ CHAT_MESSAGE : "发送"
SHOP }|--|| USER_STUDENT : "卖家认证"
2. 关联关系说明
关系 | 类型 | 实现方式 |
---|---|---|
用户-动态 | 一对多 | user.openid -> status.openid |
动态-评论 | 一对多 | status.id -> comments.status_id |
用户-私信 | 多对多 | chatmessage.sender/receiver |
商品-位置 | 多对多 | shop.location SET类型 |
四、性能优化方案
1. 索引策略优化
表名 | 索引字段 | 类型 | 说明 |
---|---|---|---|
user | (openid) | 唯一索引 | 微信登录主键 |
status | (openid, create_time) | 联合索引 | 用户动态查询 |
shop | (price, location) | 复合索引 | 商品筛选 |
comments | (status_id, create_time) | 联合索引 | 评论排序 |
2. 分表策略
status
表按月分表:status_202308comments
表按status_id哈希分表
3. 字段优化
原字段 | 问题 | 优化方案 |
---|---|---|
user.id (varchar) | 存储效率低 | 改为BIGINT自增 |
schedules.dayOfWeek (varchar) | 查询效率低 | 改为TINYINT(1-7) |
chatmessage.is_image (tinyint) | 扩展性差 | 合并到message_type (enum) |
五、数据完整性方案
1. 外键约束
ALTER TABLE shop
ADD CONSTRAINT fk_shop_user
FOREIGN KEY (seller_openid)
REFERENCES user(openid)
ON DELETE CASCADE;
2. 检查约束
ALTER TABLE user_student
ADD CONSTRAINT chk_studentId
CHECK (studentId REGEXP '^[0-9]{10}$');
3. 触发器示例
CREATE TRIGGER trg_status_count
AFTER INSERT ON status
FOR EACH ROW
UPDATE user_stat
SET status_count = status_count + 1
WHERE openid = NEW.openid;
六、安全设计方案
1. 敏感数据处理
-- 手机号加密存储
ALTER TABLE user
MODIFY COLUMN phone
VARBINARY(128) COMMENT 'AES加密存储';
2. 审计日志
CREATE TABLE audit_log (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id VARCHAR(40),
action VARCHAR(50),
detail TEXT,
ip_address VARCHAR(45),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
3. 权限控制
-- 创建视图限制数据访问
CREATE VIEW v_public_user AS
SELECT id, nickName, avatarUrl
FROM user;
七、扩展性设计
1. 预留字段
ALTER TABLE status
ADD COLUMN ext_data JSON COMMENT '扩展字段';
2. 版本管理
CREATE TABLE schema_version (
version VARCHAR(20) PRIMARY KEY,
applied_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
八、运维监控建议
1. 慢查询日志
# my.cnf配置
slow_query_log = 1
long_query_time = 1
slow_query_log_file = /var/log/mysql/slow.log
2. 监控指标
- 表空间使用率
- 索引命中率(Handler_read_key)
- 线程缓存命中率(Threads_cached)
附:数据库部署建议
- 生产环境配置主从复制
- 定期执行
pt-online-schema-change
进行无锁表结构变更- 使用Percona Monitoring进行实时监控
- 重要表设置自动分区(按时间范围)