2008-10-29 3 views
25

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

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

ответ

26

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

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

+4

«Бездетная сирота» ??? ;-) – Yarik

4

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

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

13

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

Вы наслаждаться advantages associated to foreign keys:

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

Недостатки:

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

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

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

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

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