WordPress数据库主要几张表的数据结构

WordPress使用的是MySQL数据库,安装时直接指定数据库信息即可,一般情况下无需维护,也无需了解数据表的结构。

导入导出数据使用后台自带的功能即可,但如果你像我一样需要往WordPress里导入其它系统的数据的话,就需要对它的数据库结构有个清晰的认识。

主要几张表:

  1. wp_posts 文章主表
  2. wp_post_meta 文章元数据,包括插件关联
  3. wp_terms Category和Tag
  4. wp_term_taxnomy 区分category和tag,其上级和其下的post数量
  5. wp_term_relationships 文章所使用的category和tag

逐个来说吧。

wp_posts

前面说了,它是文章主表。表结构如下

CREATE TABLE `wp_posts` (
  `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `post_author` bigint(20) unsigned NOT NULL DEFAULT '0',
  `post_date` datetime DEFAULT NULL,
  `post_date_gmt` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
  `post_content` longtext COLLATE utf8mb4_unicode_520_ci NOT NULL,
  `post_title` text COLLATE utf8mb4_unicode_520_ci NOT NULL,
  `post_excerpt` text COLLATE utf8mb4_unicode_520_ci NOT NULL,
  `post_status` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'publish',
  `comment_status` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'open',
  `ping_status` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'open',
  `post_password` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
  `post_name` varchar(200) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
  `to_ping` text COLLATE utf8mb4_unicode_520_ci NOT NULL,
  `pinged` text COLLATE utf8mb4_unicode_520_ci NOT NULL,
  `post_modified` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
  `post_modified_gmt` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
  `post_content_filtered` longtext COLLATE utf8mb4_unicode_520_ci NOT NULL,
  `post_parent` bigint(20) unsigned NOT NULL DEFAULT '0',
  `guid` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
  `menu_order` int(11) NOT NULL DEFAULT '0',
  `post_type` varchar(20) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'post',
  `post_mime_type` varchar(100) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
  `comment_count` bigint(20) NOT NULL DEFAULT '0',
  PRIMARY KEY (`ID`),
  KEY `post_name` (`post_name`(191)),
  KEY `type_status_date` (`post_type`,`post_status`,`post_date`,`ID`),
  KEY `post_parent` (`post_parent`),
  KEY `post_author` (`post_author`),
  FULLTEXT KEY `yarpp_title` (`post_title`),
  FULLTEXT KEY `yarpp_content` (`post_content`)
) ENGINE=InnoDB AUTO_INCREMENT=1250 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;

基本上从字面上就能看出字段是干嘛的,主要说下post_parentguidpost_name这三个。因为WordPress有保存历史版本的功能,所以一个post可能有多个版本,而post的第一个版本是主ID,假定为10,则其它版本的post_parent就是10,而guid则是版本链接。而post_name则是post的静态访问的链接,例如post_nametest-1,则它的访问链接则是http://www.your-domain.com/test-1.html,利于辨认,也利于SEO。

PS:为考虑兼容性,某些日期字段转了varchar。

wp_post_meta

文章元数据,是wp_posts的扩展表。DDL:

CREATE TABLE `wp_postmeta` (
  `meta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `post_id` bigint(20) unsigned NOT NULL DEFAULT '0',
  `meta_key` varchar(255) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL,
  `meta_value` longtext COLLATE utf8mb4_unicode_520_ci,
  PRIMARY KEY (`meta_id`),
  KEY `post_id` (`post_id`),
  KEY `meta_key` (`meta_key`(191))
) ENGINE=InnoDB AUTO_INCREMENT=7870 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;

它是一个简单的key-value类型的数据表,一个post对应多个meta.

wp_terms

Category和Tag都在这个表里,私以为不是很方便。DDL:

CREATE TABLE `wp_terms` (
  `term_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(200) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
  `slug` varchar(200) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
  `term_group` bigint(20) NOT NULL DEFAULT '0',
  PRIMARY KEY (`term_id`),
  KEY `slug` (`slug`(191)),
  KEY `name` (`name`(191))
) ENGINE=InnoDB AUTO_INCREMENT=149 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;

这个表也很简单,name是显示的名称,slug是出现在url中的名称。

wp_term_taxnomy

这个表是用来区分category和tag,其上级和其下的post数量,是wp_terms的扩展表。DDL:

CREATE TABLE `wp_term_taxonomy` (
  `term_taxonomy_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `term_id` bigint(20) unsigned NOT NULL DEFAULT '0',
  `taxonomy` varchar(32) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
  `description` longtext COLLATE utf8mb4_unicode_520_ci 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`)
) ENGINE=InnoDB AUTO_INCREMENT=149 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;

wp_term_relationships

这个表是用来记录post所使用的category和tag,是wp_postswp_terms的扩展表。

DDL:

CREATE TABLE `wp_term_relationships` (
  `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`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;

object_id就是post的ID,term_taxonomy_idwp_term_taxonomy表的ID,term_order用不到。

到这里我们可以看出,WordPress在Category和Tag表结构上的设计是不太合理的,主表本来就没多少信息,还扩展出来一个表,需要到扩展表里去获取到底是个Category还是Tag,所以多走了一步,个人认为没这个必要。但是WordPress好在有很多优秀的主题和插件,又对SEO比较友好,所以忍了吧。

Leave a Comment

豫ICP备19001387号-1