Есть ли смысл в нативных связях в БД, если relation в active record их дублируют?

При проектировании БД делаю связи между таблицами - это удобно как для визуального восприятия, так иногда и технически, например при каскадном удалении по внешнему ключу связанных данных. Понятно что так делать грамотно, но в случае с Yii (Yii 2), мы их (на уровне БД) в любом случае дублируем на уровне бизнес-логики приложения (да при автогенерации кода создаются методы-связи), но возникает вопрос: а почему бы тогда не оставить всю логику на уровне приложения (php), как мне кажется так будет проще работать, а базу использовать как хранилище несвязанных таблиц (на уровне БД).

Есть ли смысл в нативных связях в БД, если relation в active record их дублируют?
  • Вопрос задан
  • 592 просмотра
Пригласить эксперта
Ответы на вопрос 4
Не стоит, если для вас сейчас это очевидно, это не значит, что оно останется очевидным через год или будет очевидным для того, кто в будущем вместо вас будет поддерживть код. В дополнение к этому вам придется написать подробную документацию к своему коду (проставить внешние ключи гораздо проще, чем описать 100 кусков кода, которые нужно учитывать просто потому, что ключи не проставлены), а вашему сменщику ее тщательным образом изучить перед началом работы и более того - постоянно держать в памяти. Не знаю как в yii, но в laravel с базой можно работать посредством Orm eloquent и query builder. В eloquent я еще могу описать некоторые правила, но у меня нет гарантий, что программист, который будет работать над проектом после меня не решит использовать query builder, обойдя стороной все всю логику, записанную в моделях. И и в случае с целостностью базы это проблемы не только программиста, это проблемы в первую очередь проекта. Php не надает по рукам такому программисту, а вот база данных запросто.
Ответ написан
@nirvimel
Хорошие ORM всегда выстраивают в базе полную структуру связей со всеми Constrainments и Foreign keys.
Ответ написан
Комментировать
MegaMufa
@MegaMufa
Если вы не проставите внешние ключи, то данные можно будет менять только через ваше приложение. Если вдруг вам понадобится что-то поменять в обход описанных алгоритмов, то вы рискуете потерять целостность данных. А такие ситуации бывают довольно часто.

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

Плюс каскадное удаление бд сделает быстрее, чем ваш код. Вы например удаляете пользователя и надо удалить все его записи. Вам для этого сначала придется выбрать все его записи. Удалить их. А уже потом удалить пользщователя. А в внешними ключами вы просто удаляете пользователя, а бд сама подчистит все зависимые записи.
Ответ написан
mitaichik
@mitaichik
Безусловно смысл есть, имхо, это даже не обсуждается. Вся эта визуализация, автогенрация релейшенов и прочее - все это фигня по сравнению с главной задачей ключей: поддержание целостности данных. Это задача бд, и только она сможет качественно справиться с ней. Если нет осознания мега-важности целостности бд и роли ключей в этом - скорее всего просто мало опыта.

И аккуратней с каскадным удалением. Частенько при удалении должна отработать какя-то дополнительная логика, например в том же afterDelete. При каскадном удалении оно идет на уровне бд, а не на уровне приложения, поэтоу логика не отрабатывает.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы