Дизайн приложения - изменяемые бизнес-правила

Ищу совета по дизайну приложения. Поскольку я подписал NDA, я не могу рассказать слишком много о реальном бизнесе, но постараюсь объяснить требования.

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

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

Эти правила будут состоять из нескольких операторов, проверяющих разные типы данных. Каждой фазе / шагу правил будет присвоен определенный вес. Примером «шаблона» может быть

  • Является ли клиент мужчина = 10 баллов
  • Клиентка женщина = 20 баллов

  • Возраст клиента от 25 до 35 лет? = 20 баллов

  • Заказчику меньше 25 лет? = 10 баллов

  • Зарабатывает ли клиент от 30000 до 50000 долларов в год = 20 баллов

Итак, как видите, существуют сравнения / операторы различных типов (логические, целочисленные и т. Д.).

Я ищу фреймворк / совет, по которому я могу построить эти «шаблоны». Это веб-работа, поэтому мы знаем, что обязательно будем использовать какую-то БД. Технология еще не определена, но, вероятно, будет между PHP и .NET. На данном этапе мы думаем, что многое из этого будет сделано в SQL (и хотели бы увидеть, стоит ли это реализовать).

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

Спасибо!


person AvgJoe007    schedule 21.06.2011    source источник
comment
Остерегайтесь моделирования сложных бизнес-правил с помощью SQL. Edge-кейсы могут быстро превратить вещь в миллионы таблиц и строк. См. Это (несколько спорное) видео о ACL в качестве примера.   -  person Denis de Bernardy    schedule 21.06.2011


Ответы (3)


Я думаю, вы ищете язык выполнения бизнес-процессов.

person Ozair Kafray    schedule 21.06.2011

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

В зависимости от объема работы, которую вы хотите выполнить здесь, это звучит как хорошая работа для для конкретного домена Язык. @Ozair предложил BPEL, но это могло быть излишним.

person Björn Pollex    schedule 21.06.2011
comment
Привет - Спасибо за это. Языки, зависящие от предметной области, могут быть шагом вперед, но я очень хочу увидеть пример, прежде чем углубляться в большое исследование. - person AvgJoe007; 21.06.2011
comment
К сожалению, по ошибке нажмите "Отправить"! Я согласен с тем, что писать правила на SQL для клиентов рискованно. Наша идея заключается в том, что при внедрении этих изменений всегда будет технический аналитик - однако мы хотим избежать изменения основного приложения при изменении правил. - person AvgJoe007; 21.06.2011

Если все ваши правила настолько просты, вы можете использовать что-то вроде:

Rule {
    ruleId,
    templateId,
    comparisonType,
    fieldName,
    minValue,
    maxValue,
    scoreIfPassed
}

Template {
    templateId,
    rules
}

... таким образом, Rule связан с Template и указывает тип сравнения, который нужно применить (например, 'betterThanMin', 'lessThanMax', 'excValue', 'insideRange' и т. д.) к заданному полю. Тогда вы сможете:

user.score = 0;
rules = currentTemplate.rules;
for each rule in rules do
    if rule.comparisonType == 'exactValue' && user[field] == minValue
        user.score += rule.scoreIfPassed;
    else if rule.comparisonType == 'insideRange' && user[field] > minValue && user[field] < maxValue
        user.score += rule.scoreIfPassed;

    ...
end  
person aroth    schedule 21.06.2011
comment
Привет - спасибо за это. Мне нужно переварить много кода (перестал писать несколько лет назад), так что придется выяснить, что где находится! - person AvgJoe007; 21.06.2011