У першій статті циклу «Дані в WordPress» я привела оглядові відомості про використання реляційних баз даних у WordPress: які таблиці використовуються, і які вони зберігають. У цій статті я детальніше розповім про те, як WordPress керує відносинами між таблицями.

Відповідно до теорії реляційних баз даних, WordPress використовує три види відносин: «один до одного», «один до багатьох» і «багато до багатьох». Я покажу кожен вид відносини на прикладі його використання в реальному WordPress-сайті.

Один до одного

Відношення «один до одного» – найпростіший вид відносин. Він означає, що дане поле відповідає якому-небудь іншому єдиного поля. Зазвичай дані, що співвідносяться таким чином, зберігаються в одній таблиці (хоча бувають і винятки, про які ми поговоримо пізніше).

Приклади зв’язків «один до одного»:

  • ідентифікатор публікації і вміст поста;
  • заголовок і текст публікації;
  • ідентифікатор публікації і його слаг;
  • ідентифікатор коментаря та вміст коментаря;
  • ідентифікатор користувача і його ім’я…

Цей список можна продовжувати і далі, але суть цих прикладів, я думаю, вже зрозуміла: відношення будь-яких даних, що знаходяться в різних полях одного рядка таблиці, що є відношенням «один до одного».

Відношення «один до одного» – найменш цікавий вид відносин даних, тому давайте розглянемо такий тип відносин, який інтенсивно використовується в архітектурі даних WordPress – «один до багатьох».

Один до багатьох

Відношення «один до багатьох» дуже часто використовується в реальних базах даних. Зрештою, це саме те, що робить RDBMS корисніше, ніж «плоскі» електронні таблиці. Таке ставлення виникає, коли одного запису відповідає кілька інших.

В базі даних WordPress відносини «один до багатьох» реалізуються у вигляді зв’язку між двома таблицями з використанням спеціального унікального ідентифікатора.

Наприклад, поле post_id є унікальним ідентифікатором публікації в таблиці wp_posts, але воно також використовується в таблиці wp_comments, щоб визначити, до якої публікації відносяться коментарі.

Це означає, що якщо дане значення поля post_id зустрічається в wp_posts тільки одного разу, то в wp_comments воно може зустрітися кілька разів або не зустрітися взагалі.

Інші приклади відношення «один-до-багатьом» в WordPress:

  • публікація і метадані публікації;
  • публікація і користувач;
  • користувач та метадані користувача;
  • таксономія і терм таксономії…

… і так далі. Оскільки відносини «один до багатьох» дуже важливі для функціонування сайту, розглянемо їх трохи докладніше.

Відношення «один до багатьох», що включають публікації

Таблиця wp_posts пов’язана з найбільшою кількістю інших таблиць, і більшість цих зв’язків є відносинами типу «один до багатьох».

На діаграмі, наведеній нижче, ви можете бачити, що таблиця wp_posts безпосередньо пов’язана з чотирма іншими таблицями:

Крім того, публікації можуть бути зв’язані відношеннями «один-до-багатьох» з іншими публікаціями у формі батьківських-дочірніх зв’язків або як вкладення.

Розглянемо ці відносини ще ближче.

Відносини «публікація-публікація»

Як я вже говорила, записи, що зберігаються в таблиці wp_posts, можуть співвідноситися по типу «один до багатьох» з іншими записами цієї ж таблиці. Це, однак, стосунки між тим, що ми звикли називати посадами, а між публікацією та вкладеннями або між різними сторінками. Вкладення і сторінки відносяться до того самого типу даних, що і пости.

Вкладення, що зберігається в таблиці wp_posts, має поле post_parent, в якому зберігається ідентифікатор публікації, в яку вкладено це вкладення. (Вибачте за тавтологію).

Це типовий приклад зв’язків «один до багатьох», тому що вкладення може бути вкладено тільки в один пост, в той час як пост може мати скільки завгодно вкладень.

Це стосується і того випадку, коли ви використовуєте медіа-менеджер, щоб додати медиафайл до публікації: поле post_parent буде посилатися на той пост, на який цей файл був вкладений вперше.

Ті ж відносини виникають між публікаціями, що представляють собою сторінки сайту. У цьому випадку в полі post_parent даної сторінки так само зберігається post_id тієї сторінки, яка на неї посилається.

Це теж типовий випадок зв’язків «один до багатьох», так як одна сторінка може мати скільки завгодно дочірніх сторінок, але сторінка верхнього рівня для даної сторінки може бути тільки одна.

Говорячи про відносини між публікаціями, важливо пам’ятати, що публікація – це не тільки те, що виглядає для відвідувача сайту як публікація. Публікаціями є також сторінки, вкладення та інші типи даних, що зберігаються в таблиці wp_posts.

«Публікація-метадані публікації»

Метадані публікацій зберігаються в спеціальній таблиці wp_postmeta. Ця таблиця має всього 4 колонки: ідентифікатор публікації (post_id), ідентифікатор елемента метаданих (meta_id), ключ і значення.

Публікація може мати будь-яку кількість метаданих, але кожен елемент метаданих може ставитися тільки до однієї публікації.

«Публікація-коментарі»

Коментарі також зберігаються в окремій таблиці під назвою wp_comments. Кожен коментар відноситься до певного посаді, в той час як пост може мати будь-яку кількість коментарів. Таблиця коментарів має поле, яке містить ідентифікатор публікації. Це поле називається comment_post_id і пов’язане з полем post_id таблиці wp_posts.

Таблиця коментарів досить широка: вона має за умовчанням 15 полів і зберігає дані про автора коментаря, спосіб зв’язку з ним, текст коментаря і статус схвалення коментаря автором посту. Також записи в таблиці коментарів можуть бути пов’язані з записами в таблиці користувачів – wp_users. Ми ще згадаємо про це в наступній частині нашої статті.

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

