Аргументы в пользу Бизнес-логики в хранимых процедурах

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

Array.prototype.equals = function (array, strict) {
    if (!array)
        return false;

    if (arguments.length == 1)
        strict = true;

    if (this.length != array.length)
        return false;

    for (var i = 0; i < this.length; i++) {
        if (this[i] instanceof Array && array[i] instanceof Array) {
            if (!this[i].equals(array[i], strict))
                return false;
        }
        else if (strict && this[i] != array[i]) {
            return false;
        }
        else if (!strict) {
            return this.sort().equals(array.sort(), true);
        }
    }
    return true;
}

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

Пример:

var arr1 = [1, 2, 3, 4];
var arr2 = [2, 1, 4, 3];  // Loosely equal to 1
var arr3 = [2, 2, 3, 4];  // Not equal to 1
var arr4 = [1, 2, 3, 4];  // Strictly equal to 1

arr1.equals(arr2);         // false
arr1.equals(arr2, false);  // true
arr1.equals(arr3);         // false
arr1.equals(arr3, false);  // false
arr1.equals(arr4);         // true
arr1.equals(arr4, false);  // true

I 've также написал быстрый jsfiddle с функцией и этим примером: http://jsfiddle.net/Roundaround/DLkxX/

42
задан GernBlandston 28 January 2009 в 04:04
поделиться

9 ответов

Против хранимых процедур: бизнес-логика в программировании располагает с интервалами

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

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

34
ответ дан Mark Canlas 4 August 2019 в 19:04
поделиться

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

Это трудно сделать с хранимыми процедурами. У Вас может быть больше чем один контакт sproc с той же таблицей (таблицами). Объединение в цепочку нескольких sprocs вместе так, чтобы логика находилась только в одном, становится громоздким. Это - забастовка один. Как Вы определяете, "Что все бизнес-правила окружают объект X" в базе данных? Весело проведите время ища тысячи sprocs, пытающиеся разыскать это.

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

Проверку трудно выполнить, если логика находится только в базе данных. Вы действительно называете sproc для проверки каждого поля на форме ввода данных? Правила проверки и бизнес-логика являются близкими родственниками. Эта логика должна все быть выполнена в том же месте!

5
ответ дан Jim Petkus 4 August 2019 в 19:04
поделиться

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

8
ответ дан edgi 4 August 2019 в 19:04
поделиться

Я имею философскую школу, которая говорит что настолько же долго как бизнес-логика:

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

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

19
ответ дан earino 4 August 2019 в 19:04
поделиться

Я полностью против него. Одной из самых больших причин является первая причина earino указанный - это живет в одном месте. Вы не можете интегрировать его в управление исходным кодом очень легко. Это почти невозможно, чтобы иметь два devs, работающие над сохраненным proc одновременно.

Моя другая основная жалоба - то, что SQL просто не очень хорош при представлении сложной логики. У Вас нет понятия объема, код имеет тенденцию вставляться копией, потому что существует меньше способности снова использовать код (в противоположность языку OO).

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

23
ответ дан Nick Van Brunt 4 August 2019 в 19:04
поделиться

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

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

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

SOA предлагает средний путь: сервисы владеют своими данными. Только сервис имеет доступ к данным; получение к данным означает проходить сервис. В этом случае возможно положить правила на любое место.

Приложения приходят и уходят, но данные остаются.

11
ответ дан duffymo 4 August 2019 в 19:04
поделиться

+: SQL-сервер иногда оптимизирует код

+: Вы вынуждены передать параметры, который ограничивает проблемы Внедрения SQL

-: Ваш код зависит от единой базы данных (некоторые dbs даже не имеют SP)

-: Для изменения кода, необходимо соединиться с базой данных

-: Логика не организована хорошо

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

4
ответ дан Spikolynn 4 August 2019 в 19:04
поделиться

@Nick "Я категорически против этого. Одна из главных причин - это первая причина, по которой Earino заявил, что он живет в одном месте. Вы не можете легко интегрировать его в систему управления версиями. Это почти невозможно, чтобы два разработчика работали над хранимой процедурой одновременно ».

Не то чтобы я выступал за то, чтобы поместить бизнес-логику в хранимые процедуры (как раз наоборот). Но эти доводы бессмысленны. Хранимая процедура - это просто артефакт sql / DDL, который может быть сохранен в системе управления версиями, и который также является артефактом развертывания (то есть что-то, переданное в базу данных для развертывания, почти так же, как вы бы передали свою войну / ухо артефактов для связи ИТ / развертывания) Один или несколько разработчиков могут работать с одной и той же хранимой процедурой вне системы управления версиями точно так же, как вы Я буду работать с простым старым исходным кодом - путем ветвления, управления версиями и слияния.

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

