Работа с данными в WordPress. Часть 2: Отношения между данными

В первой части этой серии, посвященной данным в WordPress, мы рассмотрели таблицы базы данных, а также определились с тем, в каких таблицах какие данные хранятся. Во второй части этой серии мы посмотрим на то, как в WordPress реализованы отношения между этими данными.

Как вы увидите в дальнейшем, WordPress использует три типа отношений – «один-к-одному», «один-ко-многим» и «многие-ко-многим». Я рассмотрю каждый тип, а также объясню, как именно они работают в WordPress.

Отношения один-к-одному

Отношение один-к-одному – самое простое отношение из всех. Оно означает, что одна запись БД связана с одной и только одной другой. Такие данные обычно хранятся в одной таблице (но не всегда, о чем мы скажем позже в этом руководстве).

Примеры отношений «один-к-одному» в WordPress:

  • ID записи и контент записи
  • Заголовок записи и контент записи
  • ID записи и слаг записи
  • ID комментария и контент комментария
  • ID пользователя и имя пользователя

Список можно продолжить. Главный момент здесь – у любых двух записей БД, которые хранятся в разных полях в одной строке таблицы, имеется отношение «один-к-одному».

Отношения «один-к-одному» являются наименее интересным типом отношений в базе данных. Поэтому, чтобы избежать суматохи, давайте перейдем к следующему типу отношений, существующему в WordPress – «один-ко-многим».

Отношения «один-ко-многим»

Отношения «один-ко-многим» очень распространены в базах данных, и именно они делают БД более мощной, нежели простая «плоская» таблица, такая как CSS. Говорить о таких отношениях можно в том случае, если одна запись БД имеет связь более чем с одной другой записью БД.

В WordPress большинство связей «один-ко-многим» создаются по ссылке между двумя таблицами базы данных; для присоединения второй таблицы используется уникальный идентификатор. Так, к примеру, запись post_id будет уникальной для каждого поста, хранящегося в таблице wp_posts, однако также она будет использоваться в таблице wp_comments для идентификации того, к какой записи был оставлен каждый комментарий. Это означает, что каждое значение post_id будет представлено только один раз в таблице wp_posts, однако оно может фигурировать несколько раз – или вообще не фигурировать – в таблице wp_comments.

Некоторые другие примеры таких отношений в WordPress:

  • Записи и метаданные записей
  • Записи и пользователи
  • Пользователи и пользовательские метаданные
  • Таксономии и термы таксономии

Опять же, список можно продолжать. Поскольку это очень важная тема в WordPress, давайте посмотрим на отношения «один-ко-многим» более пристально.

Отношения «один-ко-многим», включающие записи

Таблица, которая связана с преобладающим большинством других таблиц – это wp_posts; большинство отношений, которые создают эти связи, являются отношениями «один-ко-многим».

Как вы можете видеть из диаграммы ниже, таблица wp_posts связана с четырьмя другими таблицами:

working-with

В дополнение к этому, посты могут также иметь отношения «один-ко-многим» с другими постами, реализованными в виде прикреплений или родительских страниц.

Давайте взглянем на эти отношения более пристально.

Записи-к-записям

Как было отмечено выше, данные, хранящиеся в таблице wp_posts, могут иметь отношения «один-ко-многим» с другими данными в той же самой таблице; однако такие отношения будут не между записями как таковыми, а между записями и прикреплениями или страницей и другими страницами. В конце концов, прикрепления и страницы – это типы записей.

Прикрепления, хранящиеся в таблице wp_posts, имеют запись в поле post_parent. Эта запись представляет собой ID поста, к которому и было добавлено прикрепление. Такое отношение является «один-ко-многим», поскольку у каждого прикрепления будет только один родитель, однако каждый пост может иметь сколь угодно много прикреплений. Это будет выполняться, даже если вы с помощью медиа-менеджера добавите прикрепление к другому посту – только пост, к которому изначально было добавлено прикрепление, будет храниться в базе данных в качестве его родителя.

