Хранимые функции в MySQL - стоит делать? - PullRequest
2 голосов
/ 26 апреля 2011

Когда я впервые попал в базы данных, я использовал SQL Server. Я вошел в это первоначально с классическим ASP. Одна из важных вещей, которые нам сказали, заключалась в том, что вы сэкономили много времени в своих транзакциях SQL, если использовали хранимые процедуры, а не работали с командами ASP SQL (делая это «в линию», я полагаю). Таким образом, почти все, что я когда-либо хотел сделать с базой данных, для которой я написал хранимую процедуру, а затем вызвал хранимую процедуру из своего кода.

В любом случае, перенесемся на несколько лет вперед, и теперь я делаю всю свою работу с PHP и MySQL (и немного Python). Одна вещь, которую я, похоже, вообще не вижу, это люди, использующие хранимые процедуры / функции, так что я на самом деле не беспокоился об этом.

Однако мне приходит в голову, что я просто делаю это неправильно и не понимаю этого. Есть ли главное преимущество использования хранимых функций в MySQL? Я создаю довольно хороший веб-сайт, который обрабатывает много обращений к базе данных. Все звонки выполняются в соответствии с моим PHP-кодом. Будет ли лучше использовать хранимые функции для вызовов, которые я выполняю последовательно, а затем просто передавать переменные в функцию из PHP?

Ответы [ 3 ]

4 голосов
/ 26 апреля 2011

Ну, это зависит. Хранимые процедуры являются способом обработки функциональной декомпозиции и могут быть абсолютно необходимы, если у вас есть несколько приложений, взаимодействующих с одной и той же базой данных. Идея использования хранимых заготовок для всего осталась в ходу пару лет назад, и, поскольку мир перешел в мир обслуживания / RAD, они теряют некоторые позиции.

Некоторые из преимуществ хранимых процедур:

  1. Повторное использование / Это, безусловно, может быть выполнено в вашей кодовой базе, но это чертовски здорово - написать один и тот же запрос с 10 объединениями 15 раз

  2. Безопасность - когда sp были, когда атаки rage sql были на переднем плане, и один из способов уменьшить вашу экспозицию - предложить параметризованный sp, который автоматически очищает ваш ввод для большинства случаев

  3. Документация по определению для действительно больших баз данных не всегда достаточна для объяснения того, что вы храните и почему, и SP иногда дает вам и тем, кто придет после вас, то, что было задумано

  4. Определенный интерфейс.

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

Некоторые минусы

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

  2. Отсутствие управления конфигурацией на SP - Хотя существуют установленные процедуры и инструменты для управления кодом, SP отстает.

0 голосов
/ 26 апреля 2011

Это тот же вопрос, что и вопрос: «Должен ли я разбить свой код на методы / функции / процедуры и вызвать их или я должен все кодировать в свою текущую функцию?»

Некоторые из преимуществ, которые дают хранимые процедуры:

  1. Более легкое тестирование. Вы можете проверить хранимые процедуры без запуска приложения.
  2. Более легкая разработка. Вы можете попросить разработчика БД написать хранимые процедуры, а разработчик GUI - пользовательский интерфейс и т. Д.
  3. Упрощенный перенос в другую базу данных. Все изменения содержатся в базе данных, и контракт с приложением (параметры, передаваемые хранимым процедурам) не должен изменяться.
  4. Возможность использовать логику в хранимой процедуре из нескольких внешних интерфейсов. Вам не нужно кодировать логику создания одного и того же клиента в каждом приложении, в котором требуется создать нового клиента.

Большим недостатком является то, что вам нужно выучить несколько линий и, вероятно, использовать несколько инструментов. Это одна из основных причин использования Linq для SQL в .Net. Вам не нужно изучать SQL, и все содержится в коде .Net.

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

0 голосов
/ 26 апреля 2011

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

Независимо от того, как я отвечаю, это проблема священной войны, которая была избита до смерти (на этом самом сайте): Хранимая процедура MySQL против сложного запроса

...