Rust博客实战 | (一)数据库设计及建表语句
dulucy
|
2025-11-20 23:47:03
|
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='菜单权限表';