программирование БД на стороне сервера: почему? - PullRequest
2 голосов
/ 30 октября 2009

Учитывая, что база данных, как правило, является наименее масштабируемым компонентом (веб-приложения), есть ли ситуации, в которых можно было бы поместить логику в процедуры / триггеры вместо сохранения ее на своем любимом языке программирования (ruby ...) или ее любимом вебе? рамки (... рельсы!).

Ответы [ 14 ]

14 голосов
/ 30 октября 2009
  • Логика на стороне сервера часто намного быстрее, даже при процедурном подходе.

  • Вы можете настроить параметры гранта и скрыть данные, которые вы не хотите показывать

  • Все запросы в одном месте удобнее, чем если бы они были разбросаны по всему коду.

А вот (очень субъективная) статья в моем блоге о причине, по которой я предпочитаю хранимые процедуры:

Кстати, триггеры (в отличие от функций / хранимых процедур / пакетов) мне вообще не нравятся.

Это совершенно другая история.

8 голосов
/ 30 октября 2009

Вы сохраняете обработку в базе данных вместе с данными.

Если вы обрабатываете данные на стороне сервера, вам необходимо передать данные на серверный процесс по сети, обработать их и (необязательно) отправить обратно. У вас есть проблемы с пропускной способностью / задержкой в ​​сети, а также накладные расходы памяти.

Чтобы уточнить - если у меня есть 10-метровые строки данных, мои два крайних сценария: а) протянуть эти 10-метровые строки через сеть и обработать на стороне сервера, или б) обработать вместо базы данных с использованием сервера и языка (SQL), оптимизированных для этой цели. Обратите внимание, что это обобщение, а не жесткое и быстрое правило, но оно соблюдается для большинства сценариев.

3 голосов
/ 30 октября 2009

Наименьший масштабируемый? SQL ???

Посмотри вверх, "объединение".

3 голосов
/ 30 октября 2009

В (почти) каждой ситуации вы сохраняете обработку, которая является частью базы данных в базе данных. Код приложения не может заменить триггеры, вы не доберетесь слишком далеко до того, как обновите базу данных и не сможете запустить эквивалент приложения триггерам (например, при первом использовании консоли управления СУБД).

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

Но беспокоиться о производительности базы данных без существующей проблемы с производительностью базы данных (что вы, похоже, делаете здесь) - это глупо и, к сожалению, очевидно, занято многими постерами Stackoverlow.

3 голосов
/ 30 октября 2009

Может быть, не для большинства веб-систем, но, безусловно, для корпоративных баз данных. Хранимые процедуры и тому подобное позволяют значительно улучшить контроль над безопасностью и производительностью, а также предлагают некоторую инкапсуляцию для самой базы данных. Вы можете изменять схему по своему усмотрению, пока интерфейс хранимой процедуры остается прежним.

3 голосов
/ 30 октября 2009

Когда многим разнородным приложениям и различным другим системам требуется доступ к вашей единой базе данных и быть уверенным, что благодаря их операциям данные остаются согласованными без конфликтов целостности. Таким образом, вы помещаете свою логику в триггеры и хранимые процедуры, которые будут предлагать интерфейс для внешних клиентов.

2 голосов
/ 30 октября 2009

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

Масштабируемость может быть красной селедкой. Иногда проще выразить желаемое поведение на уровне домена языка OO, но на самом деле это может быть дороже, чем использование идиоматического способа SQL.

Механизм безопасности в предыдущей компании сначала был встроен в уровень обслуживания, а затем перенесен на сторону базы данных. Мотивация была на самом деле из-за некоторых ограничений в структуре доступа к данным, которую мы использовали. Решение оказалось немного ошибочным, потому что наша модель безопасности была сложной, но положительным моментом было то, что ошибки должны были быть исправлены только в базе данных; нам не нужно было беспокоиться о том, чтобы разные клиенты следовали другим правилам.

2 голосов
/ 30 октября 2009

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

0 голосов
/ 30 октября 2009

"Учитывая, что база данных, как правило, является наименее масштабируемым компонентом (веб-приложения), есть ли ситуации, в которых можно было бы поместить логику в процедуры / триггеры вместо сохранения ее на своем любимом языке программирования (ruby ...) или ее любимом веб-фреймворк (... рельсы!). "

Что заставляет вас думать, что «масштабируемость» является единственной важной задачей при проектировании системы? Я согласен с Рексемом, где он сказал, что совершенно очевидно, что вы "не" предвзяты ...

Базы данных - это наборы утверждений о фактах. Эти наборы становятся более ценными, если они также могут гарантированно соответствовать определенным правилам целостности. Эти гарантии не стоят ни копейки, если приложения должны обеспечивать такую ​​целостность. Триггеры и sprocs - это единственный способ, с помощью которого системы SQL позволяют предоставлять такие гарантии самой СУБД.

Этот аспект перевешивает «масштабируемость» в любое время, в любом месте, в любом случае.

0 голосов
/ 30 октября 2009

Хороший способ уменьшить масштабируемость вашего уровня данных - это взаимодействовать с ним на процедурной основе. (Выбрать строку..процесс ... обновить строку, повторить)

Это можно сделать в хранимой процедуре с помощью курсоров или в приложении (извлечь строку, обработать, обновить строку). Результат (низкая производительность) тот же.

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

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

Например, чтобы добавить 1 в поле подсчета всех строк в таблице, все, что нужно, это следующее:

UPDATE table SET cnt = cnt + 1

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

SELECT id,cnt FROM table
...
foreach row
...
UPDATE table SET cnt = row.cnt+1 WHERE id=row.id
...

Я думаю, что с точки зрения абстракции и простоты обслуживания работающей среды использование хранимых процедур может быть полезным инструментом.

Кэш плана процедур и сокращение числа обращений к сети в средах с высокой задержкой также могут иметь значительные преимущества в производительности.

Верно и то, что попытка быть слишком умной или работать с очень сложными проблемами на полуиспеченном процедурном языке СУБД может легко стать рецептом катастрофы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...