用MySQL开发留言板系统是后端入门阶段非常典型的实践场景,核心工作分为数据库设计和业务接口开发两部分,其中合理的数据库设计是保障留言板功能稳定运行的基础。

一、留言板系统核心功能分析
一个基础的留言板系统需要支持用户注册登录、发布留言、查看留言列表、回复留言、删除自己的留言等核心功能,对应的数据库需要存储用户信息和留言相关信息,因此至少需要设计用户表、留言表、回复表三个核心表。
二、MySQL数据库表设计
1. 用户表(user)
用户表用于存储注册用户的基础信息,字段设计如下:
| 字段名 | 类型 | 说明 | 约束 |
|---|---|---|---|
| id | int | 用户ID | 主键、自增 |
| username | varchar(50) | 用户名 | 唯一、非空 |
| password | varchar(100) | 密码(存储加密后的字符串) | 非空 |
| create_time | datetime | 注册时间 | 默认当前时间 |
2. 留言表(message)
留言表用于存储用户发布的留言内容,字段设计如下:
| 字段名 | 类型 | 说明 | 约束 |
|---|---|---|---|
| id | int | 留言ID | 主键、自增 |
| user_id | int | 发布留言的用户ID | 外键关联user表id、非空 |
| content | text | 留言内容 | 非空 |
| create_time | datetime | 留言发布时间 | 默认当前时间 |
| is_delete | tinyint | 是否删除(0未删1已删) | 默认0 |
3. 回复表(reply)
回复表用于存储对其他留言的回复内容,字段设计如下:
| 字段名 | 类型 | 说明 | 约束 |
|---|---|---|---|
| id | int | 回复ID | 主键、自增 |
| message_id | int | 被回复的留言ID | 外键关联message表id、非空 |
| user_id | int | 回复用户的ID | 外键关联user表id、非空 |
| content | text | 回复内容 | 非空 |
| create_time | datetime | 回复时间 | 默认当前时间 |
三、建表SQL语句
以下是三个核心表的完整建表SQL代码:
-- 创建用户表 CREATE TABLE IF NOT EXISTS `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(50) NOT NULL COMMENT '用户名', `password` varchar(100) NOT NULL COMMENT '加密后的密码', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间', PRIMARY KEY (`id`), UNIQUE KEY `username_unique` (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表'; -- 创建留言表 CREATE TABLE IF NOT EXISTS `message` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL COMMENT '发布用户ID', `content` text NOT NULL COMMENT '留言内容', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '发布时间', `is_delete` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否删除 0未删 1已删', PRIMARY KEY (`id`), KEY `user_id_index` (`user_id`), CONSTRAINT `message_user_fk` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='留言表'; -- 创建回复表 CREATE TABLE IF NOT EXISTS `reply` ( `id` int(11) NOT NULL AUTO_INCREMENT, `message_id` int(11) NOT NULL COMMENT '被回复留言ID', `user_id` int(11) NOT NULL COMMENT '回复用户ID', `content` text NOT NULL COMMENT '回复内容', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '回复时间', PRIMARY KEY (`id`), KEY `message_id_index` (`message_id`), KEY `user_id_index` (`user_id`), CONSTRAINT `reply_message_fk` FOREIGN KEY (`message_id`) REFERENCES `message` (`id`) ON DELETE CASCADE, CONSTRAINT `reply_user_fk` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='回复表';
四、核心业务SQL操作示例
1. 发布留言
用户发布留言时,需要向message表插入数据,示例SQL如下:
-- 用户ID为1的用户发布留言 INSERT INTO `message` (`user_id`, `content`) VALUES (1, '这是我的第一条留言');
2. 查询留言列表(包含发布用户名和回复数量)
查询留言列表时通常需要关联用户表获取用户名,同时统计每条留言的回复数量,示例SQL如下:
SELECT m.id AS message_id, m.content AS message_content, m.create_time AS message_time, u.username AS publish_username, COUNT(r.id) AS reply_count FROM `message` m LEFT JOIN `user` u ON m.user_id = u.id LEFT JOIN `reply` r ON m.id = r.message_id WHERE m.is_delete = 0 GROUP BY m.id ORDER BY m.create_time DESC LIMIT 0, 10;
3. 发布回复
用户回复某条留言时,向reply表插入数据,示例SQL如下:
-- 用户ID为2的用户回复ID为1的留言 INSERT INTO `reply` (`message_id`, `user_id`, `content`) VALUES (1, 2, '这条留言说得很对');
4. 删除自己的留言
留言板通常只允许删除自己的留言,删除时可以先判断当前用户是否为留言发布者,再执行删除操作,示例SQL如下:
-- 用户ID为1的用户删除ID为1的留言 UPDATE `message` SET `is_delete` = 1 WHERE `id` = 1 AND `user_id` = 1;
五、开发注意事项
- 用户密码不能明文存储,需要使用MD5、BCrypt等加密算法处理后再存入数据库
- 留言内容和回复内容需要做长度限制和特殊字符过滤,避免存储恶意内容
- 查询留言列表时建议添加分页逻辑,避免一次性查询过多数据导致性能问题
- 外键关联可以根据实际业务场景选择是否使用,高并发场景下也可以去掉外键通过代码层保证数据一致性