Rust博客实战 | (一)数据库设计及建表语句

dulucy | 2025-11-20 23:47:03 | Rust
Rust博客实战 | (一)数据库设计及建表语句

使用Deepseek完成功能清单及开发计划后,就开始进行数据库表设计。有了AI后,省下了好多时间,开发从0到1也变得更加简单了,但是还是需要自己再进行干预,不然生成的也是不合适的。比如这次生成的表,AI加了外键,我是不太喜欢用外键来保证数据一致性的,因此需要手动删除外键,以及更正一些命名的问题。下面是AI生成,并进行修改后的建表语句。


1.文章表 - 核心表

CREATE TABLE `blog_articles` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '文章ID',
  `title` varchar(255) NOT NULL COMMENT '文章标题',
  `slug` varchar(300) NOT NULL COMMENT '文章别名',
  `content` longtext NOT NULL COMMENT '文章内容',
  `excerpt` text COMMENT '文章摘要',
  `featured_image` varchar(500) DEFAULT NULL COMMENT '特色图片',
  `status` varchar(20) DEFAULT 'draft' COMMENT '状态: draft-草稿, published-已发布, private-私有, trash-回收站',
  `visibility` varchar(20) DEFAULT 'public' COMMENT '可见性: public-公开, password-密码保护, private-私有',
  `password` varchar(100) DEFAULT NULL COMMENT '访问密码',
  `author_id` int NOT NULL COMMENT '作者ID',
  `category_id` int DEFAULT NULL COMMENT '分类ID',
  `meta_title` varchar(255) DEFAULT NULL COMMENT 'SEO标题',
  `meta_description` text COMMENT 'SEO描述',
  `meta_keywords` varchar(500) DEFAULT NULL COMMENT 'SEO关键词',
  `view_count` int DEFAULT '0' COMMENT '浏览数',
  `comment_count` int DEFAULT '0' COMMENT '评论数',
  `like_count` int DEFAULT '0' COMMENT '点赞数',
  `created_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `published_at` datetime DEFAULT NULL COMMENT '发布时间',
  `scheduled_at` datetime DEFAULT NULL COMMENT '定时发布时间',
  `sort_order` int DEFAULT '0' COMMENT '排序顺序',
  `is_sticky` tinyint(1) DEFAULT '0' COMMENT '是否置顶',
  `is_featured` tinyint(1) DEFAULT '0' COMMENT '是否推荐',
  `format` varchar(20) DEFAULT 'markdown' COMMENT '内容格式: markdown, html, richtext',
  `is_original` int DEFAULT '1' COMMENT '是否原创  0:转载 1:原创',
  `original_url` varchar(255) DEFAULT NULL COMMENT '转载地址',
  `article_menu` mediumtext COMMENT '文章目录',
  `article_url` varchar(200) DEFAULT NULL COMMENT '系统自动生成的静态你文章页面地址',
  `temp_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'article_temp.html' COMMENT '静态化使用的模板名称',
  `article_type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'blog' COMMENT '默认blog,可以是:blog、doc',
  PRIMARY KEY (`id`),
  UNIQUE KEY `slug` (`slug`),
  KEY `idx_blog_articles_slug` (`slug`),
  KEY `idx_blog_articles_author_id` (`author_id`),
  KEY `idx_blog_articles_category_id` (`category_id`),
  KEY `idx_blog_articles_status` (`status`),
  KEY `idx_blog_articles_published_at` (`published_at`),
  KEY `idx_blog_articles_created_at` (`created_at`),
  KEY `idx_blog_articles_is_sticky` (`is_sticky`),
  KEY `idx_blog_articles_is_featured` (`is_featured`),
  FULLTEXT KEY `idx_blog_articles_title_content` (`title`,`content`),
  CONSTRAINT `blog_articles_chk_1` CHECK ((`status` in (_utf8mb4'draft',_utf8mb4'published',_utf8mb4'private',_utf8mb4'trash'))),
  CONSTRAINT `blog_articles_chk_2` CHECK ((`visibility` in (_utf8mb4'public',_utf8mb4'password',_utf8mb4'private'))),
  CONSTRAINT `blog_articles_chk_3` CHECK ((`format` in (_utf8mb4'markdown',_utf8mb4'html',_utf8mb4'richtext')))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='博客文章表';

2. 分类表

CREATE TABLE `blog_categories` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '分类ID',
  `name` varchar(100) NOT NULL COMMENT '分类名称',
  `slug` varchar(120) NOT NULL COMMENT '分类别名',
  `description` text COMMENT '分类描述',
  `parent_id` int DEFAULT NULL COMMENT '父分类ID',
  `sort_order` int DEFAULT '0' COMMENT '排序顺序',
  `article_count` int DEFAULT '0' COMMENT '文章数量',
  `created_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `slug` (`slug`),
  KEY `idx_blog_categories_slug` (`slug`),
  KEY `idx_blog_categories_parent_id` (`parent_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='博客分类表';

3. 标签表

CREATE TABLE `blog_tags` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '标签ID',
  `name` varchar(50) NOT NULL COMMENT '标签名称',
  `slug` varchar(70) NOT NULL COMMENT '标签别名',
  `description` text COMMENT '标签描述',
  `color` varchar(7) DEFAULT NULL COMMENT '标签颜色(十六进制)',
  `article_count` int DEFAULT '0' COMMENT '文章数量',
  `created_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `slug` (`slug`),
  KEY `idx_blog_tags_slug` (`slug`),
  KEY `idx_blog_tags_name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='博客标签表';

4.文章标签关联表

CREATE TABLE `blog_article_tags` (
  `article_id` int NOT NULL COMMENT '文章ID',
  `tag_id` int NOT NULL COMMENT '标签ID',
  `created_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`article_id`,`tag_id`),
  KEY `idx_blog_article_tags_tag_id` (`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='文章标签关联表';

5.博客评论表

CREATE TABLE `blog_comments` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '评论ID',
  `content` text NOT NULL COMMENT '评论内容',
  `author_name` varchar(100) NOT NULL COMMENT '评论者姓名',
  `author_email` varchar(255) NOT NULL COMMENT '评论者邮箱',
  `author_website` varchar(500) DEFAULT NULL COMMENT '评论者网站',
  `author_ip` varchar(45) DEFAULT NULL COMMENT '评论者IP地址',
  `author_user_agent` text COMMENT '评论者浏览器信息',
  `status` varchar(20) DEFAULT 'pending' COMMENT '状态: approved-已审核, pending-待审核, spam-垃圾评论, trash-回收站',
  `is_admin` tinyint(1) DEFAULT '0' COMMENT '是否管理员评论',
  `article_id` int NOT NULL COMMENT '文章ID',
  `parent_id` int DEFAULT NULL COMMENT '父评论ID',
  `user_id` int DEFAULT NULL COMMENT '用户ID(注册用户)',
  `like_count` int DEFAULT '0' COMMENT '点赞数',
  `dislike_count` int DEFAULT '0' COMMENT '点踩数',
  `created_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `user_id` (`user_id`),
  KEY `idx_blog_comments_article_id` (`article_id`),
  KEY `idx_blog_comments_parent_id` (`parent_id`),
  KEY `idx_blog_comments_status` (`status`),
  KEY `idx_blog_comments_created_at` (`created_at`),
  CONSTRAINT `blog_comments_chk_1` CHECK ((`status` in (_utf8mb4'approved',_utf8mb4'pending',_utf8mb4'spam',_utf8mb4'trash')))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='博客评论表';

6.博客媒体文件表

统一对网站的媒体资源进行管理,减少重复上传的图片等占用服务器空间

CREATE TABLE `blog_media` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '媒体文件ID',
  `name` varchar(255) NOT NULL COMMENT '文件名称',
  `file_name` varchar(500) NOT NULL COMMENT '文件名',
  `file_path` varchar(1000) NOT NULL COMMENT '文件路径',
  `file_size` bigint NOT NULL COMMENT '文件大小(字节)',
  `mime_type` varchar(100) NOT NULL COMMENT 'MIME类型',
  `file_extension` varchar(20) DEFAULT NULL COMMENT '文件扩展名',
  `width` int DEFAULT NULL COMMENT '图片宽度',
  `height` int DEFAULT NULL COMMENT '图片高度',
  `alt_text` varchar(500) DEFAULT NULL COMMENT '替代文本',
  `caption` text COMMENT '图片说明',
  `description` text COMMENT '图片描述',
  `uploader_id` int NOT NULL COMMENT '上传者ID',
  `article_id` int DEFAULT NULL COMMENT '关联文章ID',
  `storage_type` varchar(20) DEFAULT 'local' COMMENT '存储类型: local-本地, s3-AWS S3, oss-阿里云OSS, cos-腾讯云COS',
  `storage_bucket` varchar(255) DEFAULT NULL COMMENT '存储桶名称',
  `storage_key` varchar(500) DEFAULT NULL COMMENT '存储键名',
  `created_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_blog_media_uploader_id` (`uploader_id`),
  KEY `idx_blog_media_article_id` (`article_id`),
  KEY `idx_blog_media_mime_type` (`mime_type`),
  CONSTRAINT `blog_media_chk_1` CHECK ((`storage_type` in (_utf8mb4'local',_utf8mb4's3',_utf8mb4'oss',_utf8mb4'cos')))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='博客媒体文件表';

7.博客插件表

后续会使用插件的方式进行功能扩展,比如自动提交网址等

CREATE TABLE `blog_plugins` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '插件ID',
  `plugin_id` varchar(100) NOT NULL COMMENT '插件唯一标识',
  `name` varchar(100) NOT NULL COMMENT '插件名称',
  `version` varchar(20) NOT NULL COMMENT '插件版本',
  `description` text COMMENT '插件描述',
  `author` varchar(100) DEFAULT NULL COMMENT '插件作者',
  `website` varchar(500) DEFAULT NULL COMMENT '插件网站',
  `license` varchar(50) DEFAULT NULL COMMENT '许可证',
  `is_active` tinyint(1) DEFAULT '0' COMMENT '是否激活',
  `is_installed` tinyint(1) DEFAULT '1' COMMENT '是否已安装',
  `permissions` json DEFAULT NULL COMMENT '插件权限',
  `hooks` json DEFAULT NULL COMMENT '插件钩子',
  `entry_point` varchar(500) DEFAULT NULL COMMENT '入口文件路径',
  `created_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `plugin_id` (`plugin_id`),
  KEY `idx_blog_plugins_plugin_id` (`plugin_id`),
  KEY `idx_blog_plugins_is_active` (`is_active`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='博客插件表';

8.博客系统设置表

用于配置网站的基本信息,如网址、备案号等信息

CREATE TABLE `blog_settings` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '设置ID',
  `setting_key` varchar(100) NOT NULL COMMENT '设置键',
  `setting_value` json NOT NULL COMMENT '设置值',
  `setting_type` varchar(20) DEFAULT 'string' COMMENT '设置类型: string-字符串, number-数字, boolean-布尔值, array-数组, object-对象',
  `category` varchar(50) DEFAULT 'general' COMMENT '设置分类',
  `description` text COMMENT '设置描述',
  `created_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `setting_key` (`setting_key`),
  KEY `idx_blog_settings_key` (`setting_key`),
  KEY `idx_blog_settings_category` (`category`),
  CONSTRAINT `blog_settings_chk_1` CHECK ((`setting_type` in (_utf8mb4'string',_utf8mb4'number',_utf8mb4'boolean',_utf8mb4'array',_utf8mb4'object')))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='博客系统设置表';

9.主题配置表

CREATE TABLE `blog_theme_config` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '配置ID',
  `theme_id` varchar(100) NOT NULL COMMENT '主题ID',
  `config_key` varchar(100) NOT NULL COMMENT '配置键',
  `config_value` json NOT NULL COMMENT '配置值',
  `config_type` varchar(20) DEFAULT 'string' COMMENT '配置类型: string-字符串, number-数字, boolean-布尔值, array-数组, object-对象',
  `created_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_blog_theme_config` (`theme_id`,`config_key`),
  KEY `idx_blog_theme_config_theme_id` (`theme_id`),
  CONSTRAINT `blog_theme_config_chk_1` CHECK ((`config_type` in (_utf8mb4'string',_utf8mb4'number',_utf8mb4'boolean',_utf8mb4'array',_utf8mb4'object')))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='主题配置表';

10.博客主题表

CREATE TABLE `blog_themes` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '主题ID',
  `theme_id` varchar(100) NOT NULL COMMENT '主题唯一标识',
  `name` varchar(100) NOT NULL COMMENT '主题名称',
  `version` varchar(20) NOT NULL COMMENT '主题版本',
  `description` text COMMENT '主题描述',
  `author` varchar(100) DEFAULT NULL COMMENT '主题作者',
  `website` varchar(500) DEFAULT NULL COMMENT '主题网站',
  `license` varchar(50) DEFAULT NULL COMMENT '许可证',
  `is_active` tinyint(1) DEFAULT '0' COMMENT '是否激活',
  `is_installed` tinyint(1) DEFAULT '1' COMMENT '是否已安装',
  `features` json DEFAULT NULL COMMENT '支持的特性',
  `theme_path` varchar(500) NOT NULL COMMENT '主题路径',
  `created_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `theme_id` (`theme_id`),
  KEY `idx_blog_themes_theme_id` (`theme_id`),
  KEY `idx_blog_themes_is_active` (`is_active`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='博客主题表';

11.博客用户表

CREATE TABLE `blog_users` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '用户ID',
  `username` varchar(50) NOT NULL COMMENT '用户名',
  `email` varchar(255) NOT NULL COMMENT '邮箱地址',
  `password_hash` varchar(255) NOT NULL COMMENT '密码哈希',
  `display_name` varchar(100) DEFAULT NULL COMMENT '显示名称',
  `avatar` varchar(500) DEFAULT NULL COMMENT '头像URL',
  `role` varchar(20) DEFAULT 'author' COMMENT '角色: admin-管理员, editor-编辑, author-作者, subscriber-订阅者',
  `status` varchar(20) DEFAULT 'active' COMMENT '状态: active-活跃, inactive-未激活, banned-封禁',
  `bio` text COMMENT '个人简介',
  `website` varchar(500) DEFAULT NULL COMMENT '个人网站',
  `location` varchar(100) DEFAULT NULL COMMENT '所在地',
  `created_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `last_login_at` datetime DEFAULT NULL COMMENT '最后登录时间',
  `login_count` int DEFAULT '0' COMMENT '登录次数',
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`username`),
  UNIQUE KEY `email` (`email`),
  KEY `idx_blog_users_username` (`username`),
  KEY `idx_blog_users_email` (`email`),
  KEY `idx_blog_users_role` (`role`),
  KEY `idx_blog_users_status` (`status`),
  CONSTRAINT `blog_users_chk_1` CHECK ((`role` in (_utf8mb4'admin',_utf8mb4'editor',_utf8mb4'author',_utf8mb4'subscriber'))),
  CONSTRAINT `blog_users_chk_2` CHECK ((`status` in (_utf8mb4'active',_utf8mb4'inactive',_utf8mb4'banned')))
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='博客用户表';

