我浏览了Drools文档,发现它没有做任何有趣的事情/解决任何问题(可能是我错了)。
在流口水中,我们指定业务规则(在.drl文件中),例如,
when "type = jewellery" then setDiscount(25%)
when "type = KidDress" then setDiscount(30%)
上面和使用数据库之间有什么区别?
我可以始终公开自定义API,从中可以指定业务规则,并且可以将其直接存储在RDBMS中。如果需要,我可以正式建立一个示例UI(在1-2天之内),该UI与公开的API集成在一起。如果公开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
现在我们开始在Car的不同配置中玩游戏。黄色的2门跑车仅符合第一个规则,价格为100。红色的4门跑车符合两个规则;价格是75还是200?取决于您如何编写规则以及“设定价格”的作用;我在这里写的规则中价格大概是200。蓝色轿车? 100.以此类推。
如果将其转换为数据库表(为简单起见,将单个表Car列为“ color”,“ model”和“ doors”),该查询将是什么样? (我实际上不知道我没有设法编写足以满足要求的查询;我也不是DBA。)
我可以提供一整套示例,其中基于数据库的解决方案的性能可能较低,或者根本不建议这样做。例如,我曾经使用规则实现psuedo-BFS算法,以找出从任意硬件配置到最新支持的配置的最佳升级路径。 (每个版本只能升级到不同的其他版本,因此,如果可能,我们需要找出从给定版本到目标版本的最快路径。)是否可以在数据库中完成?可能,但是这不是关系数据库所擅长的。那代码呢?可以,但是现在您必须管理代码中可以升级到什么的列表。
对于极其简单的规则集,其中每个规则是完全排他的并涵盖所有用例?确保数据库可能更高效。但是,现实世界中的情况要么要求过于复杂的查询,要么根本不合适。
和决策表?不惜一切代价避免它们。它们的加载速度慢,执行速度慢,占用的内存多于所需的内存,并且如果尝试大规模使用它们,则会遇到未记录的限制,并且调试它们很麻烦。
关于java - Drools引擎和数据库之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60936309/