Использование хранимых процедур как слой бизнес-логики

Компания, на которую я работаю, в настоящее время использует Хранимые процедуры (в бэкенде сервера MsSQL) как их Слой Бизнес-логики. Фактическая Бизнес-логика DLL просто называет sProcs и в основном управляет UI (события, привязка данных, и т.д.)

Я думаю, что в установке существует что-то не так, хотя я не уверен, как объяснить это моим коллегам. Btw, системные работы.

"Лучшие практики" на моем рабочем месте неправильно? Или я просто сверхдумаю это?

8
задан JohnB 20 July 2010 в 23:25
поделиться

7 ответов

GaiusSensei - это нормально работать таким образом, пока бизнес-сфера способна выдерживать сейсмические сдвиги в деловой практике. Я думаю, что споры между библиотеками SP и BLL все еще продолжаются, и, без сомнения, в этой ветке будет много с обеих сторон. Однако, исходя из моего собственного опыта в ряде проектов за последние 10 лет, вот мои наблюдения, подтверждающие подход BLL dll:

  • логика, содержащаяся в BLL, может быть "независимость" от носителя информации и поэтому более гибкий, чтобы изменить (хотя как часто это происходит, спорно)
  • Более тонкий контроль над бизнесом разрешения ВО ВСЕМ диапазоне приложения, которые полагаются на хранилище данных. Под этим я подразумеваю ядро таблицы, целостность которых должна быть поддерживается на уровне, характерном для это использование в бизнесе рассматриваемое приложение.
  • Логика BLL может быть инкапсулирована в себя содержащиеся классы, которые можно использовать повторно в других сферах бизнеса и или проект.Класс может быть даже написано как закрытый класс или расширяемый в зависимости от вашей цели 'аудитория'
  • Модульное тестирование - это (в моем опыт) - это черное искусство, если оно используется внутри ИП. под java / c # и т. д. это это стандарт, и некоторые сказали бы обязательная практика сейчас.
  • Ремонтопригодность. Сохраняя хорошо организованные интерфейсы в DLL BLL сценарий, вы упрощаете поддержка разработчиков для расширения вашего классы без нарушения существующих логика
  • Переносимость. ваш BLL (в зависимости от языковая реализация) может быть размещены на различных платформах. Аналогичным образом инъекция реализация хранилища данных может буквально быть чем угодно из xml файл в mysql, mssql postgres и т. д., и др.
  • Стандартизация. Архитектор данных можно точно определить, как данные элемент должен быть взят из база данных и как должен быть каждый элемент сохранен (хотя это было бы лучше расположить в dll DAL). Таким образом, стоимость входа на как новые разработчики так и бывалые, на проекте много уменьшенный.

Этот список можно продолжить, но это мои главные ЗА за принятие подхода BLL.

Глядя на множество спинов на этом:)

jim

[edit] - я бы также добавил, что этот BLL НЕ должен также выдавать какую-либо информацию пользовательского интерфейса, кроме (как вы упомянули) для передачи событий и т. Д. Каждого уровня пользовательского интерфейса (относящегося к целевому устройству - браузеру / мобильному устройству / factory) должен ссылаться на BLL и выполнять свои собственные действия с данными. Я бы добавил, что ниже BLL будет ваш слой DAL. этот уровень можно рассматривать как ссылку 1-1 с базовым хранилищем данных.

6
ответ дан 5 December 2019 в 06:09
поделиться

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

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

Я не могу сказать вам, сколько проектов я выполнял, в которых новый человек приходил на борт и думал, что текущую архитектуру нужно изменить. Я сам так делал несколько раз. Это не самое лучшее место. Статус-кво будет бороться с вами до конца. Если вы действительно настроены на изменение существующей системы, создайте себе авторитет. Через 3-6 месяцев начните предлагать лучшие способы подхода к некоторым из существующих инфраструктур. Если вам действительно не нравится текущая архитектура, уходите из компании".

Приложение было написано с самыми лучшими намерениями. Первоначальный разработчик (разработчики) был ограничен во времени, опыте и технологии.

Приложения, подобные тому, что вы описали, - это отличная возможность для обучения. Обратите внимание на неудачные моменты, учитесь на успехах. Вы будете поражены тем, что узнаете.

6
ответ дан 5 December 2019 в 06:09
поделиться

Мы делаем это.

Это потому, что мы поддерживаем сценарии, в которых пользователи подключаются к базе данных, используя программы, отличные от предусмотренных (например, SQL Management studio, osql и Excel).

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

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

6
ответ дан 5 December 2019 в 06:09
поделиться

(я добавил тег «субъективный»)

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

Christopherous 5000: вы все еще можете проводить модульное тестирование с помощью хранимых процедур

Я склонен согласиться с ответами на эти два похожих вопроса:

3
ответ дан 5 December 2019 в 06:09
поделиться

Это зависит.

Это зависит от того, что вы называете бизнес-логикой.

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

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

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

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

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

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

3
ответ дан 5 December 2019 в 06:09
поделиться

Я бы сказал, что хранимые процедуры не так хорошо поддаются модульному тестированию и рефакторингу, как логика бизнес-слоя в .net/java. Я бы максимально убрал логику из БД, главным исключением являются операции, основанные на множествах, где СУБД была бы на высоте.

2
ответ дан 5 December 2019 в 06:09
поделиться

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

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

Если то, что у вас есть, работает, просто подумайте, как работать с этим дальше.

1
ответ дан 5 December 2019 в 06:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: