Таблица taxonomy_term_hierarchy
Таблица taxonomy_term_hierarchy является ключевой для организации иерархических связей между терминами словарей таксономии в Drupal. Она позволяет создавать многоуровневые структуры терминов, где каждый термин может иметь родительский термин (или несколько родителей), формируя тем самым деревья.
Поля
| Поле | Тип данных | Описание |
|---|---|---|
tid |
int |
Идентификатор термина (taxonomy_term_data.tid). Первичный ключ, который также является внешним ключом, связывающим эту таблицу с основной таблицей терминов.
|
parent |
int |
Идентификатор родительского термина (taxonomy_term_data.tid). Значение 0 означает, что у термина нет родителя (он находится на верхнем уровне иерархии). Если термин имеет несколько родителей, для него будет создано несколько записей в этой таблице.
|
Как это работает
Каждая запись в таблице представляет собой связь ⁅i⁆ребенок-родитель⁅/i⁆. Поле tid содержит идентификатор дочернего термина, а поле parent - идентификатор его родителя. Если для одного и того же tid существует несколько записей с разными значениями parent, это означает, что термин имеет нескольких родителей (полииерархия).
Термины, у которых значение parent равно 0, считаются корневыми элементами своих иерархий. Модуль Таксономия использует эти данные для построения деревьев терминов, которые отображаются в виде вложенных списков при выборе терминов для материала, в административном интерфейсе для управления терминами, а также при отображении таксономии на сайте.
Важно отметить, что сама таблица не хранит информацию о том, к какому словарю (vocabulary) принадлежит термин. Эта информация хранится в таблице taxonomy_term_data в поле vid. Иерархия строится в рамках одного словаря, кросс-словарные родительско-дочерние связи невозможны.
При удалении термина все связанные с ним записи в этой таблице (как где он является родителем, так и где он является ребенком) удаляются автоматически для поддержания целостности данных.
Пример SQL-запроса
Получить всех непосредственных потомков (детей) для термина с ID 5 можно следующим запросом:
SELECT th.tid, td.name
FROM taxonomy_term_hierarchy th
INNER JOIN taxonomy_term_data td ON th.tid = td.tid
WHERE th.parent = 5
ORDER BY td.weight, td.name;
Получить полный путь (цепочку родителей) для термина с ID 12 можно с использованием рекурсивного запроса (если СУБД поддерживает эту функцию, например, PostgreSQL с WITH RECURSIVE):
WITH RECURSIVE term_tree AS (
SELECT tid, parent, CAST(name AS TEXT) AS path
FROM taxonomy_term_data td
INNER JOIN taxonomy_term_hierarchy th ON td.tid = th.tid
WHERE th.tid = 12
UNION ALL
SELECT td.tid, th.parent, CAST(td.name || ' › ' || tt.path AS TEXT)
FROM taxonomy_term_data td
INNER JOIN taxonomy_term_hierarchy th ON td.tid = th.tid
INNER JOIN term_tree tt ON th.tid = tt.parent
)
SELECT path FROM term_tree WHERE parent = 0;
Смотрите также
-
таблицу
taxonomy_term_data,
которая хранит основные данные терминов таксономии -
таблицу
taxonomy_index,
которая индексирует связи терминов с материалами -
таблицу
taxonomy_vocabulary,
которая хранит информацию о словарях таксономии -
таблицу
node,
которая хранит основные данные материалов (нод)