Я работал в системах с огромным количеством кода, как Java, так и PLSQL / DDL, и все они были версированы на чистом корпусе. Все они рассматривались как исходный код, который будет скомпилирован и развернут в строгом порядке, и над ними будут работать разные команды. Никогда не было проблем с тем, что вы описываете.

0
ответ дан 27 November 2019 в 01:06
поделиться

Некоторые мысли: обратите внимание, что это ответ, ориентированный на Java, но это основная часть моего недавнего (последние 10 лет) опыта

(1) Параллельная разработка (большой) командой Разработчики. Если ваше приложение достаточно сложное, что каждый разработчик не может создать свою собственную частную версию БД (с отслеживаемыми ссылками / ссылочными данными и т. Д.), Очень сложно иметь целую КОМАНДУ разработчиков, которые все работают над один и тот же набор пакетов PL-SQL (например), одновременно хранящихся в общей базе данных DEVL? Затем вы застряли (мой опыт) с работой в БД с недопустимыми процедурами / несоответствием кода таблицам, когда люди вносят изменения ...

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

(2) Наборы инструментов непрерывной интеграции Хотя в мире БД существуют некоторые похожие «концепции», мой опыт показал мне, что комбинация (я выбираю здесь свои лучшие в своем классе фавориты):

  • mvn - build system
  • junit - автоматическое модульное тестирование
  • nexus - менеджер репо (управляет версией жизненного цикла артефакта, снимками и выпусками)
  • hudson - ci build server
  • sonar - инструмент статического анализа / отчеты о покрытии кода / ALOT подробнее

Выполнение большого проекта с использованием всего вышеперечисленного (бесплатные инструменты) позволяет единообразно и легко доставлять XP в массы и обеспечивать контроль качества для всего ИТ-персонала. Oracle / PL-SQL не имеет наборов инструментов, соответствующих

(3) tools / libraries / etc ... Java имеет доступ к удивительному набору сервисов, недоступных другим платформам - некоторые бесплатные, некоторые нет. даже базовые, такие как log4j (да, они есть для PL / SQL, но, пожалуйста ... это не то же самое), позволяют разработчикам создавать гибко настраиваемые журналы, которые можно изменять на лету (идеально для дублирования) . Автоматизированная документация по API (через javadoc). Отчеты о покрытии автоматических модульных тестов. Невероятные IDE (Eclipse) со встроенными отладчиками / автоматическим развертыванием на серверах приложений. API для взаимодействия со всеми типами сервисов под солнцем, библиотеки с открытым исходным кодом, чтобы делать НИЧЕГО, и 100% поддержка всеми поставщиками

(4) повторного использования сервисов. то, что кто-то прокомментировал, правда. Если у вас есть жесткие бизнес-правила, управляемые данными , то вы можете утверждать, что они должны находиться на уровне БД. Почему? чтобы не допустить дублирования этой логики на всех промежуточных уровнях.

Но то же самое можно сказать и о бизнес-правилах, которые не управляются данными или достаточно сложны, чтобы объектно-ориентированный подход был более естественным выбором . Если вы вставите ВСЮ бизнес-логику в БД, то они будут доступны только через БД.

  • Что делать, если вы хотите, чтобы проверка выполнялась на уровне клиента или среднего приложения и сохранялась обратная связь с БД?
  • Что, если вы хотите кэшировать данные только для чтения на среднем уровне (для повышения производительности) и вести бизнес правила выполняются в отношении кэшированных данных?
  • Что, если у вас есть служба среднего уровня, которая не требует доступа к БД, или у вас есть клиент, который может предоставлять свои собственные данные?
  • Что, если зависимая от данных часть бизнеса правила тогда нужен доступ к внешним сервисам? Затем вы заканчиваете фрагментированной бизнес-логикой, которая выглядит следующим образом:

i

retCode = validateSomeDate(date);
if (retCode == 1) then
   evaluateIfCustomerGetsEmail(...)//probably more stored proc invocations here...
   sendEmailMsg(....)
else if (retCode == 2) then
   performOtherBizLogicStuf(...) //again, may need data, may not need data
   triggerExternalsystemToDoSomething(...) //may not be accessible via PL/SQL 
fi

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

13
ответ дан 27 November 2019 в 01:06
поделиться
Другие вопросы по тегам:

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