По моему опыту, многие из проектов, которые я читал в прошлом, не имели определений отношений в базе данных, вместо этого они определяли их только в исходном коде. Поэтому мне интересно, каковы преимущества / недостатки определения отношений между таблицами в базе данных и в исходном коде? И более широкий вопрос касается других дополнительных функций в современных базах данных, таких как каскад, триггеры, процедуры ... В моих мыслях есть несколько моментов:
В базе данных:
Правильные данные из дизайна. Предотвратите ошибки приложения, которые могут вызвать неправильные данные.
Сократите количество обращений к сети в приложении при вставке / обновлении данных, поскольку приложение должно выполнить больше запросов для проверки целостности данных.
В исходном коде:
Более гибкий.
Лучше при масштабировании на несколько баз данных, так как иногда связь может быть кросс-базой данных.
Больше контроля над целостностью данных. База данных не должна проверять каждый раз, когда приложение изменяет данные (сложность может быть O (n) или O (n log n) (?)). Вместо этого он делегирован приложению. И я думаю, что обработка целостности данных в приложении приведет к более подробным сообщениям об ошибках, чем при использовании базы данных. Например: когда вы создаете сервер API, если вы определяете отношения в базе данных, и что-то идет не так (как ссылка на сущность не существует), вы получите исключение SQL с сообщением. Простым способом будет вернуть клиенту 500, что есть «Внутренняя ошибка сервера», и клиент не будет знать, что происходит не так. Или сервер может проанализировать сообщение, чтобы выяснить, в чем дело, что, на мой взгляд, является уродливым и подверженным ошибкам способом. Если вы позволите приложению справиться с этим,
Что-нибудь еще?
Изменить: как указывает Килиан, моя точка зрения о производительности и целостности данных очень ошибочна. Так что я отредактировал, чтобы исправить мою точку зрения там. Я полностью понимаю, что разрешение базы данных обрабатывать это будет более эффективным и надежным подходом. Пожалуйста, проверьте обновленный вопрос и расскажите о нем.
Редактировать: спасибо всем. Все ответы, которые я получил, указывают на то, что ограничения / отношения должны быть определены в базе данных. :). У меня есть еще один вопрос, так как он выходит за рамки этого вопроса, я просто разместил его как отдельный вопрос: Обработка ошибок базы данных для сервера API . Пожалуйста, оставьте некоторые идеи.