一文详解 WordPress 的分类模式设计:terms, term_taxonomy 和 term_relationships 表之间的关系

WordPress 2.3 版本之前文章只有分类的, 2.3 版本之后才增加了标签,所以可以说 WordPress 2.3 引入了新的分类模式,新的模式将取代 categories,post2cat 和 link2cat 这三个数据表,并引进三个新的更灵活的数据表:termsterm_taxonomyterm_relationships 表。

terms 表

第一个是 terms 表,它保存 term 的基本信息。

term_id bigint(20) unsigned NOT NULL auto_increment,
name varchar(200) NOT NULL default '',
slug varchar(200) NOT NULL default '',
term_group bigint(10) NOT NULL default 0,
PRIMARY KEY (term_id),
KEY slug (slug($max_index_length)),
KEY name (name($max_index_length))
字段 描述
term_id term 的唯一 ID
name term 的名字
slug 用于 URL 中,使得 URL 更加友好
term_group 用于把相似的 terms 集合在一起

term_taxonomy 表

一个 term 不能由它自己决定是 category(分类)还是 tag(标签),它必须通过 term_taxonomy 这个数据表来决定:

term_taxonomy_id bigint(20) unsigned NOT NULL auto_increment,
term_id bigint(20) unsigned NOT NULL default 0,
taxonomy varchar(32) NOT NULL default '',
description longtext NOT NULL,
parent bigint(20) unsigned NOT NULL default 0,
count bigint(20) NOT NULL default 0,
PRIMARY KEY (term_taxonomy_id),
UNIQUE KEY term_id_taxonomy (term_id,taxonomy),
KEY taxonomy (taxonomy)
字段 描述
term_taxonomy_id term+taxonomy 对的唯一 ID
term_id terms 表外键 ID
taxonomy 指定了 term 属于什么分类模式,默认的分类模式有 “category”,“link_category” 和 “post_tag”。
parent 指定 terms 在 taxonomy 中层次关系
description 指定 term 在 taxonomy 中定义的描述
count 记录在每个 term+taxonomy 对中有多个对象,比如 taxonomy 为 “category”,则 count 记录了有多少篇文章在这个分类中。

term_relationships 表

最后一个表 table,term_relationships,把如 posts 和 links 这些对像和 term_taxonomy 表中的 term_taxonomy_id 联系起来。

object_id bigint(20) unsigned NOT NULL default 0,
term_taxonomy_id bigint(20) unsigned NOT NULL default 0,
term_order int(11) NOT NULL default 0,
PRIMARY KEY (object_id,term_taxonomy_id),
KEY term_taxonomy_id (term_taxonomy_id)
字段 描述
object_id post 或者 link 的 ID
term_taxonomy_id 来自 term_taxonomy 表的外键 ID
term_order 指定了显示的顺序

拆分共享

新的分类模式模式和 Taxonomy API 的灵活性意味着插件能够能够非常容易增加新的分类模式和对象类型,甚至不同的分类模式可以共享 term,WordPress 4.2 之前确实是这样做的,支持不同的分类模式共享一个 term,比如同时有一个「使用技巧」的标签和分类,他们使用同一个 term。

但是这样设计很大的问题,因为在分类编辑页面,把「使用技巧」改成「WP使用技巧」,然后标签「使用技巧」也跟着改了。

这样是不是最好的设计,肯定不是,所以 WordPress 4.2 之后这个共享机制就取消了,不允许共享了,现在同时有一个「使用技巧」的标签和分类,他们不是同一个 term,会生成两个term。

所以如果某种程度上说,term 和 term_taxonomy 表是一一对应了,他们其实可以合并成一个表,但是 WordPress 为了考虑兼容问题就保留下来,看看 WordPress 的发展历程,和设计的修改,其实对我们自己设计一些系统是很有帮助的。


©我爱水煮鱼,本站推荐使用的主机:阿里云,国外主机建议使用BlueHost

本站长期承接 WordPress 优化建站业务,请联系微信:「chenduopapa」。