Typecho 数据库设计

Typecho 是一个轻量级的 PHP 博客系统,其数据库设计简洁而强大。本文详细介绍 Typecho 的数据库表结构,方便开发者进行二次开发和主题定制。

设计理念

Typecho 的数据库设计遵循"精简而灵活"的原则:

  • 内容与项目抽象分离 - 通过关系表实现内容与分类/标签的多对多映射
  • 单表多用 - typecho_contents 表同时存储文章、页面、草稿、附件等多种内容类型
  • 最小冗余 - 仅在必要时(如 commentsNum)使用冗余字段提升查询性能
  • 灵活扩展 - 通过 typecho_fields 表支持主题自定义字段

数据库表概览

Typecho 1.2.1 使用 7 张核心表

表名 作用 记录数量级
typecho_contents 存储文章、页面、草稿、附件 主要数据
typecho_metas 存储分类、标签 少量
typecho_relationships 内容与分类/标签的关系 中等
typecho_comments 评论数据 较多
typecho_users 用户账户 极少
typecho_options 系统配置 极少
typecho_fields 自定义字段(主题扩展) 中等

1. typecho_contents(内容表)

核心表,存储所有内容数据(文章、页面、草稿、附件等)。

字段说明

字段 类型 说明 示例
cid INT 内容 ID(主键,自增) 42
title VARCHAR(200) 内容标题 "Typecho 使用指南"
slug VARCHAR(200) URL 缩略名(有索引) "typecho-guide"
created INT 创建时间(UNIX 时间戳) 1710935040
modified INT 修改时间(UNIX 时间戳) 1767081765
text LONGTEXT 内容正文(支持 Markdown) "<!--markdown-->## 标题\n内容..."
order INT 排序序号(用于页面排序) 0
authorId INT 作者 ID(外键 → users.uid) 1
template VARCHAR(32) 自定义模板文件名 "page-about.php"
type VARCHAR(16) 内容类型 "post" / "page" / "attachment"
status VARCHAR(16) 发布状态 "publish" / "draft" / "hidden"
password VARCHAR(32) 访问密码(加密内容) null 或加密字符串
commentsNum INT 评论数(冗余字段,提升性能) 15
allowComment CHAR(1) 是否允许评论 "1" / "0"
allowPing CHAR(1) 是否允许 Ping "1" / "0"
allowFeed CHAR(1) 是否允许聚合 "1" / "0"
parent INT 父内容 ID(用于附件关联) 0(独立内容)或父 ID
views INT 浏览次数(主题扩展字段) 1024
agree INT 点赞数(主题扩展字段) 42

type 字段详解

  • post - 文章
  • page - 独立页面
  • attachment - 附件(上传的文件)
  • draft - 草稿

text 字段说明

  • Typecho 使用 <!--markdown--> 标记区分 Markdown 和 HTML 内容
  • 正文内容直接存储在此字段中

索引策略

  • slug 字段有唯一索引,确保 URL 不重复
  • created 字段有索引,加速按时间排序查询

2. typecho_metas(项目表)

存储分类标签数据,支持分类层级。

字段说明

字段 类型 说明 示例
mid INT 项目 ID(主键,自增) 2
name VARCHAR(200) 项目名称 "技术"
slug VARCHAR(200) URL 缩略名(有索引) "tech"
type VARCHAR(32) 项目类型 "category" / "tag"
description VARCHAR(200) 项目描述 "技术相关文章"
count INT 关联内容数量(冗余字段) 15
order INT 排序序号 0
parent INT 父分类 ID(仅分类使用) 0(顶级)或父 mid

type 字段详解

  • category - 分类(支持多级,通过 parent 字段实现)
  • tag - 标签(扁平结构,parent 始终为 0)

分类层级示例

技术 (mid=2, parent=0)
  └── 嵌入式软件 (mid=12, parent=2)

索引策略

  • slug 字段有唯一索引

3. typecho_relationships(关系表)

实现内容与分类/标签多对多映射。

字段说明

字段 类型 说明 示例
cid INT 内容 ID(联合主键) 42
mid INT 项目 ID(联合主键) 2

设计说明

  • 使用 (cid, mid) 联合主键,防止重复关联
  • 一篇文章可以属于多个分类多个标签
  • 查询文章的分类:SELECT * FROM typecho_metas WHERE mid IN (SELECT mid FROM typecho_relationships WHERE cid=42)

示例数据

[3, 2]   // 文章3 → 分类"技术"
[3, 4]   // 文章3 → 标签"markdown"
[45, 2]  // 文章45 → 分类"技术"
[45, 13] // 文章45 → 标签"programming"

