Следует ли сделать самоссылающийся столбец таблицы внешним ключом?

StackOverflow https://stackoverflow.com/questions/246477

Вопрос

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

Недостатки:

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

Да, ты должен.

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top