«Публікації-користувач»

Кожна публікація прив’язана до таблиці wp_users допомогою поля post_author в таблиці wp_posts. Це відношення типу «один до багатьох»: у публікації може бути тільки один автор, а от користувач може бути автором будь-якого числа публікацій.

Відношення «публікації-користувач» відрізняється від відносин, що зв’язують публікації з метаданими або коментарями. Тому для зв’язку використовуються різні поля: user_id замість post_id в попередніх випадках.

Відношення «один до багатьох», що не включають публікації

Є також три важливих зв’язку, організовані за принципом «один до багатьох», але не стосуються таблиці публікацій. Дві з них мають відношення до метаданих.

«Користувач-метадані користувача»

WordPress зберігає додаткові дані (дані про дані, або метадані), що стосуються користувачів у таблиці wp_usermeta. Там зберігається, наприклад, інформація про супер адміністраторах в мультисайтовых інсталяціях WordPress, про інтерфейсу колірному оформленні і т. д.

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

«Коментар-метадані коментаря»

Повторюся: багато інформації щодо коментарів зберігаються в одній таблиці – wp_comments. Але є також і метадані, які зберігаються окремо в таблиці wp_commentmeta. В ній, наприклад, зберігає свої дані популярний антиспам плагін Akismet. Відношення між таблицями таке ж, що і в попередньому прикладі.

«Коментарі-користувач»

Останнє, про що ми хочемо тут поговорити – відношення між коментарями і користувачами. Таблиця wp_comments має поле user_id, яке зберігає ідентифікатор користувача в тому випадку, якщо коментар залишив користувач, авторизовавшийся на сайті через систему безпеки WordPress.

Врахуйте, що це поле не є обов’язковим, так як на сайтах може використовуватися анонімне коментування або інші механізми авторизації.

Відношення «багато до багатьох»

Цей тип відносин являє собою варіант зв’язків «один до багатьох», коли зв’язок може бути повернена в обидві сторони. Таке ставлення використовується в WordPress лише один раз, для роботи таксономії (категорії і теги також є термами таксономії). Одна публікація може мати кілька термів, так само як і один терм може бути використаний в декількох публікаціях.

Як і багато інші програми, WordPress реалізує дане відношення через додаткову внутрішню таблицю, що зв’язує ключовим полем дві інші таблиці. Ця внутрішня таблиця називається wp_term_relationships, і вона пов’язує таблицю wp_posts з таблицею wp_term_taxonomy.

(Також ця таблиця використовується для зв’язку wp_links з wp_term_taxonomy, так як в цьому плані посилання ведуть себе так само, як пости. Про посилання буде розказано трохи пізніше).

Відношення «багато до багатьох» простіше всього зрозуміти, поглянувши на структуру таблиць, про які ми говоримо. Таблиця wp_posts зберігає публікації, а wp_term_taxonomy – окремі терми, включаючи ідентифікатор терма та інформацію про те, в якій довідник він входить.

Щоб пов’язати ці таблиці, WordPress створює запис в таблиці wp_term_relationships. Ця запис містить два посилання: id поста (post_id) в поле object_id і ідентифікатор терма (term_id) в поле term_taxonomy_id.

Таблиця може містити безліч записів, що відносяться до однієї публікації, і безліч записів, що відносяться до одного терму, отже, вона реалізує відношення «багато до багатьох».

Наступна діаграма наочно показує описаний механізм:

Основи використання реляційних даних в WordPress

Зміст прикладу наступне:

  • пост 1 містить терми 1 і 3;
  • пост 2 містить терм 2;
  • пост 3 містить терм 4;
  • пост 4 містить терми 1 і 3.

Зрозуміло, ці відносини можна описувати і у зворотному порядку, наприклад: терм 3 відноситься до постам 1 і 4, і т. д.

Але співвідношення між даними на цьому не кінчаються. Є і четверта таблиця, wp_terms. Вона містить такі відомості про термах, як ім’я, слаг і опис. Кожному терму відповідає лише одна запис в wp_terms, так що таблиці wp_term_taxonomy і wp_terms співвідносяться як «один до одного».

Теоретично, немає причин тримати всі ці дані в різних таблицях, але на практиці на проектування бази даних впливають також міркування швидкодії.

Зауваження про посилання

«Посилання» (блозі) – функція WordPress, яка зараз далеко не так затребувана, як раніше. Фактично, починаючи з версії WordPress 3.5, ця функція відключена за замовчуванням. Тим не менш, окрема таблиця посилань, wp_links, ще присутній в базі даних WordPress.

Таблиця посилань схожа на таблицю посад wp_posts, що цілком природно, так як пости і посилання – контент одного порядку. Посилання мають ті ж відносини «багато до багатьох» з термами таксономії.

Висновки

Як ви могли переконатися, WordPress використовує різні типи відносин між даними в 10 з 11 таблиць своєї бази даних. Одинадцята таблиця – wp_options – досі не була згадана мною, оскільки дані в ній не пов’язані ні з якими іншими. Ця таблиця зберігає дані про сайт, а не його вміст. В інший раз ви дізнаєтеся про неї більше.

Розуміння співвідношень між даними в WordPress допоможе вам ефективно використовувати базу даних і створювати власні запити до неї при розробці тем і плагінів.

В наступних статтях цієї серії я розповім докладніше про типи контенту, що зберігається в базі даних WordPress, про загальних рисах і відмінностях між ними.

Переклад статті «Understanding and Working with Relationships Between Data in WordPress» був підготовлений дружною командою проекту Сайтостроение від А до Я.