Посты могут также иметь отношения «один-ко-многим» с другими постами, когда одна страница определена как родительская для другой. Запись сохраняется у дочерней страницы в поле post_parent – опять же, это будет post_id родительской страницы. Такое отношение является отношением «один-ко-многим», поскольку родительские страницы могут иметь много дочерних страниц, однако дочерние страницы имеют только одного родителя.

Размышляя о таких отношениях между записями, важно помнить, что при обработке данных в WordPress посты – это не всегда обычные посты, к которым мы привыкли. К ним можно отнести и страницы, и прикрепления, и другие типы записей – все они хранятся в таблице wp_posts.

Записи-к-метаданным записей

Метаданные записей хранятся в своей собственной таблице wp_postmeta. Эта таблица включает в себя четыре поля — post_id, meta_id, ключ и значение. Один пост может иметь сколько угодно много метаданных, связанных с ним, однако каждая запись БД с метаданными может быть связана только с одним постом.

Записи-к-комментариям

Комментарии также имеют свою собственную таблицу, wp_comments. Каждый комментарий связан только с одной записью, в то время как каждая запись может иметь много комментариев. Как в случае со всеми другими таблицами, связанными с wp_posts, поле post_id используется для ссылки (в поле comment_post_id таблицы wp_comments).

Таблица wp_comments имеет по умолчанию 15 полей, которые используются для хранения данных об авторе, о почтовом адресе автора, о комментарии и статусе его проверки. Также она связана с таблицей wp_users, что будет рассмотрено в следующем разделе.

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

Записи-к-пользователям

Каждый пост связывается с таблицей wp_users через запись user_id, которая хранится в поле post_author таблицы wp_posts. Это отношение «один-ко-многим», поскольку каждый пост имеет только одного автора, однако каждый пользователь может быть автором многих постов.

Отношения «один-ко-многим», не включающие записи

Есть также три отношения, которые являются отношениями «один-ко-многим», но не связаны с записями. Два из таких отношений включают в себя метаданные – отношения между комментариями и их метаданными и отношениями между пользователями и их метаданными.

Пользователи-к-метаданным пользователей

WordPress хранит дополнительные метаданные о пользователях в таблице wp_usermeta. Она обычно используется для нестандартных данных о пользователях, таких как метаданные о суперадминистраторах в мультисайтовой сборке или метаданные о цветовой схеме пользователя, которую он выбрал, если она отличается от стандартной.

Большинство данных о пользователях хранится в таблице wp_users. Две таблицы связаны между собой через поле user_id. Запись одного пользователя в таблице может иметь много метаданных, связанных с ней, в то время как каждый пункт метаданных применим только к одному пользователю.

Комментарии-к-метаданным комментариев

Опять же, большая часть данных о комментариях хранится в таблице wp_comments вместе с самими комментариями, однако таблица wp_commentmeta используется для сохранения дополнительных метаданных, таких как данные, созданные плагинами (к примеру, Akismet). Отношения такие же, как между пользователями и пользовательскими метаданными.

Комментарии-к-пользователям

Заключительный тип отношений «один-ко-многим» — это отношения между комментариями и пользователями. Таблица wp_comments включает в себя поле user_id, которое может использоваться для хранения пользовательского ID, когда зарегистрированный пользователь оставляет комментарий. Обратите внимание, что данное поле не является обязательным для сайтов, где пользователям не нужно входить под своим логином, чтобы оставить комментарий.

Отношения «многие-ко-многим»

Наконец, мы переходим к отношениям «многие-ко-многим», где многочисленные ссылки идут в обоих направлениях. Используется это отношение в WordPress только для термов таксономии (включая рубрики и метки, которые также являются простыми таксономиями). Один пост может иметь много термов, связанных с ним, и один терм может быть привязан к многочисленным записям.

Создается это отношение в WordPress через промежуточную таблицу, которая связывает две таблицы с ключевыми данными. Эта таблица называется wp_term_relationships, она связывает wp_posts с wp_term_taxonomy.

