Должны ли вы сделать столбец таблицы со ссылками на себя внешним ключом? - PullRequest
29 голосов
/ 29 октября 2008

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

Должен ли это быть внешний ключ? Какими будут недостатки / преимущества?

Ответы [ 4 ]

30 голосов
/ 29 октября 2008

Да. Гарантирует, что у вас нет сироты (запись без родителя), и, в зависимости от использования, если вы определите каскадное удаление, при удалении родителя будут также удалены все его дочерние элементы.

Недостатком было бы небольшое снижение производительности, как и любого другого внешнего ключа.

13 голосов
/ 29 октября 2008

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

Вы получите преимущества, связанные с внешними ключами :

  • При условии правильного проектирования отношений ограничения внешнего ключа усложняют программиста для внесения несоответствия в базу данных.
  • Централизация проверки этих ограничений сервером базы данных избавляет от необходимости выполнять эти проверки на стороне приложения. Это исключает возможность того, что разные приложения могут не проверять ограничения одним и тем же способом.
  • Использование каскадных обновлений и удалений может упростить код приложения.
  • Правильно разработанные правила внешнего ключа помогают в документировании отношений между таблицами.

Недостатки:

  • Если вы задаете внешние ключи, иногда выполнять объемные операции сложнее.
  • Возможно, это подразумевает увеличение использования диска и незначительное снижение производительности.
5 голосов
/ 29 октября 2008

Да, вы должны.

Преимущества (как и для любого внешнего ключа):

  • Гарантирует, что parent_id ссылается на реальную строку в таблице
  • Предотвращает случайное удаление родителя, у которого есть дети, или гарантирует, что каскады удаления также удаляют потомков
  • Предоставляет информацию, которую оптимизатор может использовать

Я не могу думать ни о каких реальных недостатках.

4 голосов
/ 29 октября 2008

Да, вы должны сделать его внешним ключом.

Преимуществом будет лучшая модель данных с меньшей избыточностью.

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