2010-06-14 3 views

ответ

9

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

Разумный ответ может включать в себя следующее:

  • данных, такие как константы или клиента конкретной логики никогда не принадлежат ЗЛ.
  • Пароли или другие маркеры безопасности никогда не принадлежат SP или коду.
  • Комплексная обработка может не подходить для современных довольно примитивных языков SP.
  • Бизнес-логика может быть лучше подходит для среднего уровня, а не в SP, из-за различий в выразительности языков, ремонтопригодности, дизайна OO или других факторов.
  • Презентационный слой код, вероятно, лучше всего подходит для пользовательского интерфейса, а не для SP.

С такими вопросами интервью, как этот, цель состоит не в том, чтобы определить один правильный правильный или неправильный ответ. Вместо этого у интервьюера есть его идеальный ответ в виду, и ваша задача - определить этот ответ. Если ваш интервьюер является администратором баз данных, управляет группой DBA или, похоже, сильно согласуется с методологией, ориентированной на БД, тогда вы можете попытаться смягчить слабость языков SP и пропустить рекомендацию, чтобы избежать сложной бизнес-логики в базы данных. Есть время и место для этих дебатов, но не во время вашего собеседования!

1

Select^From Table

Редактировать

Хорошо, что был слегка пресным и язык в обратный ответ.

Вещи, которые вы должны иметь в хранимых процедурах:

Я лично не хранить очень простых запросов внутри хранимых процедур, если этот запрос не называется много. Например, если я вызываю проверку версии базы данных в начале программы, и я возвращаю только одну точку данных в заявлении вроде Select version from DataVersion. Вероятно, это не то, что вы должны вызывать из хранимой процедуры. Он добавляет небольшой слой обфускации в код, если у вас есть SP, чтобы просто получить только одну точку данных. Это не значит, что если это простой запрос, он не должен находиться внутри хранимой процедуры.

Одиночные запросы, в основном не полезные в хранимой процедуре. Почему вы хотите сохранить то, что вы собираетесь использовать только один раз.

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

2

Хранимые процедуры сами не хранят данные.

+2

Есть пара интерпретаций «магазина». Один из них должен содержать, например, строковый литерал (например, системные пароли); другой - вставить, как заявление INSERT.Также возможно, что он просто означает «какие вещи вы не должны писать в хранимых процедурах», например, код, который принадлежит прикладному уровню. – Gabe

0

Хранимые процедуры «определены один раз, используются много раз». Если какие-либо изменения необходимы , необходимо заменить (1 и только один) определение хранимой процедуры . Динамический SQL, Конечно, позволяет любой запрос SQL быть выпущен в любое время. Любое изменение хранимой процедуры мгновенно воздействует на каждый другой программный продукт, отчет, и т. Д. (Внутри или за пределами СУБД) , который прямо или косвенно ссылается на . Не всегда возможно, чтобы точно определял то, что будет иметь эти удары, а также то, что можно сделать без изменений без , что отрицательно скажется на чем-то другом.

http://en.wikipedia.org/wiki/Stored_procedure

+1

Похоже, вы утверждаете * против * повторного использования кода? Кроме того, хранимые процедуры могут содержать динамический SQL (и также иметь уязвимости SQL-инъекций). – RedFilter

3

Я думаю, что это еще один случай, когда ответ: «это зависит». Прежде всего, реальный вопрос, на который нужно ответить, может быть: «Сколько бизнес-логики я планирую/желаю перейти к базе данных?».

Это связано с тем, что вы могли практически иметь всю свою бизнес-логику в базе данных в хранимых процедурах (sprocs), где ваши sprocs обычно имели бы близкое сопоставление «один к одному» с пользовательским интерфейсом или API вашего приложения. В этом случае у вас, вероятно, есть sprocs с такими именами, как LoginUser, ValidateSession, CommitPurchase и т. Д.

С другой стороны, у вас могут быть ваши sprocs, действующие как тонкий уровень доступа к данным/манипуляции, где реальная бизнес-логика сидит где-то еще в вашей инфраструктуре приложения, а sprocs будет просто набором прославленных операторов CRUD. В таком случае, ваши имена sproc вероятно, будет выглядеть больше как GetListOfUsers, GetTop100Users, InsertUser и т.д.

Существуют различные преимущества и недостатки этих двух подходов, а также целесообразность одного подхода или другого зависит многое на конкретный контекст. Ниже приведены несколько соответствующих должностей Stack Overflow по данной теме:

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

+0

Ваше объяснение цели хранимых процедур как хранения бизнес-логики и хранения CRUD-подпрограмм было полезным, как и ссылки на другие сообщения. – boothinator

Смежные вопросы