用 MySQL 实现文章管理,核心是设计合理、可扩展的表结构,并配合常用 SQL 操作完成增删改查。重点不在堆砌字段,而在于满足实际业务需求(如分类、标签、状态、搜索、排序),同时兼顾查询效率和维护性。
基础文章表结构(含关键字段说明)
以下是一个兼顾通用性与实用性的
articles表设计: id:主键,BIGINT AUTO_INCREMENT,避免 INT 溢出 title:VARCHAR(200),不建议过长,全文检索时更高效 slug:VARCHAR(200) UNIQUE,用于生成友好 URL(如
/post/how-to-mysql),需程序层保证唯一性和合法性 content:LONGTEXT,存储正文(Markdown 或 HTML 均可,建议存原始格式,渲染由应用层处理) summary:VARCHAR(500) 或 TEXT,用于列表页摘要,避免每次查全文 status:TINYINT,默认 0,表示草稿(0)、已发布(1)、已归档(2)、已删除(3)——用数值比字符串更省内存且便于索引 category_id:BIGINT,外键关联分类表,不强制 ON DELETE CASCADE,由应用逻辑控制一致性 user_id:BIGINT,作者 ID,对应用户表 created_at:DATETIME / TIMESTAMP,记录创建时间 updated_at:DATETIME,记录最后修改时间(非自动生成,由程序更新) published_at:DATETIME NULL,仅对已发布文章有意义,用于按发布时间排序或定时发布
支持多对多关系的辅助表(分类、标签)
文章与分类是一对多,但与标签是多对多,需中间表解耦:
categories 表:id、name、slug、parent_id(支持二级分类)、sort_order tags 表:id、name、slug、used_count(可选,提升统计效率) article_tags 中间表:article_id、tag_id,联合唯一索引 (article_id, tag_id),并分别建索引加速双向查询例如查某文章的所有标签:
SELECT t.name FROM tags t JOIN article_tags at ON t.id = at.tag_id WHERE at.article_id = 123;
提升查询性能的关键索引
没有索引,复杂查询会随数据增长急剧变慢。必须建立的索引包括:
(status, published_at) —— 查首页最新已发布文章 (category_id, status, published_at) —— 按分类筛选 + 时间排序 (slug) —— 单篇文章详情页精准查询(WHERE slug = 'xxx') (user_id, status) —— 后台查看某用户所有草稿/已发文章 全文索引(FULLTEXT)在 title 和 summary 上 —— 支持简单关键词搜索(注意:MySQL 全文索引对短词、停用词有限制,生产环境建议用 Elasticsearch 或 Meilisearch 替代)常用管理操作示例(SQL 片段)
后台管理中高频操作可直接用 SQL 快速实现:
批量下线一周前的草稿:UPDATE articles SET status = 3 WHERE status = 0 AND created_at 统计每个分类下的已发布文章数:
SELECT c.name, COUNT(a.id) FROM categories c LEFT JOIN articles a ON c.id = a.category_id AND a.status = 1 GROUP BY c.id; 查找带“MySQL”且未被删除的热门文章(按阅读量伪字段排序,假设你有 view_count 字段):
SELECT id, title, summary FROM articles WHERE status = 1 AND MATCH(title, summary) AGAINST('MySQL' IN NATURAL LANGUAGE MODE) ORDER BY view_count DESC LIMIT 10;