Примечание: эта таблица также связывает таблицу wp_links с wp_term_taxonomy, поскольку ссылки работают практически так же, как и посты – я расскажу об этом позже.

Объяснить это проще всего, посмотрев на крайние таблицы. Таблица wp_posts содержит данные о каждом посте, в то время как таблица wp_term_taxonomy содержит данные по каждому терму, включая таксономию, в которой он стоит, и его ID.

Чтобы создать ссылку между термом в таблице wp_term_taxonomy и постом в таблице wp_posts, WordPress создает запись в таблице wp_term_relationships, которая включает в себя post_id и the term_id (сохраняются как object_id и term_taxonomy_id соответственно в таблице wp_term_relationships). Это означает, что таблица wp_term_relationships может включать в себя многочисленные записи для каждого поста и многочисленные записи для каждого терма, создавая тем самым отношения «многие-ко-многим».

Диаграмма ниже иллюстрирует этот процесс:

posts-relationships

В примере выше посты имеют следующие термы:

  • Пост 1 имеет термы 1 и 3
  • Пост 2 имеет терм 2
  • Пост 3 имеет терм 4
  • Пост 4 имеет термы 1 и 3

Вы можете также посмотреть на это с другой стороны – к примеру, терм 3 связан с постами 1 и 4.

Однако на этом все не останавливается. Есть и четвертая таблица, wp_terms. Она содержит данные о каждом терме, включая название, слаг, описание для каждого терма. Каждый терм имеет только одну запись в таблице wp_terms, поэтому отношения между ней и таблицей wp_term_taxonomy является отношением «один-к-одному». В теории, нет никаких причин на то, чтобы эти данные не могли храниться в таблице wp_term_taxonomy, однако этого не происходит.

Примечание по ссылкам

Ссылки (блогролл) – возможность WordPress, которая сейчас не так заметна, как раньше. Фактически, начиная с версии 3.5, ссылки были отключены по умолчанию в консоли; однако у них есть своя собственная таблица wp_links.

Таблица напоминает собой wp_posts. В конце концов, ссылки – это тип контента, подобный записям, имеющий то же самое отношение «многие-ко-многим» с термами таксономии.

Заключение

Как мы видели, в WordPress используются многие отношения, позволяющие соединять данные в 10 из 11 таблиц БД. Единственная таблица, про которую я ничего не сказал – это таблица wp_options, поскольку она не соединена ни с какими другими таблицами и всего лишь хранит данные о сайте. Я раскрою ее чуть позже в этой серии статей.

Поняв, как работают отношения один-к-одному, один-ко-многим и многие-ко-многим, вы сможете идентифицировать пути управления вашими данными и создавать произвольные запросы к вашей теме и/или плагинам.

В следующей части этой серии мы рассмотрим типы контента более подробно, взглянем на типы контента, хранящиеся в базе данных WordPress, а также увидим сходства и различия между ними.

Источник: code.tutsplus.com

Блог про WordPress
Комментарии: 4
  1. Василий

    Спасибо за отличный перевод. Информации по устройству БД WordPress в рунете почти нет.

    Единственное замечание слово «attachments» я бы перевел как «вложения», а не «прикрепления». Но тут уже дело хозяйское :)

    1. Дмитрий (автор)

      Спасибо за замечание. В сети встречаются разные переводы, как «вложение», так и «прикрепление». Я думаю, суть тут ясна :) В любом случае, за фидбэк спасибо!

  2. Михаил

    Здравствуйте, а почему в phpmyadmin не отображаются связи между таблицами WordPress? И в дизайнере, и в структуре таблиц

    1. Дмитрий (автор)

      Посмотрите тут ответы. Есть несколько вариантов, что можно сделать:
      https://stackoverflow.com/questions/8420183/how-to-enable-relation-view-in-phpmyadmin
      Либо у вас уже есть Relation View, и его надо просто активировать, либо вам надо поменять storage engine на InnoDb (или попробовать на MyISAM), чтобы появился Relation View.

Добавить комментарий

Получать новые комментарии по электронной почте.