我的博客评论区设计方案(基于sqlite3)
目录
我很早之前就打算给我的博客添加评论区,具体历程如下
设计核心目标
我的博客评论区具有以下设计目标
- 私有化部署(数据完全可控)
- 发评论无需登录
- 低硬件开销
排除的方案
以Giscus为例基于GitHub的方案,不支持私有化部署,所有排除。后续搜索了许多方案,始终没有找到满意的。
2026年3月,我决定自己写一个,2026年4月下旬写好。
我的设计
数据库选择
考虑到博客评论区的并发量极小,我选择使用sqlite3
数据表定义
我的设计中,有三个数据表
CREATE TABLE `ids` (`id` integer DEFAULT 0,PRIMARY KEY (`id`));
CREATE TABLE `entries` (`content` text,`time` datetime,`ip` text,
`id` text,`reply_id` text,`blog_id` text,`status` integer,
`user_agent` text,`name` text,`email` text,`Device_ID` text,
PRIMARY KEY (`id`));
CREATE TABLE `author_infos` (`name` text,`email` text,`Device_ID` text);
首先每条评论都有唯一标识id,blog_id指示属于那篇博客,然后reply_id字段标识是否是对之前评论的回复。 time记录每条评论的发送时间,name是发送者昵称。
还有一些由于安全相关的字段,ip,user_agent,email,Device_ID,用来检测快速发送大量评论和使用不同身份的异常情况。
status是用来标识是否隐藏评论的。
实践中,blog_id是encodeURIComponent(标题),评论的id通过id表全局递增生成。其它字段前后端合作收集。
故意把作者的(email,name,Device_ID)在每条评论都保留,便于改名不修改旧评论的历史信息。
限制规则
必须通过浏览器完整性检查。
一个Device_ID只能绑定一个(email,name)二元组。首次发送评论时绑定。这是为了让使用虚假身份发评论更难。
一个ip五分钟只能最多发送5条评论,对于合理情况,似乎这个限制已经足够了。
附
后端开源在: https://github.com/qiulaidongfeng/comment 和 https://gitee.com/qiulaidongfeng/comment