4. typecho_comments(评论表)

存储评论数据,支持嵌套评论

字段说明

字段 类型 说明 示例
coid INT 评论 ID(主键,自增) 1
cid INT 关联内容 ID(有索引) 42
created INT 评论时间(UNIX 时间戳) 1710935040
author VARCHAR(200) 评论者昵称 "张三"
authorId INT 评论者用户 ID(注册用户) 0(游客)或 uid
ownerId INT 内容作者 ID 1
mail VARCHAR(200) 评论者邮箱 "user@example.com"
url VARCHAR(200) 评论者网站 "https://example.com"
ip VARCHAR(64) 评论者 IP 地址 "192.168.1.1"
agent VARCHAR(200) 浏览器 User-Agent "Mozilla/5.0..."
text TEXT 评论内容 "写得很好!"
type VARCHAR(16) 评论类型 "comment"
status VARCHAR(16) 审核状态 "approved" / "waiting" / "spam"
parent INT 父评论 ID(支持嵌套) 0(顶级评论)或父 coid

嵌套评论示例

评论1 (coid=1, parent=0)
  └── 回复1-1 (coid=2, parent=1)
  └── 回复1-2 (coid=3, parent=1)
评论2 (coid=4, parent=0)

索引策略

  • cid 字段有索引,加速按文章查询评论

5. typecho_users(用户表)

存储博客用户账户信息。

字段说明

字段 类型 说明 示例
uid INT 用户 ID(主键,自增) 1
name VARCHAR(32) 用户名(唯一,用于登录) "admin"
password VARCHAR(64) 密码哈希(phpass 加密) "$P$B0ClG/Zyy..."
mail VARCHAR(200) 邮箱(唯一) "admin@example.com"
url VARCHAR(200) 个人网站 "https://example.com"
screenName VARCHAR(32) 显示昵称 "管理员"
created INT 注册时间(UNIX 时间戳) 1710935132
activated INT 激活时间(UNIX 时间戳) 1710935132
logged INT 最后登录时间(UNIX 时间戳) 1767096633
group VARCHAR(16) 用户组 "administrator" / "editor"
authCode VARCHAR(64) 登录验证码(Cookie 验证) "90130e1e544d..."

group 字段详解

  • administrator - 管理员(完全权限)
  • editor - 编辑(可发布文章)
  • contributor - 投稿者(提交草稿)
  • subscriber - 订阅者(仅评论)
  • visitor - 游客(仅浏览)

密码加密

Typecho 使用 phpass 算法($P$ 前缀)加密密码,不可逆。


6. typecho_options(配置表)

存储系统配置和用户偏好设置,支持用户级配置

字段说明

字段 类型 说明 示例
name VARCHAR(32) 配置项名称(主键) "theme"
user INT 所属用户 ID(主键) 0(全局)或 uid
value TEXT 配置值 "MWordStar"

配置示例

["theme", 0, "MWordStar"]       // 全局主题
["timezone", 0, "28800"]        // 时区(东八区)
["siteUrl", 0, "https://961118.xyz"]  // 网站地址
["title", 0, "我的博客"]         // 网站标题

设计说明

  • (name, user) 联合主键,支持全局配置和用户配置
  • user=0 表示全局配置
  • user>0 表示特定用户的配置

7. typecho_fields(自定义字段表)

主题扩展表,用于存储文章自定义字段(主题相关设置)。

字段说明

字段 类型 说明 示例
cid INT 关联内容 ID(联合主键) 42
name VARCHAR(200) 字段名(联合主键) "thumb"
type VARCHAR(8) 数据类型 "str" / "int" / "float"
str_value TEXT 字符串值 "https://example.com/cover.jpg"
int_value INT 整数值 0
float_value FLOAT 浮点数值 0.0

常见字段(MWordStar 主题)

字段名 类型 说明 默认值
headerImgDisplay str 头图显示模式 "default"
thumb str 文章缩略图 URL ""
summaryContent str 自定义摘要 ""
articleCopyright str 版权信息显示 "show"
keywords str SEO 关键词 ""
expired str 是否过期 "0"

设计说明

  • (cid, name) 联合主键,一篇文章可以有多个自定义字段
  • 使用三列存储str_value / int_value / float_value),根据 type 决定使用哪一列
  • 主题可以自由定义字段,不需要修改数据库结构

数据库关系图

typecho_users (uid)
    ↓
typecho_contents (cid, authorId)
    ↓                    ↓
typecho_comments    typecho_fields
    ↓
typecho_relationships (cid, mid)
    ↓
typecho_metas (mid)

参考资料

发表评论