Сводная таблица против Parent_ID для отношения 1-много - PullRequest
2 голосов
/ 05 августа 2009

В общих отношениях один-ко-многим (родитель-ребенок), существует ли значительная разница в эффективности между (a) помещением parent_id в дочернюю таблицу и (b) использованием сводной таблицы только parent_id, child_id?

ПРИМЕЧАНИЕ. При необходимости используйте Oracle, в противном случае ответьте с использованием общей СУБД.

1 Ответ

3 голосов
/ 05 августа 2009

Если под 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 родителей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...