Должен ли я использовать внешний ключ для отображения дерева отношений в SQL - PullRequest
3 голосов
/ 27 июня 2009

Я пытаюсь смоделировать древовидные отношения в таблице. Например, есть «Категории», и сами категории могут находиться внутри родительской категории.

Моя схема:

id int PRIMARY KEY,
parent_id int,
name

У меня вопрос, стоит ли помечать столбец parent_id как внешний ключ? Иностранный подразумевает «внешность», а не самоссылку. Для этого есть другой тип ключа?

Мой вопрос похож на: Самореферентное ограничение в MS SQL , но я задаю другой вопрос, каскад не является проблемой.

Ответы [ 4 ]

10 голосов
/ 27 июня 2009

Внешние ключи с собственной ссылкой встречаются постоянно. Например. сотрудник может иметь другого «сотрудника» в качестве своего менеджера, поэтому manager_id будет внешним ключом для поля employee_id в той же таблице.

Внешние ключи являются естественным кандидатом для представления родительского узла в иерархических данных, хотя они не используются исключительно для этого:)

6 голосов
/ 27 июня 2009

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

http://www.intelligententerprise.com/001020/celko.jhtml

4 голосов
/ 27 июня 2009

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

См. Эту статью для альтернативных представлений: Хранение иерархических данных в базе данных

3 голосов
/ 27 июня 2009

Я не верю, что есть другой тип ключа ... внешний ключ был бы хорош в этом сценарии ... он наложил бы ограничение на parent_id, чтобы гарантировать, что он ссылается на действительный идентификатор

...