本文档详细描述了个人博客系统的数据库表结构设计,包括所有表的字段定义、索引、约束和表之间的关系。
- 数据库类型: MySQL 8.0+
- 字符集: utf8mb4
- 排序规则: utf8mb4_unicode_ci
- 引擎: InnoDB
- 时区: UTC
| 分类 | 表名 | 数量 |
|---|---|---|
| 核心表 | users, articles, categories, tags, article_tags, comments, works | 7 |
| 扩展表 | links, settings, attachments, likes, favorites, user_follows, notifications, subscriptions | 8 |
| 日志表 | visit_logs, visit_log_summaries | 2 |
| 总计 | 18张表 |
注:
article_favorites表为兼容旧版本保留,新功能请使用统一的favorites表。
存储系统用户信息,包括管理员和普通用户。
| 字段名 | 类型 | 长度 | 默认值 | 允许空 | 说明 |
|---|---|---|---|---|---|
| id | BIGINT UNSIGNED | - | AUTO_INCREMENT | NOT NULL | 主键,用户ID |
| created_at | DATETIME(3) | - | CURRENT_TIMESTAMP(3) | NOT NULL | 创建时间 |
| updated_at | DATETIME(3) | - | CURRENT_TIMESTAMP(3) ON UPDATE | NOT NULL | 更新时间 |
| deleted_at | DATETIME(3) | - | NULL | NULL | 软删除时间 |
| username | VARCHAR | 50 | - | NOT NULL | 用户名(唯一) |
| password | VARCHAR | 255 | - | NOT NULL | 密码(bcrypt加密) |
| VARCHAR | 100 | - | NOT NULL | 邮箱(唯一) | |
| nickname | VARCHAR | 50 | - | NULL | 昵称 |
| avatar | VARCHAR | 255 | - | NULL | 头像URL |
| bio | VARCHAR | 500 | - | NULL | 个人简介 |
| role | VARCHAR | 20 | 'user' | NOT NULL | 角色:admin/user |
| status | TINYINT | - | 1 | NOT NULL | 状态:1启用/0禁用 |
| last_login_at | DATETIME(3) | - | NULL | NULL | 最后登录时间 |
| last_login_ip | VARCHAR | 50 | - | NULL | 最后登录IP |
| article_count | INT | - | 0 | NOT NULL | 文章数量 |
| comment_count | INT | - | 0 | NOT NULL | 评论数量 |
索引:
- PRIMARY KEY:
id - UNIQUE INDEX:
idx_username(username) - UNIQUE INDEX:
idx_email(email) - INDEX:
idx_deleted_at(deleted_at) - INDEX:
idx_role_status(role, status)
约束:
- username 长度: 3-50字符
- email 必须符合邮箱格式
- password 存储bcrypt加密后的值
存储博客文章的核心信息。
| 字段名 | 类型 | 长度 | 默认值 | 允许空 | 说明 |
|---|---|---|---|---|---|
| id | BIGINT UNSIGNED | - | AUTO_INCREMENT | NOT NULL | 主键,文章ID |
| created_at | DATETIME(3) | - | CURRENT_TIMESTAMP(3) | NOT NULL | 创建时间 |
| updated_at | DATETIME(3) | - | CURRENT_TIMESTAMP(3) ON UPDATE | NOT NULL | 更新时间 |
| deleted_at | DATETIME(3) | - | NULL | NULL | 软删除时间 |
| title | VARCHAR | 200 | - | NOT NULL | 文章标题 |
| content | LONGTEXT | - | - | NOT NULL | 文章内容(Markdown) |
| content_html | LONGTEXT | - | - | NULL | 文章HTML(可选预渲染) |
| summary | VARCHAR | 500 | - | NULL | 文章摘要 |
| cover | VARCHAR | 255 | - | NULL | 封面图URL |
| category_id | BIGINT UNSIGNED | - | - | NULL | 分类ID |
| author_id | BIGINT UNSIGNED | - | - | NOT NULL | 作者ID |
| view_count | INT | - | 0 | NOT NULL | 浏览次数 |
| like_count | INT | - | 0 | NOT NULL | 点赞次数 |
| comment_count | INT | - | 0 | NOT NULL | 评论数量 |
| word_count | INT | - | 0 | NOT NULL | 字数统计 |
| reading_time | INT | - | 0 | NOT NULL | 预计阅读时间(分钟) |
| status | TINYINT | - | 1 | NOT NULL | 状态:1发布/0草稿 |
| is_top | TINYINT | - | 0 | NOT NULL | 是否置顶:1是/0否 |
| is_recommend | TINYINT | - | 0 | NOT NULL | 是否推荐:1是/0否 |
| is_original | TINYINT | - | 1 | NOT NULL | 是否原创:1是/0否 |
| source_url | VARCHAR | 255 | - | NULL | 来源URL(转载时) |
| publish_at | DATETIME(3) | - | NULL | NULL | 发布时间 |
索引:
- PRIMARY KEY:
id - INDEX:
idx_deleted_at(deleted_at) - INDEX:
idx_category_id(category_id) - INDEX:
idx_author_id(author_id) - INDEX:
idx_status(status) - INDEX:
idx_top_status_created(is_top DESC, status, created_at DESC) - 列表查询优化 - INDEX:
idx_created_at(created_at DESC) - FULLTEXT INDEX:
idx_title_content(title, content) - 全文搜索
外键:
fk_articles_category: category_id REFERENCES categories(id) ON DELETE SET NULLfk_articles_author: author_id REFERENCES users(id) ON DELETE CASCADE
存储文章分类信息。
| 字段名 | 类型 | 长度 | 默认值 | 允许空 | 说明 |
|---|---|---|---|---|---|
| id | BIGINT UNSIGNED | - | AUTO_INCREMENT | NOT NULL | 主键,分类ID |
| created_at | DATETIME(3) | - | CURRENT_TIMESTAMP(3) | NOT NULL | 创建时间 |
| updated_at | DATETIME(3) | - | CURRENT_TIMESTAMP(3) ON UPDATE | NOT NULL | 更新时间 |
| deleted_at | DATETIME(3) | - | NULL | NULL | 软删除时间 |
| name | VARCHAR | 50 | - | NOT NULL | 分类名称(唯一) |
| slug | VARCHAR | 50 | - | NULL | URL别名(唯一) |
| description | VARCHAR | 200 | - | NULL | 分类描述 |
| cover | VARCHAR | 255 | - | NULL | 分类封面图 |
| sort | INT | - | 0 | NOT NULL | 排序权重 |
| article_count | INT | - | 0 | NOT NULL | 文章数量 |
| parent_id | BIGINT UNSIGNED | - | NULL | NULL | 父分类ID(预留,支持二级分类) |
索引:
- PRIMARY KEY:
id - UNIQUE INDEX:
idx_name(name) - UNIQUE INDEX:
idx_slug(slug) - INDEX:
idx_deleted_at(deleted_at) - INDEX:
idx_sort(sort DESC) - INDEX:
idx_parent_id(parent_id)
存储文章标签信息。
| 字段名 | 类型 | 长度 | 默认值 | 允许空 | 说明 |
|---|---|---|---|---|---|
| id | BIGINT UNSIGNED | - | AUTO_INCREMENT | NOT NULL | 主键,标签ID |
| created_at | DATETIME(3) | - | CURRENT_TIMESTAMP(3) | NOT NULL | 创建时间 |
| updated_at | DATETIME(3) | - | CURRENT_TIMESTAMP(3) ON UPDATE | NOT NULL | 更新时间 |
| deleted_at | DATETIME(3) | - | NULL | NULL | 软删除时间 |
| name | VARCHAR | 50 | - | NOT NULL | 标签名称(唯一) |
| slug | VARCHAR | 50 | - | NULL | URL别名(唯一) |
| color | VARCHAR | 20 | '#409eff' | NULL | 标签颜色 |
| article_count | INT | - | 0 | NOT NULL | 文章数量 |
索引:
- PRIMARY KEY:
id - UNIQUE INDEX:
idx_name(name) - UNIQUE INDEX:
idx_slug(slug) - INDEX:
idx_deleted_at(deleted_at)
多对多关系:文章和标签的关联。
| 字段名 | 类型 | 长度 | 默认值 | 允许空 | 说明 |
|---|---|---|---|---|---|
| article_id | BIGINT UNSIGNED | - | - | NOT NULL | 文章ID |
| tag_id | BIGINT UNSIGNED | - | - | NOT NULL | 标签ID |
索引:
- PRIMARY KEY:
article_id, tag_id - INDEX:
idx_article_id(article_id) - INDEX:
idx_tag_id(tag_id)
外键:
fk_article_tags_article: article_id REFERENCES articles(id) ON DELETE CASCADEfk_article_tags_tag: tag_id REFERENCES tags(id) ON DELETE CASCADE
存储文章评论信息,支持树形结构(父子评论)。
| 字段名 | 类型 | 长度 | 默认值 | 允许空 | 说明 |
|---|---|---|---|---|---|
| id | BIGINT UNSIGNED | - | AUTO_INCREMENT | NOT NULL | 主键,评论ID |
| created_at | DATETIME(3) | - | CURRENT_TIMESTAMP(3) | NOT NULL | 创建时间 |
| updated_at | DATETIME(3) | - | CURRENT_TIMESTAMP(3) ON UPDATE | NOT NULL | 更新时间 |
| deleted_at | DATETIME(3) | - | NULL | NULL | 软删除时间 |
| article_id | BIGINT UNSIGNED | - | - | NOT NULL | 文章ID |
| user_id | BIGINT UNSIGNED | - | - | NULL | 用户ID(登录用户) |
| parent_id | BIGINT UNSIGNED | - | NULL | NULL | 父评论ID |
| root_id | BIGINT UNSIGNED | - | NULL | NULL | 根评论ID(优化查询) |
| reply_to_id | BIGINT UNSIGNED | - | NULL | NULL | 回复的评论ID |
| content | TEXT | - | - | NOT NULL | 评论内容 |
| nickname | VARCHAR | 50 | - | NULL | 昵称(游客评论) |
| VARCHAR | 100 | - | NULL | 邮箱(游客评论) | |
| website | VARCHAR | 200 | - | NULL | 网站(游客评论) |
| ip | VARCHAR | 50 | - | NULL | IP地址 |
| user_agent | VARCHAR | 255 | - | NULL | User Agent |
| status | TINYINT | - | 1 | NOT NULL | 状态:1通过/0待审核/-1拒绝 |
| like_count | INT | - | 0 | NOT NULL | 点赞数 |
| reply_count | INT | - | 0 | NOT NULL | 回复数 |
索引:
- PRIMARY KEY:
id - INDEX:
idx_deleted_at(deleted_at) - INDEX:
idx_article_id(article_id) - INDEX:
idx_user_id(user_id) - INDEX:
idx_parent_id(parent_id) - INDEX:
idx_root_id(root_id) - INDEX:
idx_status_created(status, created_at DESC)
外键:
fk_comments_article: article_id REFERENCES articles(id) ON DELETE CASCADEfk_comments_user: user_id REFERENCES users(id) ON DELETE SET NULLfk_comments_parent: parent_id REFERENCES comments(id) ON DELETE CASCADE
存储个人作品展示信息。
| 字段名 | 类型 | 长度 | 默认值 | 允许空 | 说明 |
|---|---|---|---|---|---|
| id | BIGINT UNSIGNED | - | AUTO_INCREMENT | NOT NULL | 主键,作品ID |
| created_at | DATETIME(3) | - | CURRENT_TIMESTAMP(3) | NOT NULL | 创建时间 |
| updated_at | DATETIME(3) | - | CURRENT_TIMESTAMP(3) ON UPDATE | NOT NULL | 更新时间 |
| deleted_at | DATETIME(3) | - | NULL | NULL | 软删除时间 |
| title | VARCHAR | 200 | - | NOT NULL | 作品标题 |
| description | TEXT | - | - | NULL | 作品描述 |
| cover | VARCHAR | 255 | - | NULL | 封面图URL |
| images | TEXT | - | - | NULL | 图片列表(JSON数组) |
| link | VARCHAR | 255 | - | NULL | 项目链接 |
| github_url | VARCHAR | 255 | - | NULL | GitHub链接 |
| demo_url | VARCHAR | 255 | - | NULL | 演示链接 |
| tech_stack | VARCHAR | 500 | - | NULL | 技术栈(逗号分隔) |
| sort | INT | - | 0 | NOT NULL | 排序权重 |
| view_count | INT | - | 0 | NOT NULL | 浏览次数 |
| status | TINYINT | - | 1 | NOT NULL | 状态:1发布/0草稿 |
索引:
- PRIMARY KEY:
id - INDEX:
idx_deleted_at(deleted_at) - INDEX:
idx_status_sort(status, sort DESC)
存储友情链接信息。
| 字段名 | 类型 | 长度 | 默认值 | 允许空 | 说明 |
|---|---|---|---|---|---|
| id | BIGINT UNSIGNED | - | AUTO_INCREMENT | NOT NULL | 主键,链接ID |
| created_at | DATETIME(3) | - | CURRENT_TIMESTAMP(3) | NOT NULL | 创建时间 |
| updated_at | DATETIME(3) | - | CURRENT_TIMESTAMP(3) ON UPDATE | NOT NULL | 更新时间 |
| deleted_at | DATETIME(3) | - | NULL | NULL | 软删除时间 |
| name | VARCHAR | 100 | - | NOT NULL | 链接名称 |
| url | VARCHAR | 255 | - | NOT NULL | 链接地址 |
| logo | VARCHAR | 255 | - | NULL | 网站Logo |
| description | VARCHAR | 200 | - | NULL | 描述 |
| VARCHAR | 100 | - | NULL | 联系邮箱 | |
| sort | INT | - | 0 | NOT NULL | 排序权重 |
| status | TINYINT | - | 1 | NOT NULL | 状态:1显示/0隐藏 |
索引:
- PRIMARY KEY:
id - INDEX:
idx_deleted_at(deleted_at) - INDEX:
idx_status_sort(status, sort DESC)
存储系统配置信息。
| 字段名 | 类型 | 长度 | 默认值 | 允许空 | 说明 |
|---|---|---|---|---|---|
| id | BIGINT UNSIGNED | - | AUTO_INCREMENT | NOT NULL | 主键 |
| created_at | DATETIME(3) | - | CURRENT_TIMESTAMP(3) | NOT NULL | 创建时间 |
| updated_at | DATETIME(3) | - | CURRENT_TIMESTAMP(3) ON UPDATE | NOT NULL | 更新时间 |
| key | VARCHAR | 100 | - | NOT NULL | 配置键(唯一) |
| value | TEXT | - | - | NULL | 配置值 |
| type | VARCHAR | 20 | 'string' | NOT NULL | 类型:string/int/bool/json |
| description | VARCHAR | 200 | - | NULL | 描述 |
| group | VARCHAR | 50 | 'general' | NOT NULL | 分组 |
索引:
- PRIMARY KEY:
id - UNIQUE INDEX:
idx_key(key) - INDEX:
idx_group(group)
预定义配置:
site_name- 网站名称site_description- 网站描述site_keywords- 网站关键词site_icp- 备案号comment_audit- 评论审核开关register_enabled- 注册开关
存储上传的文件附件信息。
| 字段名 | 类型 | 长度 | 默认值 | 允许空 | 说明 |
|---|---|---|---|---|---|
| id | BIGINT UNSIGNED | - | AUTO_INCREMENT | NOT NULL | 主键,附件ID |
| created_at | DATETIME(3) | - | CURRENT_TIMESTAMP(3) | NOT NULL | 创建时间 |
| updated_at | DATETIME(3) | - | CURRENT_TIMESTAMP(3) ON UPDATE | NOT NULL | 更新时间 |
| deleted_at | DATETIME(3) | - | NULL | NULL | 软删除时间 |
| user_id | BIGINT UNSIGNED | - | - | NOT NULL | 上传者ID |
| file_name | VARCHAR | 255 | - | NOT NULL | 原始文件名 |
| file_path | VARCHAR | 500 | - | NOT NULL | 存储路径 |
| file_size | BIGINT | - | - | NOT NULL | 文件大小(字节) |
| file_type | VARCHAR | 50 | - | NOT NULL | 文件类型 |
| mime_type | VARCHAR | 100 | - | NOT NULL | MIME类型 |
| extension | VARCHAR | 20 | - | NOT NULL | 文件扩展名 |
| width | INT | - | - | NULL | 图片宽度 |
| height | INT | - | - | NULL | 图片高度 |
| storage_type | VARCHAR | 20 | 'local' | NOT NULL | 存储类型 |
| url | VARCHAR | 500 | - | NULL | 访问URL |
| usage_count | INT | - | 0 | NOT NULL | 使用次数 |
索引:
- PRIMARY KEY:
id - INDEX:
idx_deleted_at(deleted_at) - INDEX:
idx_user_id(user_id) - INDEX:
idx_file_type(file_type)
外键:
fk_attachments_user: user_id REFERENCES users(id) ON DELETE SET NULL
统一的点赞表,支持文章和作品的点赞。
| 字段名 | 类型 | 长度 | 默认值 | 允许空 | 说明 |
|---|---|---|---|---|---|
| id | BIGINT UNSIGNED | - | AUTO_INCREMENT | NOT NULL | 主键 |
| created_at | DATETIME(3) | - | CURRENT_TIMESTAMP(3) | NOT NULL | 创建时间 |
| updated_at | DATETIME(3) | - | CURRENT_TIMESTAMP(3) ON UPDATE | NOT NULL | 更新时间 |
| deleted_at | DATETIME(3) | - | NULL | NULL | 软删除时间 |
| user_id | BIGINT UNSIGNED | - | - | NOT NULL | 用户ID |
| article_id | BIGINT UNSIGNED | - | NULL | NULL | 文章ID(可为空) |
| work_id | BIGINT UNSIGNED | - | NULL | NULL | 作品ID(可为空) |
索引:
- PRIMARY KEY:
id - INDEX:
idx_deleted_at(deleted_at) - INDEX:
idx_user_target(user_id, article_id, work_id) - INDEX:
idx_article(article_id) - INDEX:
idx_work(work_id)
约束:
- article_id 和 work_id 至少有一个不为空
- 同一用户对同一目标只能点赞一次(由应用层保证)
统一的收藏表,支持文章和作品的收藏。
| 字段名 | 类型 | 长度 | 默认值 | 允许空 | 说明 |
|---|---|---|---|---|---|
| id | BIGINT UNSIGNED | - | AUTO_INCREMENT | NOT NULL | 主键 |
| created_at | DATETIME(3) | - | CURRENT_TIMESTAMP(3) | NOT NULL | 创建时间 |
| updated_at | DATETIME(3) | - | CURRENT_TIMESTAMP(3) ON UPDATE | NOT NULL | 更新时间 |
| deleted_at | DATETIME(3) | - | NULL | NULL | 软删除时间 |
| user_id | BIGINT UNSIGNED | - | - | NOT NULL | 用户ID |
| article_id | BIGINT UNSIGNED | - | NULL | NULL | 文章ID(可为空) |
| work_id | BIGINT UNSIGNED | - | NULL | NULL | 作品ID(可为空) |
索引:
- PRIMARY KEY:
id - INDEX:
idx_deleted_at(deleted_at) - INDEX:
idx_user_target(user_id, article_id, work_id) - INDEX:
idx_article(article_id) - INDEX:
idx_work(work_id)
约束:
- article_id 和 work_id 至少有一个不为空
- 同一用户对同一目标只能收藏一次(由应用层保证)
记录用户收藏的文章,实现收藏功能。
| 字段名 | 类型 | 长度 | 默认值 | 允许空 | 说明 |
|---|---|---|---|---|---|
| id | BIGINT UNSIGNED | - | AUTO_INCREMENT | NOT NULL | 主键 |
| created_at | DATETIME(3) | - | CURRENT_TIMESTAMP(3) | NOT NULL | 创建时间 |
| deleted_at | DATETIME(3) | - | NULL | NULL | 软删除时间 |
| user_id | BIGINT UNSIGNED | - | - | NOT NULL | 用户ID |
| article_id | BIGINT UNSIGNED | - | - | NOT NULL | 文章ID |
索引:
- PRIMARY KEY:
id - INDEX:
idx_deleted_at(deleted_at) - UNIQUE INDEX:
idx_user_article(user_id, article_id) - 防止重复收藏 - INDEX:
idx_article_id(article_id)
外键:
fk_article_favorites_user: user_id REFERENCES users(id) ON DELETE CASCADEfk_article_favorites_article: article_id REFERENCES articles(id) ON DELETE CASCADE
特点:
- 组合唯一索引防止用户重复收藏同一篇文章
- 支持快速查询用户的收藏列表
- 支持快速查询文章被收藏的次数
存储用户之间的关注关系,实现关注/粉丝功能。
| 字段名 | 类型 | 长度 | 默认值 | 允许空 | 说明 |
|---|---|---|---|---|---|
| id | BIGINT UNSIGNED | - | AUTO_INCREMENT | NOT NULL | 主键 |
| created_at | DATETIME(3) | - | CURRENT_TIMESTAMP(3) | NOT NULL | 创建时间 |
| deleted_at | DATETIME(3) | - | NULL | NULL | 软删除时间 |
| follower_id | BIGINT UNSIGNED | - | - | NOT NULL | 关注者ID(粉丝) |
| following_id | BIGINT UNSIGNED | - | - | NOT NULL | 被关注者ID |
索引:
- PRIMARY KEY:
id - INDEX:
idx_deleted_at(deleted_at) - UNIQUE INDEX:
idx_follower_following(follower_id, following_id) - 防止重复关注 - INDEX:
idx_follower_id(follower_id) - INDEX:
idx_following_id(following_id)
外键:
fk_user_follows_follower: follower_id REFERENCES users(id) ON DELETE CASCADEfk_user_follows_following: following_id REFERENCES users(id) ON DELETE CASCADE
特点:
- 组合唯一索引防止重复关注
- 支持快速查询关注列表(我关注的人)
- 支持快速查询粉丝列表(关注我的人)
- 支持检查互相关注状态
关系说明:
用户A 关注 用户B
follower_id = A (关注者/粉丝)
following_id = B (被关注者)
查询A的关注列表: WHERE follower_id = A
查询B的粉丝列表: WHERE following_id = B
检查A是否关注B: WHERE follower_id = A AND following_id = B
存储用户通知信息。
| 字段名 | 类型 | 长度 | 默认值 | 允许空 | 说明 |
|---|---|---|---|---|---|
| id | BIGINT UNSIGNED | - | AUTO_INCREMENT | NOT NULL | 主键 |
| created_at | DATETIME(3) | - | CURRENT_TIMESTAMP(3) | NOT NULL | 创建时间 |
| updated_at | DATETIME(3) | - | CURRENT_TIMESTAMP(3) ON UPDATE | NOT NULL | 更新时间 |
| deleted_at | DATETIME(3) | - | NULL | NULL | 软删除时间 |
| user_id | BIGINT UNSIGNED | - | - | NOT NULL | 接收者ID |
| from_user_id | BIGINT UNSIGNED | - | - | NULL | 发送者ID |
| type | VARCHAR | 50 | - | NOT NULL | 通知类型 |
| title | VARCHAR | 200 | - | NOT NULL | 标题 |
| content | TEXT | - | - | NULL | 内容 |
| target_type | VARCHAR | 50 | - | NULL | 目标类型 |
| target_id | BIGINT UNSIGNED | - | - | NULL | 目标ID |
| link | VARCHAR | 255 | - | NULL | 跳转链接 |
| is_read | TINYINT | - | 0 | NOT NULL | 是否已读 |
| read_at | DATETIME(3) | - | NULL | NULL | 阅读时间 |
索引:
- PRIMARY KEY:
id - INDEX:
idx_deleted_at(deleted_at) - INDEX:
idx_user_status(user_id, is_read) - INDEX:
idx_from_user_id(from_user_id) - INDEX:
idx_type(type) - INDEX:
idx_target_id(target_id)
通知类型:
comment- 评论通知reply- 回复通知like- 点赞通知system- 系统通知mention- @提及通知
外键:
fk_notifications_user: user_id REFERENCES users(id) ON DELETE CASCADEfk_notifications_from_user: from_user_id REFERENCES users(id) ON DELETE CASCADE
存储邮件订阅信息。
| 字段名 | 类型 | 长度 | 默认值 | 允许空 | 说明 |
|---|---|---|---|---|---|
| id | BIGINT UNSIGNED | - | AUTO_INCREMENT | NOT NULL | 主键 |
| created_at | DATETIME(3) | - | CURRENT_TIMESTAMP(3) | NOT NULL | 创建时间 |
| updated_at | DATETIME(3) | - | CURRENT_TIMESTAMP(3) ON UPDATE | NOT NULL | 更新时间 |
| deleted_at | DATETIME(3) | - | NULL | NULL | 软删除时间 |
| VARCHAR | 100 | - | NOT NULL | 订阅邮箱(唯一) | |
| status | TINYINT | - | 1 | NOT NULL | 状态:1已确认/0未确认/-1已取消 |
| token | VARCHAR | 64 | - | NULL | 确认/取消令牌(唯一) |
| ip | VARCHAR | 50 | - | NULL | 订阅IP |
| user_agent | VARCHAR | 255 | - | NULL | User Agent |
| confirm_at | DATETIME(3) | - | NULL | NULL | 确认时间 |
索引:
- PRIMARY KEY:
id - UNIQUE INDEX:
idx_email(email) - UNIQUE INDEX:
idx_token(token) - INDEX:
idx_deleted_at(deleted_at) - INDEX:
idx_status(status)
记录网站访问日志,用于统计分析。
| 字段名 | 类型 | 长度 | 默认值 | 允许空 | 说明 |
|---|---|---|---|---|---|
| id | BIGINT UNSIGNED | - | AUTO_INCREMENT | NOT NULL | 主键 |
| created_at | DATETIME(3) | - | CURRENT_TIMESTAMP(3) | NOT NULL | 访问时间 |
| user_id | BIGINT UNSIGNED | - | - | NULL | 用户ID(0表示游客) |
| ip | VARCHAR | 50 | - | NULL | IP地址 |
| user_agent | VARCHAR | 500 | - | NULL | User Agent |
| path | VARCHAR | 255 | - | NULL | 访问路径 |
| method | VARCHAR | 10 | - | NULL | 请求方法 |
| referer | VARCHAR | 500 | - | NULL | 来源URL |
| duration | INT | - | - | NULL | 请求耗时(毫秒) |
| status_code | INT | - | - | NULL | HTTP状态码 |
| country | VARCHAR | 50 | - | NULL | 国家 |
| province | VARCHAR | 50 | - | NULL | 省份 |
| city | VARCHAR | 50 | - | NULL | 城市 |
| browser | VARCHAR | 50 | - | NULL | 浏览器 |
| os | VARCHAR | 50 | - | NULL | 操作系统 |
| device | VARCHAR | 50 | - | NULL | 设备类型 |
索引:
- PRIMARY KEY:
id - INDEX:
idx_created_at(created_at) - INDEX:
idx_user_id(user_id) - INDEX:
idx_ip(ip) - INDEX:
idx_path(path) - INDEX:
idx_status_code(status_code)
说明:
- 数据量大时建议按月分表
- 定期归档到统计表
按天汇总的访问统计数据。
| 字段名 | 类型 | 长度 | 默认值 | 允许空 | 说明 |
|---|---|---|---|---|---|
| id | BIGINT UNSIGNED | - | AUTO_INCREMENT | NOT NULL | 主键 |
| date | DATE | - | - | NOT NULL | 日期(唯一) |
| pv | INT | - | 0 | NOT NULL | 页面浏览量 |
| uv | INT | - | 0 | NOT NULL | 独立访客数 |
| ip | INT | - | 0 | NOT NULL | 独立IP数 |
| new_users | INT | - | 0 | NOT NULL | 新增用户数 |
| article_view | INT | - | 0 | NOT NULL | 文章浏览量 |
| avg_duration | INT | - | 0 | NOT NULL | 平均访问时长(秒) |
| bounce_rate | DECIMAL | 5,2 | 0.00 | NOT NULL | 跳出率 |
| created_at | DATETIME(3) | - | CURRENT_TIMESTAMP(3) | NOT NULL | 创建时间 |
| updated_at | DATETIME(3) | - | CURRENT_TIMESTAMP(3) ON UPDATE | NOT NULL | 更新时间 |
索引:
- PRIMARY KEY:
id - UNIQUE INDEX:
idx_date(date)
说明:
- 由定时任务每天凌晨汇总生成
- 用于统计面板展示
users (用户表)
├── 1:N → articles (作者)
├── 1:N → comments (评论者)
├── 1:N → attachments (上传者)
├── 1:N → likes (点赞记录)
├── 1:N → favorites (收藏记录)
├── 1:N → user_follows (关注记录 - 作为关注者) 🆕
├── 1:N → user_follows (被关注记录 - 作为被关注者) 🆕
├── 1:N → notifications (接收通知)
└── 1:N → notifications (发送通知)
articles (文章表)
├── N:1 → users (作者)
├── N:1 → categories (分类)
├── N:M → tags (标签,通过 article_tags)
├── 1:N → comments (评论)
├── 1:N → likes (点赞记录)
└── 1:N → favorites (收藏记录)
categories (分类表)
├── 1:N → articles (文章)
└── 1:N → categories (父子分类,自关联)
tags (标签表)
└── N:M → articles (通过 article_tags 关联)
comments (评论表)
├── N:1 → articles (所属文章)
├── N:1 → users (评论者,可选)
├── 1:N → comments (父子评论,自关联)
works (作品表)
└── 独立表,无外键关系
links (友情链接表)
└── 独立表,无外键关系
settings (系统配置表)
└── 独立表,无外键关系
attachments (附件表)
└── N:1 → users (上传者)
likes (统一点赞表)
├── N:1 → articles (文章,可选)
├── N:1 → works (作品,可选)
└── N:1 → users (用户)
favorites (统一收藏表)
├── N:1 → articles (文章,可选)
├── N:1 → works (作品,可选)
└── N:1 → users (用户)
article_favorites (文章收藏表 - 兼容旧版本)
├── N:1 → users (用户)
└── N:1 → articles (文章)
user_follows (用户关注表)
├── N:1 → users (关注者)
└── N:1 → users (被关注者,自关联)
notifications (通知表)
├── N:1 → users (接收者)
└── N:1 → users (发送者)
subscriptions (订阅表)
└── 独立表,无外键关系
visit_logs (访问日志表)
└── 独立表,记录访问信息
visit_log_summaries (访问统计汇总表)
└── 独立表,汇总统计数据
1. 核心业务表(7张)
- users, articles, categories, tags, article_tags, comments, works
2. 扩展功能表(8张)
- links, settings, attachments, likes, favorites, user_follows, notifications, subscriptions
3. 日志统计表(2张)
- visit_logs, visit_log_summaries
总计:18张表
为了提高查询性能,部分表使用了冗余的统计字段:
- users.article_count: 用户发布的文章总数
- users.comment_count: 用户的评论总数
- articles.comment_count: 文章的评论总数
- categories.article_count: 分类下的文章总数
- tags.article_count: 标签下的文章总数
- comments.reply_count: 评论的回复数
维护方式:
- 通过应用层代码维护(推荐)
- 使用数据库触发器维护
- 定期通过定时任务校准
- ✅ 为常用查询条件添加索引
- ✅ 组合索引遵循最左前缀原则
- ✅ 避免过多索引影响写入性能
- 文章列表查询使用
idx_top_status_created组合索引 - 分页查询使用 LIMIT + OFFSET
- 大数据量时考虑使用游标分页
- 文章详情:缓存1小时
- 文章列表:缓存15分钟
- 分类标签:缓存30分钟
- 热门文章:缓存6小时
当数据量超过百万级时考虑:
- 文章表按年份分表
- 评论表按文章ID哈希分表
建议使用数据库迁移工具管理表结构变更:
- golang-migrate
- goose
- 自定义迁移脚本
- 每日全量备份
- 增量备份(binlog)
- 定期测试恢复流程
- 密码安全: 使用 bcrypt 加密,cost=10
- SQL注入: 使用 GORM 参数化查询
- 敏感信息: 不在日志中输出密码、token等
- 软删除: 重要数据使用软删除而非物理删除
- 数据加密: 敏感字段考虑加密存储
可以使用以下SQL导出完整的数据字典:
SELECT
TABLE_NAME as '表名',
COLUMN_NAME as '字段名',
COLUMN_TYPE as '数据类型',
IS_NULLABLE as '允许空',
COLUMN_DEFAULT as '默认值',
COLUMN_COMMENT as '备注'
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_SCHEMA = 'mysite'
ORDER BY
TABLE_NAME, ORDINAL_POSITION;