0

0

如何用mysql设计一个博客系统的数据库_mysql开发实战

P粉602998670

P粉602998670

发布时间:2026-02-28 10:06:56

|

266人浏览过

|

来源于php中文网

原创

用户表和文章表必须分设,用外键关联;分类与标签须用多对多中间表;评论表需支持嵌套和审核;关键字段如user_id、slug、status+published_at等必须加索引。

如何用mysql设计一个博客系统的数据库_mysql开发实战

用户表和文章表必须分开设计,不能用单表模拟关系

很多人一开始想省事,把用户信息和文章内容全塞进一个 posts 表里,加一堆 author_nameauthor_email 字段。这会导致数据冗余、更新异常,而且无法支持多作者协作或作者资料修改——改一次邮箱就得扫全表更新。

正确做法是拆成 usersposts 两张表,用 user_id 外键关联:

CREATE TABLE users (
  id INT PRIMARY KEY AUTO_INCREMENT,
  username VARCHAR(50) UNIQUE NOT NULL,
  email VARCHAR(100) UNIQUE NOT NULL,
  password_hash VARCHAR(255) NOT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
<p>CREATE TABLE posts (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
title VARCHAR(200) NOT NULL,
slug VARCHAR(200) UNIQUE, -- 用于 URL,需索引
content TEXT NOT NULL,
status ENUM('draft', 'published', 'archived') DEFAULT 'draft',
published_at TIMESTAMP NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
  • ON DELETE CASCADE 要谨慎:删用户时自动删其文章,适合个人博客;团队博客建议改成 SET NULL 并允许 user_id 为 NULL
  • slug 必须加 UNIQUE 索引,否则重复 URL 会出错;生成逻辑应在应用层做(如用标题转小写+连字符),不要依赖 MySQL 自动生成
  • statusENUMVARCHAR 更安全,避免非法值,但别滥用——如果状态流转复杂(比如加“reviewing”“rejected”),就该换 TINYINT + 注释说明

分类和标签必须用多对多中间表,别硬编码字段

看到有人在 posts 表里加 categorytag1/tag2/tag3 字段,这是典型反模式。它限制了每篇文章最多 3 个标签,且无法高效查“所有带‘MySQL’标签的文章”。

标准解法是三张表:分类表、标签表、中间关联表:

CREATE TABLE categories (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(50) NOT NULL UNIQUE,
  slug VARCHAR(50) UNIQUE NOT NULL
);
<p>CREATE TABLE tags (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL UNIQUE,
slug VARCHAR(50) UNIQUE NOT NULL
);</p><p>CREATE TABLE post_categories (
post_id INT NOT NULL,
category_id INT NOT NULL,
PRIMARY KEY (post_id, category_id),
FOREIGN KEY (post_id) REFERENCES posts(id) ON DELETE CASCADE,
FOREIGN KEY (category_id) REFERENCES categories(id)
);</p><p>CREATE TABLE post_tags (
post_id INT NOT NULL,
tag_id INT NOT NULL,
PRIMARY KEY (post_id, tag_id),
FOREIGN KEY (post_id) REFERENCES posts(id) ON DELETE CASCADE,
FOREIGN KEY (tag_id) REFERENCES tags(id)
);
  • 分类一般是一对一(一篇文章只属一个主分类),但用中间表更灵活,未来可扩展为多分类
  • 标签一定是多对多,post_tags 的联合主键能天然去重,也避免重复插入同一标签
  • 查某文章的所有标签:用 JOIN,不是子查询——SELECT t.name FROM tags t JOIN post_tags pt ON t.id = pt.tag_id WHERE pt.post_id = 123

评论表要预判灌水和嵌套需求,别只建个线性结构

只建 comments 表,字段含 post_idauthor_namecontentcreated_at,短期够用,但很快会卡在两个地方:一是被机器人刷屏(没防刷机制),二是用户想回复某条评论(没父子关系)。

云网OA
云网OA

采用JSP开发的办公自动化产品、基于B/S结构,运行环境:JDK v1.5、Tomcat v5.5、MySQL v4.1,三者均为以上版本其他相关内容:可视化流程设计: 流程支持串签、会签和分支流程,可以设置流程节点的修改、删除权限,并可指定流程中各个用户在表单中可以填写的域。智能表单所见即所得设计: 智能设计,自动在数据库中生成表格,方便优化程序 公共交流: 集论坛、博客、聊天室于一体文件柜:C

下载

基础版先加层级支持和简单风控字段:

CREATE TABLE comments (
  id INT PRIMARY KEY AUTO_INCREMENT,
  post_id INT NOT NULL,
  parent_id INT DEFAULT NULL, -- NULL 表示根评论,否则指向另一条评论 id
  user_id INT NULL, -- 可为空,支持游客评论
  author_name VARCHAR(100) NOT NULL,
  author_email VARCHAR(100),
  content TEXT NOT NULL,
  status ENUM('pending', 'approved', 'spam', 'rejected') DEFAULT 'pending',
  ip_address VARCHAR(45), -- 支持 IPv6
  user_agent TEXT,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (post_id) REFERENCES posts(id) ON DELETE CASCADE,
  FOREIGN KEY (parent_id) REFERENCES comments(id) ON DELETE SET NULL
);
  • parent_id 设为 REFERENCES comments(id),并用 ON DELETE SET NULL,这样删掉某条评论,它的子评论不会丢失,只是变成根评论
  • status 初始设 pending,配合后台审核;自动标 spam 需应用层调用反垃圾 API,MySQL 本身不处理
  • 别在评论表里存用户密码或敏感信息——user_id 是可选的,游客评论就留空,靠 author_email + ip_address 去重

索引不是越多越好,这几个字段必须加,其余看查询模式

刚建完表就给所有外键和字符串字段加索引?反而拖慢写入。MySQL 的 B+ 树索引有维护成本,尤其高并发写入时。

优先保证以下索引存在:

  • posts.user_id:查某个用户所有文章,必走索引
  • posts.slug:URL 路由匹配,必须 UNIQUE 索引
  • posts.status + posts.published_at 组合索引:查“已发布且按时间倒序”的列表页,INDEX(status, published_at) 比单列更高效
  • comments.post_idcomments.status:查某篇文章的已审核评论,组合索引 INDEX(post_id, status) 能覆盖查询
  • post_tags.tag_idpost_tags.post_id:查某标签下所有文章,两个方向都要快,所以联合主键本身已是双向索引

其他字段如 users.emailcategories.slug 也应单独建索引,但像 comments.content 这种大文本字段,别加普通索引——要用就上 FULLTEXT,且仅限 MyISAM 或 InnoDB 5.6+,还得配合 MATCH ... AGAINST 语法。

真正容易被忽略的是:上线后用 SHOW INDEX FROM table_name 定期检查,再结合慢查询日志(slow_query_log),看哪些查询没走索引。没有监控的索引,和没写的代码一样不可靠。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

682

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

432

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

286

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

519

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

264

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

392

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

539

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

640

2023.08.14

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

0

2026.02.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 2.4万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 838人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号