(Примечание: это пост-центрированный пост. У меня есть многолетний опыт работы с MySQL, а также с несколькими Postgres и Oracle. Я предпочитаю Postgres по миле страны, но это не главное в этом посте.)
Это действительно вопрос о двух направлениях: должна ли база данных быть просто хранилищем данных или содержать логику приложения? Есть случаи для обоих.
ИМХО ответ раньше был намного проще, прежде чем несколько БД (особенно Postgres) получили несколько действительно хороших процедурных языков в самой БД. До этого момента имело смысл использовать всю логику, которую вы могли бы использовать в приложении, потому что оно должно было быть довольно хитрым, чтобы выполнить некоторые вещи в базовом SQL.
Дейв Маркл в другом ответе хорошо говорит о триггерах, которые, как правило, являются «волшебными» для разработчика. Изменение ввода по пути может быть очень запутанным. Если я говорю UPDATE foo set X=3;
, но затем проверяю foo
и x
действительно 4
, потому что какой-то триггер его перехватил, это может сбить с толку. Как и Дэйв, я склонен продвигать триггеры для функций аудита и тому подобного. Другая проблема, связанная с триггерами, - это производительность, они могут просто высосать жизнь из хорошей пакетной операции.
Хранимые процедуры - я придерживаюсь гораздо более высокого мнения. Разработчик явно вызывает их, и они названы, поэтому он не должен видеть их как черный ящик. Хорошая хранимая процедура может значительно увеличить скорость за счет уменьшения количества строк, которые необходимо «отправить по проводам». Для БД, такой как Postgres с сильным набором PL-языков, действительно нет ничего, что не может быть в SP (это не означает, что это ДОЛЖНО быть сделано, но может быть). Взгляните на SimplyCity , чтобы узнать, как хранимые процедуры могут быть вашими друзьями. Кроме того, вы можете разделить классы логики приложения между кодом приложения и PL / python, PL / Perl или PL / Php, PL / Ruby или PL / Java. Я считаю, что Oracle может сделать нечто подобное с Java - просто это не то, с чем работает компания, в которой я сейчас работаю с Oracle.
Если вы планируете оставаться независимым от базы данных, вы пожертвуете множеством функций, большой скоростью и большим количеством своего времени. ORM могут сделать это проще, но в конечном итоге в большинстве механизмов баз данных есть фундаментальное различие, которое просто невозможно полностью абстрагировать.
В целом вам нужно протестировать, протестировать, протестировать (с реальными данными) и принять решение, которое лучше всего подходит для вашего приложения. Часто это баланс между производительностью, будущим обслуживанием, стоимостью и ресурсами, с которыми вам приходится работать. Часто (не каждый раз) перемещение логики из базы данных в приложение значительно снижает производительность приложения.
Даже если вы не решите поместить логику приложения в БД - найдите время, чтобы действительно узнать о вашей БД по вашему выбору. В долгосрочной перспективе это сделает вас лучшим разработчиком приложений.