##初始化
INSERT INTO blog.blog_users (id, username, email, password_hash, display_name, avatar, `role`, status, bio, website, location, created_at, updated_at, last_login_at, login_count) VALUES(1, 'admin', 'admin@example.com', '1b48efd284044f47f494b94865acda77', '系统管理员', NULL, 'admin', 'active', NULL, NULL, NULL, '2025-11-07 10:15:39', '2025-11-14 16:52:36', NULL, 0);

12.菜单权限表

CREATE TABLE `sys_menu` (
  `menu_id` bigint NOT NULL AUTO_INCREMENT COMMENT '菜单ID',
  `menu_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '菜单名称',
  `parent_id` bigint DEFAULT '0' COMMENT '父菜单ID',
  `order_num` int DEFAULT '0' COMMENT '显示顺序',
  `path` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '路由地址',
  `component` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '组件路径',
  `query` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '路由参数',
  `is_frame` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '1' COMMENT '是否为外链(0是 1否)',
  `is_cache` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '是否缓存(0缓存 1不缓存)',
  `menu_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '菜单类型(M目录 C菜单 F按钮)',
  `visible` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '菜单状态(0显示 1隐藏)',
  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '菜单状态(0正常 1停用)',
  `perms` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '权限标识',
  `icon` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '#' COMMENT '菜单图标',
  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '备注',
  `route_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '路由名称',
  PRIMARY KEY (`menu_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='菜单权限表';
相关标签: Mysql sqlx rust