秋来冬风的博客

我的博客评论区设计方案(基于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/commenthttps://gitee.com/qiulaidongfeng/comment

评论区

评论加载中

Categories: