原文地址:http://qzone.qq.com/blog/54335020-1243501946

前段时间偶而发现blog的分类与标签乱了,好多标签本来都是C#的,发现全都变成C++了,而且点击C++之后,也没有找到一条数据,郁闷啊。网上搜索了一段时间,最后自己又搞了好长时间才解决,整理如下。
WordPress blog对分类与标签的设计,总共使用了四张表:
wp_posts:文章/页面数据表(所有的页面、文章以及自动保存的数据都保存在这里)
wp_terms:分类/标签表(所有的分类、标签都保存在这)
wp_term_relationships:文章<—>分类/标签关系表(每个文章与分类的对应关系,以及与标签的对应关系都保存在这里)
wp_term_taxonomy:分类/标签标识表(该表保存 wp_terms 表中的数据是分类还是标签)
对应关系:
wp_posts表的ID对应wp_term_relationships表中的object_id
wp_terms表的term_id对应wp_term_taxonomy表中的term_id
wp_term_relationships表中的term_taxonomy_id对应wp_term_taxonomy表中的term_taxonomy_id 
对于经常设计数据库的人来说,现在已经一目了然了,这样描述一下:
wp_posts <-> wp_term_relationships <-> wp_term_taxonomy <-> wp_terms
就是这样,wp_posts保存页面/文章,wp_terms保存分类/标签,而wp_term_relationships 仅仅保存的是wp_posts与wp_terms多对多的关系,真正区分分类与标签的保存在wp_term_taxonomy 表中。
后来,我先找wp_terms表中的C++和C#这两条记录(term_id分别为21、13),然后找wp_term_taxonomy 表中term_id为21的那条记录(此时term_taxonomy_id 为22),这里我把wp_term_taxonomy 中这条记录的term_id修改为13(C#的term_id)。这样重新回到页面,就完全可以了。
最后我发现,对分类和标签的命名,尽量不要使用英文标点符号,比如:#、++,如果非要这样,那我建议你使用中文状态下的#、++。