Если под PIVOT
таблицей подразумевается таблица ссылок many-to-many
, то нет, это только ухудшит производительность.
Вы должны хранить parent_id
в дочерней таблице.
Таблица ссылок many-to-many
занимает дополнительно JOIN
и поэтому менее эффективна.
Сравните следующие запросы:
SELECT *
FROM child_table c
JOIN child_to_parent cp
ON cp.child = c.id
JOIN parent p
ON p.id = cp.parent
WHERE c.property = 'some_property'
и этот:
SELECT *
FROM child_table c
JOIN parent p
ON p.id = c.parent
WHERE c.property = 'some_property'
Последний на один JOIN
короче и эффективнее.
Единственное возможное исключение из этого правила состоит в том, что вы часто выполняете эти запросы:
SELECT *
FROM child_table c
JOIN parent_table p
ON p.id = c.parent
WHERE c.id IN (id1, id2, ...)
, т.е. е. Вы заранее знаете id
дочерних строк.
Это может быть полезно, если вы используете естественные ключи для child_table
.
В этом случае да, таблица ссылок child_to_parent
будет более эффективной, поскольку вы можете просто заменить ее следующим запросом:
SELECT *
FROM child_to_parent cp
JOIN parent_table p
ON p.id = cp.parent
WHERE cp.child IN (id1, id2, ...)
и child_to_parent
всегда будут меньше или равны по размеру child_table
и, следовательно, более эффективны.
Однако в Oracle
вы можете достичь того же результата, создав составной индекс для child_table (id, parent_id)
.
Поскольку Oracle
не индексирует NULL
, этот индекс будет аналогичен вашей таблице child_to_parent
, но без самой таблицы и подразумеваемых накладных расходов на обслуживание.
В других системах (с индексом NULL
) индекс может быть менее эффективным, чем выделенная таблица, особенно если у вас много NULL
родителей.