Разница между движком Drools и базой данных - PullRequest
0 голосов
/ 30 марта 2020

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

В drools мы определяем бизнес-правила (в файле .drl) как Например,

  when "type = jewellery" then setDiscount(25%)
  when "type = KidDress" then setDiscount(30%) 
  1. В чем разница между вышеуказанным и использованием базы данных?

  2. Я ВСЕГДА могу выставлять пользовательские API, из которых бизнес-правила могут быть указаны, и я могу сохранить его непосредственно в RDBMS. Формально, если требуется, я могу создать образец пользовательского интерфейса (через 1-2 дня), который интегрируется с открытыми API. Это также позволит деловым людям легко добавлять / обновлять / удалять правила. Если я выставляю операции CRUD.

Для чего-то столь же простого, как я объяснил, какую проблему решает Drools? Я не могу найти ни в одной документации из g-search / в официальной документации.

Может кто-нибудь помочь здесь?

Ответы [ 2 ]

2 голосов
/ 31 марта 2020

В отличие от ответа Кароль, я также использовал Drools, но у меня был отличный опыт с ними. Варианты использования в документации намеренно упрощены, но Drools также может обрабатывать гораздо более сложные варианты использования более эффективно, чем база данных. Я знаю это наверняка, потому что сервис, который я поддерживал с ~ 1,4 миллионами правил, был преобразован в использование базы данных (используя те же аргументы, что и вы). В среднем от 30 до 100 мс на ответ на запрос уходило от 750 мс до более 2 минут на ответ (насколько дольше я не знаю, потому что у нас истекло время ожидания наших запросов через 2 минуты.)

Причиной этого было то, что Drools позволил нам реализовать логику "провалиться" c. В этом случае мои 1,4 миллиона правил определяли, нужно ли больному пациенту разрешение от его страховки, чтобы сделать процедуру в больнице. Правила варьировались от очень общих до очень конкретных; если два правила соответствуют входным данным, мы предпочитаем более конкретное c правило. Особые случаи применения применяются, если в определенной комбинации c больница или больница + страховка имеется специальное правило. Мы передали все данные, которые мы знали о пациенте, всей его истории болезни, и тонну информации об их страховке, а затем правила определили ответ.

Представьте себе этот намеренно упрощенный сценарий:

rule "Car"
when
  Car() // very simple, I have a car
then
  setPrice(100)
end

rule "Red Car"
when
  Car( color == "red" ) // I have a red car
then
  setPrice(75)
end

rule "4-door Car"
when
  Car( doors == 4 ) // I have a 4-door car
then
  setPrice(200)
end

rule "Red Sedan"
when
  Car( color == "red", model == "sedan") // I have a red sedan
then
  setPrice(500)
end

rule "Blue 4-Door Discount"
when
  Car( doors == 4, color == "blue") // I have a blue 4-door car
then
  setPrice(150)
end

Теперь мы начинаем играть в разные конфигурации автомобилей. Желтый автомобиль, 2-дверный спортивный автомобиль соответствует только первому правилу, а цена равна 100. Красный 4-дверный автомобиль соответствует двум правилам; цена 75 или 200? Зависит от того, как вы написали свои правила и что делает «установленная цена»; скорее всего, в правилах, которые я здесь написал, цена 200. Синий седан? 100. И так далее.

Если бы мы преобразовали это в таблицу базы данных (для простоты, в одну таблицу Car со столбцами 'color', 'model' и 'doors'), как бы выглядел этот запрос? (На самом деле я не знаю, что мне не удалось написать запрос, который был бы достаточен; я также не администратор баз данных.)

Я мог бы привести целый ряд примеров, где на основе базы данных Решение будет менее эффективным или не рекомендуется вообще. Например, однажды я реализовал алгоритм psuedo-BFS, используя правила, чтобы определить оптимальный путь обновления от произвольной аппаратной конфигурации до последней поддерживаемой конфигурации. (Каждая версия может быть обновлена ​​только до отдельных других версий, поэтому нам нужно было выяснить самый быстрый путь от данной версии к целевой версии, если это возможно.) Может ли это быть сделано в базе данных? Возможно, но это не та вещь, для которой был бы полезен реляционный БД. Как насчет кода? Конечно, но теперь вам придется управлять своим списком «что можно обновить до чего» в коде.

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

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

1 голос
/ 30 марта 2020

Два основных момента:

  1. Теоретически правила Drools написаны так, чтобы их могли легче понять нетехнические люди, такие как бизнес-аналитики.

  2. Если лог решения c хранится в одном месте, например, как Таблица решений , управление может быть проще. Это иногда удобно, если у вас есть более сложные вычисления с большим количеством переменных, таких как критерии проверки кредитоспособности.

На практике во всех проектах, над которыми я работал с Drools, разработчикам приходилось писать пользовательские функции, которые были вызваны из файла DRL для обработки более сложных логик c. Это сводило на нет вышеперечисленные преимущества и значительно усложняло управление решением, поскольку logi c распределялся между обычным кодом и файлами DRL.

У меня был плохой опыт работы с Drools и подобными инструментами. Я бы не рекомендовал для простых случаев использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...