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 |
| 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..." |
| 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)