java - Drools引擎和数据库之间的区别

标签 java database api drools rule-engine

我正在浏览 Drools 文档,发现它没有做任何有趣的事情/解决任何问题(可能是我错了)。

在 drools 中,我们指定业务规则(在 .drl 文件中),例如,

  when "type = jewellery" then setDiscount(25%)
  when "type = KidDress" then setDiscount(30%) 
  1. 上述与使用数据库有什么区别?

  2. 我始终可以公开自定义 API,从中可以指定业务规则,并且可以将其直接存储在 RDBMS 中。正式来说,如果需要,我可以构建一个与公开的 API 集成的示例 UI(1-2 天内)。如果我公开 CRUD 操作,这也将允许业务人员轻松添加/更新/删除规则。

对于像我解释的那样简单的事情,Drools 正在解决什么问题?我在 g-search/官方文档中找不到任何文档。

有人可以帮忙吗?

最佳答案

与 Karol 的回答相反,我也使用了 Drools,但我对它们有很好的体验。文档中的用例被有意简化,但 Drools 还可以比数据库更有效地处理更复杂的用例。我确实知道这一点,因为我用大约 140 万条规则维护的服务已转换为使用数据库(使用您提供的相同参数)。它从平均 30-100 毫秒响应查询,到花费 750 毫秒到超过 2 分钟响应(我不知道需要多长时间,因为我们在 2 分钟后查询超时。)

原因是 Drools 允许我们实现“失败”逻辑。在本例中,我的 140 万条规则决定住院患者是否需要获得保险授权才能在医院进行手术。规则范围从非常笼统到非常具体;如果两个规则与输入数据匹配,我们倾向于更具体的规则。如果特定医院或医院+保险组合具有自定义规则,则适用特殊用例。我们传递了我们所了解的有关患者的所有数据、他们的整个病史以及有关他们的保险的大量信息,然后规则决定了答案。

想象一下这个故意简化的场景:

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 表),该查询会是什么样子? (我实际上不知道我没有设法编写一个足够的查询;我也不是 DBA。)

我可以举出一整套示例,其中基于数据库的解决方案性能较差,或者根本不推荐。例如,我曾经使用规则实现了伪 BFS 算法,以找出从任意硬件配置到最新支持配置的最佳升级路径。 (每个版本只能升级到不同的其他版本,因此我们需要找出从给定版本到目标版本的最快路径(如果可能的话)。)这可以在数据库中完成吗?有可能,但这不是关系数据库擅长的事情。代码呢?当然可以,但现在您必须在代码中管理可以升级到什么的列表。

对于极其简单的规则集,其中每个规则都是完全排他的并涵盖所有用例?当然,数据库可能会性能更高。然而,现实世界的情况要么需要过于复杂的查询,要么可能根本不合适。

还有决策表?不惜一切代价避免它们。它们加载速度慢,执行速度慢,占用的内存比需要的多,如果尝试大规模使用它们,就会遇到未记录的限制,并且调试它们很痛苦。

关于java - Drools引擎和数据库之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60936309/

相关文章:

Java - 反转字符串中的单词

sql - SERIAL 外键可以设置为空吗?

javascript - [React.js]尝试导入错误: './registerServiceWorker' does not contain a default export (imported as 'registerServiceWorker' )

php - 在 Etsy 上创建新列表

Java + regex 如何检查这样的字符串 "LOAD_filesourceB-01012008_000058.dat"的类型和数字(最后 6 位数字)

java jdbc 和 oracle - 超出最大打开游标数

java - 在 ObjectListing 结果中排除前缀 S3 的 Java 客户端

mysql - 在mysql中为数据库中的每个表自动运行查询

MySQL查询打印每个员工的姓名和工资

c# - 如何使用参数执行 HttpPost-action?