0

0

mysql在博客系统中的数据库表设计与实现

P粉602998670

P粉602998670

发布时间:2026-01-11 08:13:02

|

865人浏览过

|

来源于php中文网

原创

博客系统核心表必须分users、posts、categories、tags四张基础表,并增设post_tags中间表;否则posts表膨胀、查询慢、锁竞争加剧,且标签无法高效筛选。

mysql在博客系统中的数据库表设计与实现

博客系统核心表有哪些,为什么必须分表 单表存所有内容看似简单,但实际会导致 posts 表膨胀过快、查询变慢、锁竞争加剧。真实博客系统至少要拆出四张基础表:users(用户)、posts(文章)、categories(分类)、tags(标签)。其中 poststags 是多对多关系,必须通过中间表 post_tags 关联——漏掉这张表,后期加标签筛选就只能用 LIKE 模糊匹配,性能直接崩。

常见错误是把标签当字符串塞进 posts.tag_list 字段,比如存成 "mysql,python,web"。这违反第一范式,无法索引、不能原子增删、JOIN 查询失效。

user 表和 post 表的字段怎么定才不踩坑users 表必须有 id(主键,BIGINT UNSIGNED,避免未来 ID 超出 INT 上限)、username(唯一索引)、email(可选唯一)、password_hash(不是明文密码)、created_atDATETIMETIMESTAMP,推荐后者,自动时区处理更稳)。

posts 表关键字段包括:iduser_id(外键,指向 users.id)、titleVARCHAR(200) 足够)、slug(用于 URL,如 "how-to-use-mysql-index",加唯一索引)、content(用 LONGTEXT,别用 TEXT,防超长 Markdown 渲染内容)、statusENUM('draft','published','archived')TINYINT,比字符串查得快)、published_at(允许为 NULL,草稿时不填)。

CREATE TABLE posts (
  id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  user_id BIGINT UNSIGNED NOT NULL,
  title VARCHAR(200) NOT NULL,
  slug VARCHAR(200) NOT NULL UNIQUE,
  content LONGTEXT NOT NULL,
  status ENUM('draft','published','archived') DEFAULT 'draft',
  published_at DATETIME 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
);

分类与标签的关联逻辑怎么实现才高效categories 是树形结构?先别急着加 parent_id。大多数博客只有平级分类(如“数据库”“前端”“运维”),用单层表 + posts.category_id 外键即可。真需要多级,再考虑闭包表或路径枚举,别一上来就搞复杂。

tags 必须独立成表,并配中间表:

  • tagsidnameVARCHAR(50),加唯一索引,防重复标签)
  • post_tagspost_idtag_id,联合主键 + 双向索引((post_id, tag_id)(tag_id, post_id)

这样查「某标签下的所有文章」就是:

SELECT p.* FROM posts p
JOIN post_tags pt ON p.id = pt.post_id
WHERE pt.tag_id = ? AND p.status = 'published';

如果只建了 (post_id, tag_id) 索引,上面这个查询会全表扫 post_tags——因为 WHERE 条件走的是 tag_id,而索引最左前缀不匹配。

云网OA
云网OA

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

下载

实际写入和查询时哪些 MySQL 配置容易被忽略innodb_buffer_pool_size 必须设为物理内存的 50%–75%,否则缓存太小,每次查 content 都读磁盘。

max_allowed_packet 要调大(比如 64M),否则插入带大图 Base64 的 Markdown 内容会报错 Packet for query is too large

全文搜索不用等 Elasticsearch。MySQL 5.6+ 原生支持中文需搭配 ngram 插件:

ALTER TABLE posts ADD FULLTEXT(title, content) WITH PARSER ngram;
SELECT * FROM posts WHERE MATCH(title, content) AGAINST('mysql 索引' IN NATURAL LANGUAGE MODE);

但注意:ngram 对英文分词不友好,混合内容建议还是上 ES 或 Meilisearch。

字段默认值、时间类型、外键行为、索引覆盖、字符集(一律 utf8mb4_unicode_ci)——这些细节没调好,上线后改起来比重构还疼。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

745

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

634

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

757

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

617

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1259

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

547

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

577

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

705

2023.08.11

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

78

2026.01.09

热门下载

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

精品课程

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

共48课时 | 1.7万人学习

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

共3课时 | 0.3万人学习

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

共1课时 | 785人学习

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

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