Серверная (www.it-simple.ru)

Структура базы данных MySQL движка WordPress


P.P.S. Статья была написана для вордпресса версии 2.5.х. Впоследствии структура базы изменилась, хотя и незначительно.

P.S. Как оказалось, полную документацию по строению базы данных движка можно подчерпнуть здесь: http://codex.wordpress.org/Database_Description (http://codex.wordpress.org/Database_Description), но она на английском. С другой стороны, «ручной» разбор базы принёс бесценный опыт, плюс ко всему, моя схема мне нравится больше и вмещается на экран :)

Все данные блога WordPress хранятся всего в десяти таблицах.

На схеме показаны не все связи, а только важнейшие из них. Например, польза от таблицы links очень сомнительна, поэтому её взаимодействие с другими объектами даже не рассматривалось.

Имя таблицыОписание
postsОсновная таблица в базе. Здесь хранятся все статьи (заголовок, содержимое) и их служебная информация (дата создания, автор, тип и т.д.).
postmeta (#postmeta)Дополнительные данные к статье, которые не попадают в стандартные поля таблицы posts.
users (#users)Данные о пользователях: как об авторах статей, так и о пользователях с возможностью их комментирования
usermeta (#usermeta)Дополнительные поля для описания пользователей, дополнение к таблице users.
comments (#comments2322)Здесь хранятся все комментарии для всех статей.
terms (#terms)Простой список рубрик, к которым статья может относиться. Немного служебной информации о рубриках.
term_taxonomy (#term_taxonomy)В этой таблице рубрики систематизируются, то есть она служит для создания дерева рубрик.
term_relationships (#term_relationships)Здесь задаётся соответствие статьи и рубрики (вернее, элементу дерева рубрик из таблицы term_taxonomy), к которой статья относится.
links (#links)Ссылки и вся по ним информация.
options (#options)Общие настройки движка WordPress.

Остановимся на каждой из таблиц подробнее. Для того, чтобы анализировать содержимое таблиц - подключимся к нужной базе:

mysql -u user -h host -p database

если нужно - выберем кодировку для содержимого (у меня это UTF-8):

mysql> set names utf8;

после чего просматривать таблицы можно будет с помощью простых запросов, наподобие:

mysql> SELECT * FROM posts LIMIT 10;

posts

Таблица для хранения записей, черновиков и библиотеки медиафайлов (!), включая изображения.

Код для создания таблицы в MySQL:

CREATE TABLE `posts` (
  `ID` bigint(20) unsigned NOT NULL auto_increment,
  `post_author` bigint(20) unsigned NOT NULL default '0',
  `post_date` datetime NOT NULL default '0000-00-00 00:00:00',
  `post_date_gmt` datetime NOT NULL default '0000-00-00 00:00:00',
  `post_content` longtext NOT NULL,
  `post_title` text NOT NULL,
  `post_category` int(4) NOT NULL default '0',
  `post_excerpt` text NOT NULL,
  `post_status` varchar(20) NOT NULL default 'publish',
  `comment_status` varchar(20) NOT NULL default 'open',
  `ping_status` varchar(20) NOT NULL default 'open',
  `post_password` varchar(20) NOT NULL default '',
  `post_name` varchar(200) NOT NULL default '',
  `to_ping` text NOT NULL,
  `pinged` text NOT NULL,
  `post_modified` datetime NOT NULL default '0000-00-00 00:00:00',
  `post_modified_gmt` datetime NOT NULL default '0000-00-00 00:00:00',
  `post_content_filtered` text NOT NULL,
  `post_parent` bigint(20) unsigned NOT NULL default '0',
  `guid` varchar(255) NOT NULL default '',
  `menu_order` int(11) NOT NULL default '0',
  `post_type` varchar(20) NOT NULL default 'post',
  `post_mime_type` varchar(100) NOT NULL default '',
  `comment_count` bigint(20) NOT NULL default '0',
  PRIMARY KEY  (`ID`),
  KEY `post_name` (`post_name`),
  KEY `type_status_date` (`post_type`,`post_status`,`post_date`,`ID`),
  KEY `post_parent` (`post_parent`)
)

Содержимое таблицы

ПолеОписание
IDИдентификатор записи, он же первичный ключ. Значения - от 1 до 263-1. Максимальное значение ячейки записывается 20-разрядным числом.
post_authorАвтор статьи, который задаётся идентификатором ID таблицы users.
post_dateДата публикации, время - местное.
post_date_gmtДата публикации, время - по гринвичу.
post_contentСодержимое статьи. При сохранении и выводе на страницу это содержимое проходит через вордпрессовский фильтр замен, именно поэтому часто на экране можно увидеть совсем не то, что мы вводили.
post_titleЗаголовок статьи или имя для изображения в библиотеке медиафайлов (да-да, изображения, вернее ссылки на них, тоже хранятся в этой таблице). Интересно, хоть кто-то придумал заголовок максимальной длины, в 65535 символов?
post_categoryВсегда равен 0.
post_excerptКраткая выдержка, информация о записи (цитата). Надо вводить самостоятельно, по умолчанию отсутствует.
post_statusСтатус записи. Лично я встретил такие: publish - опубликованная, draft - черновик, inherit - связанная (например, изображение или резервная копия записи).
comment_statusВключена ли возможность комментирования. open - можно комментировать, closed - нельзя.
ping_statusРазрешены ли обратные ссылки и уведомления. Значения - open и closed
post_passwordПароль в явном виде, если статья запаролирована. В противном случае - нет значения.
post_nameИмя страницы для статичной ссылки. Записи автосохранения и изменения задают это имя автоматом.
to_ping
pinged
post_modifiedДата последнего изменения.
post_modified_gmtТо же самое - по гринвичу.
post_content_filtered
post_parentДля резервных копий и изображений - ID родительской записи.
guidПолная интернет-ссылка на запись (объект). Здесь вордпресс проявляет всю свою фантазию. На «статические» страницы даёт php-запрос типа ..?page_id=N, на автосейвы - с датой в URL-е, и т.д.
menu_orderРавен 0.
post_typeТип записи: post - обычная запись, page - запись с постоянной ссылкой (статичная), revision - автосохранение, attachment - медиафайл (например, изображение).
post_mime_typeЯкобы тип содержимого записи. Важен и нужен только для прикреплений (например, png-изображение проходит как image/png).
comment_countКоличество комментов к записи.

postmeta

Аппендикс для таблицы posts. Вдруг авторы не предусмотрели всего, что хотели в неё напихать.

Код для создания таблицы в MySQL:

CREATE TABLE `postmeta` (
  `meta_id` bigint(20) unsigned NOT NULL auto_increment,
  `post_id` bigint(20) unsigned NOT NULL default '0',
  `meta_key` varchar(255) default NULL,
  `meta_value` longtext,
  PRIMARY KEY  (`meta_id`),
  KEY `post_id` (`post_id`),
  KEY `meta_key` (`meta_key`)
)

Содержимое таблицы

ПолеОписание
meta_idПервичный ключ.
post_idК какой записи таблицы posts относятся наши метаданные.
meta_keyИмя дополнительного параметра. Часто используется для прикреплений файлов и других метаданных к статье.
meta_valueЗначение дополнительного параметра. Содержимое зависит от имени параметра.

Вордпресс достаточно яростно использует эту таблицу, так что если захотите от неё избавиться - внимательно смотрите какие функции её используют, какие параметры в ней хранятся и для чего.

users

Здесь хранятся пользователи блога: как честный автор, так и простые посетители, зарегистрировавшиеся для комментариев.

Код для создания таблицы в MySQL:

CREATE TABLE `users` (
  `ID` bigint(20) unsigned NOT NULL auto_increment,
  `user_login` varchar(60) NOT NULL default '',
  `user_pass` varchar(64) NOT NULL default '',
  `user_nicename` varchar(50) NOT NULL default '',
  `user_email` varchar(100) NOT NULL default '',
  `user_url` varchar(100) NOT NULL default '',
  `user_registered` datetime NOT NULL default '0000-00-00 00:00:00',
  `user_activation_key` varchar(60) NOT NULL default '',
  `user_status` int(11) NOT NULL default '0',
  `display_name` varchar(250) NOT NULL default '',
  PRIMARY KEY  (`ID`),
  KEY `user_login_key` (`user_login`),
  KEY `user_nicename` (`user_nicename`)
)

Содержимое таблицы

ПолеОписание
IDИдентификатор, первичный ключ.
user_loginИмя пользователя для входа.
user_passПароль пользователя для входа, в зашифрованном виде.
user_nicenameКак обращаться к пользователю. Как правило, совпадает с именем для входа.
user_emailЭлектропочта для связи.
user_urlАдрес сайта пользователя. Именно благодаря этому очень нужному полю, блоги на вордпрессе с настройками по умолчанию потихоньку обрастают спамом.
user_registeredДата регистрации пользователя.
user_activation_keyАктивационный ключ, рандомный. После активации удаляется.
user_status
display_nameИмя для отображения.

usermeta

Игнорируя существование таблицы users, все относящиеся к пользователю данные хранятся здесь.

Код для создания таблицы в MySQL:

CREATE TABLE `usermeta` (
  `umeta_id` bigint(20) unsigned NOT NULL auto_increment,
  `user_id` bigint(20) unsigned NOT NULL default '0',
  `meta_key` varchar(255) default NULL,
  `meta_value` longtext,
  PRIMARY KEY  (`umeta_id`),
  KEY `user_id` (`user_id`),
  KEY `meta_key` (`meta_key`)
)

Содержимое таблицы

ПолеОписание
umeta_idИдентификатор метазаписи, первичный ключ.
user_idИдентификатор пользователя, к которому имеет отношение запись.
meta_keyДополнительный параметр. Вот здесь - внимание! Дополнительными параметрами считаются: nickname - как пользователь отображается в системе, first_name - реальное имя пользователя, description - описание. И многое другое, что можно было бы использовать в таблице users.
meta_valueЗначение дополнительного параметра.

comments

Код для создания таблицы в MySQL:

CREATE TABLE `comments` (
  `comment_ID` bigint(20) unsigned NOT NULL auto_increment,
  `comment_post_ID` bigint(20) unsigned NOT NULL default '0',
  `comment_author` tinytext NOT NULL,
  `comment_author_email` varchar(100) NOT NULL default '',
  `comment_author_url` varchar(200) NOT NULL default '',
  `comment_author_IP` varchar(100) NOT NULL default '',
  `comment_date` datetime NOT NULL default '0000-00-00 00:00:00',
  `comment_date_gmt` datetime NOT NULL default '0000-00-00 00:00:00',
  `comment_content` text NOT NULL,
  `comment_karma` int(11) NOT NULL default '0',
  `comment_approved` varchar(20) NOT NULL default '1',
  `comment_agent` varchar(255) NOT NULL default '',
  `comment_type` varchar(20) NOT NULL default '',
  `comment_parent` bigint(20) unsigned NOT NULL default '0',
  `user_id` bigint(20) unsigned NOT NULL default '0',
  PRIMARY KEY  (`comment_ID`),
  KEY `comment_approved` (`comment_approved`),
  KEY `comment_post_ID` (`comment_post_ID`),
  KEY `comment_approved_date_gmt` (`comment_approved`,`comment_date_gmt`),
  KEY `comment_date_gmt` (`comment_date_gmt`)
)

Содержимое таблицы

ПолеОписание
comment_IDИдентификатор комментария, первичный ключ.
comment_post_IDИдентификатор заметки, к которой относится комментарий.
comment_authorАвтор, берётся из регистрационных данных или вводится вручную, если регистрация для комментариев не требуется.
comment_author_emailЭлектропочта.
comment_author_urlСайт автора комментария.
comment_author_IPIP-адрес прокомментировавшего.
comment_dateДата и время.
comment_date_gmtДата и время - по гринвичу.
comment_contentСам комментарий.
comment_karma
comment_approvedОдобрен ли комментарий для показа.
comment_agentС какого браузера и системы заходили.
comment_type
comment_parentРодительский коммент. Нужен для древовидной структуры.
user_idИдентификатор зарегистрированного пользователя.

terms

Описание рубрик.

Код для создания таблицы в MySQL:

CREATE TABLE `terms` (
  `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`),
  UNIQUE KEY `slug` (`slug`),
  KEY `name` (`name`)
)

Содержимое таблицы

ПолеОписание
term_idИдентификатор.
nameНазвание рубрики. Название используется для определения рубрики практически везде, например, под записью или в виджете рубрик.
slugЯрлык рубрики. «Ярлык» — это вариант названия, подходящий для URL. Обычно содержит только латинские буквы в нижнем регистре, цифры и дефисы.
term_group

term_taxonomy

Таблица для объединения рубрик в деревья и для описания взаимосвязей рубрик.

Код для создания таблицы в MySQL:

CREATE TABLE `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_idИдентификатор рубрики.
taxonomycategory - рубрика, link_category - рубрика ссылок.
descriptionКраткое описание.
parentИдентификатор родительской рубрики.
countКоличество ассоциированных записей.

term_relationships

Таблица для связи статьи с рубриками.

Код для создания таблицы в MySQL:

CREATE TABLE `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`)
)

Содержимое таблицы

ПолеОписание
object_idКакой объект описываем.
term_taxonomy_idС какой связью рубрик ассоциируем.
term_order

links

Таблица ссылок. Задумка неплохая, но как же похабно она реализована по умолчанию.

Код для создания таблицы в MySQL:

CREATE TABLE `links` (
  `link_id` bigint(20) unsigned NOT NULL auto_increment,
  `link_url` varchar(255) NOT NULL default '',
  `link_name` varchar(255) NOT NULL default '',
  `link_image` varchar(255) NOT NULL default '',
  `link_target` varchar(25) NOT NULL default '',
  `link_category` bigint(20) NOT NULL default '0',
  `link_description` varchar(255) NOT NULL default '',
  `link_visible` varchar(20) NOT NULL default 'Y',
  `link_owner` bigint(20) unsigned NOT NULL default '1',
  `link_rating` int(11) NOT NULL default '0',
  `link_updated` datetime NOT NULL default '0000-00-00 00:00:00',
  `link_rel` varchar(255) NOT NULL default '',
  `link_notes` mediumtext NOT NULL,
  `link_rss` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`link_id`),
  KEY `link_category` (`link_category`),
  KEY `link_visible` (`link_visible`)
)

options

Общие настройки движка WordPress

Код для создания таблицы в MySQL:

CREATE TABLE `options` (
  `option_id` bigint(20) unsigned NOT NULL auto_increment,
  `blog_id` int(11) NOT NULL default '0',
  `option_name` varchar(64) NOT NULL default '',
  `option_value` longtext NOT NULL,
  `autoload` varchar(20) NOT NULL default 'yes',
  PRIMARY KEY  (`option_id`,`blog_id`,`option_name`),
  KEY `option_name` (`option_name`)
)

Данные в этой таблице не связаны с данными из других таблиц и служат для настройки блога в целом. Описывать столбцы подробно нет смысла.