Обычно я использую миграции в своих проектах NodeJS для создания таблиц. Я не использую sync({ force: true })
. Итак, каждый раз, когда мне нужно изменить схему БД, я выполняю миграцию. Таким образом, я могу сохранить точный сценарий, как в производстве.
Мой вопрос заключается в том, как добавить ограничения внешнего ключа при создании таблицы с миграцией. Проблема в том, что затем мне приходится создавать миграции в определенном порядке. Потому что, скажем, я создаю эти таблицы.
1) users - id, name, email, password
2) posts - id, title, content, user_id, category_id
3) categories - id, name
Здесь, если я запускаю миграции в этом порядке, я получаю сообщение об ошибке.
ERROR: Cannot add foreign key constraint
Это связано с тем, что categories
таблица еще не была создана к моменту запуска posts
миграции таблицы.
Итак, какие варианты у меня есть здесь.
Создавайте миграции в правильном порядке, чтобы они выполнялись в том же порядке.
Добавьте столбцы внешнего ключа позже с различными миграциями (только для добавления столбца).
Или используйте sync({ force: true })
, чтобы таблицы создавались при добавлении столбца в модели и добавлении ассоциаций.
Или любое другое решение
Не могли бы вы объяснить, что мне здесь делать..
Заранее спасибо.
Первый случай самый надежный и простой в обслуживании, потому что после каждой миграции ваша структура и данные находятся в согласованном состоянии.
Второй случай может быть лучше первого, только если вы хотите вставить огромное количество данных в обе таблицы, чтобы сэкономить время, потому что записи будут вставляться намного быстрее без внешних ключей.
В первом и втором случаях у вас есть детальный контроль над всеми добавочными изменениями структуры и возможность откатывать некоторые миграции, а также развертывать разные версии вашего приложения и БД.
Третий случай подойдет для небольших проектов, где структура БД меняется очень редко и когда важно развернуть и запустить приложение и БД быстро и не задумываясь о миграциях.
Да, они помогают хранить непротиворечивые данные, потому что без них вы можете получить ключи, указывающие на несуществующие записи и т. д.
Большое спасибо за ответ и разъяснение!
Спасибо! Я тоже как-то думал пойти с 1-м или 2-м вариантом. Во всяком случае, побочный вопрос: насколько важно добавлять эти ограничения внешнего ключа? Нужно ли их добавлять?