Повторное использование хранимых процедур SQL в разных приложениях

StackOverflow https://stackoverflow.com/questions/84453

Вопрос

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

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

Спасибо!

Это было полезно?

Решение

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

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

Другие советы

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

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

Шаблон, который я рекомендую и который я реализовал, заключается в том, что только одно приложение должно "владеть" каждой базой данных и предоставлять API (сервисы и т.д.) Для других приложений для доступа к данным и их изменения.

Это имеет ряд преимуществ:

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

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

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

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

Последняя часть вашего вопроса, я полагаю, ответила сама на себя.

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

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

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

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

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

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

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

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

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

Использование одной и той же архитектуры может работать в разных приложениях, но представьте, что вы пытаетесь использовать один и тот же уровень бизнес-логики в нескольких приложениях."Но подождите! - скажете вы, - это глупо...если я использую тот же BLL, зачем мне отдельное приложение?Они делают то же самое!"

КЭД.

В идеале используйте один процесс, а не несколько версий.Если вам нужны версии для каждого клиента, рассмотрите идею 1 БД для каждого клиента, а не 1 БД для всех клиентов.Это также позволяет организовать некоторое интересное размещение баз данных на разных серверах (распределите более крупные / интенсивно используемые серверы на более крупные серверы, в то время как меньшие могут совместно использовать оборудование)

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

Вероятно, по ходу дела вы обнаружите, что распространенных хранимых процедур не так уж много.

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

Многие хранимые процедуры не зависят от приложения, но могут быть и такие, которые зависят от приложения.Например, хранимые процедуры CRUD (Создать, Выбрать, Обновить, Удалить) могут использоваться в разных приложениях.В частности, вы можете добавить логику аудита (иногда это делается в триггерах, но есть предел тому, насколько сложным вы можете быть в триггерах).Если в вашем магазине программного обеспечения используется какой-либо тип стандартной архитектуры, для среднего уровня может потребоваться хранимая процедура для создания / выбора / обновления / удаления из базы данных независимо от приложения, и в этом случае процедура является общей.

В то же время могут существовать некоторые полезные способы просмотра данных, например GetProductsSoldBySalesPerson и т.д..который также не будет зависеть от приложения.У вас может быть множество таблиц подстановки для некоторых полей, таких как отдел, адрес и т.д.таким образом, может существовать процедура для возврата представления таблицы со всеми текстовыми полями.Т.е. вместо SalesPersonID, SaleDate, CustomerID, DepartmentID, CustomerAddressID процедура возвращает представление SalesPersonName, SaleDate, CustomerName, DepartmentName, CustomerAddress.Это также может быть использовано в разных приложениях.Системе взаимоотношений с клиентами понадобились бы Имя / Адрес / Другие атрибуты клиента, как и системе выставления счетов.Таким образом, что-то, что выполняло все объединения и получало всю информацию о клиенте в одном запросе, вероятно, использовалось бы во всех приложениях.По общему признанию, создание способов просмотра данных является областью представления, но часто люди использовали хранимые процедуры для этого.

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top