首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

规则引擎数据库兑现的一个设想

2012-11-09 
规则引擎数据库实现的一个设想看了jbossrules是实现是把规则写在一个文本文件中,然后解析翻译这个文件。规

规则引擎数据库实现的一个设想
看了jbossrules是实现是把规则写在一个文本文件中,然后解析翻译这个文件。规则被分成when .. then..两个部分。这种实现方式的好处是规则的变化、书写很灵活,并且和java代码很容易结合起来,但是问题是规则文件不能由系统的最终用户来编写。
有没有可能把规则用数据库来表达呢,这样就很容易针对这几张表做一个crud的操作,给最终用户一个操作界面就能维护规则了,目前没有这种把规则定义在数据库的规则引擎,不知道有没有,是否是相对于文件形式弊端太多。我的想法如下:
规则分成两部分,在jbossrules中是lhs,rhs,即左手边条件,右手边结果。条件可以理解为某个项目的取值,取值有两种情况:连续值和离散值,比如工资是个连续值,性别是离散值;结果可转化为一个数值,比如打折的折扣规则最终要的结果就是一个折扣比率,如果结果要求的是等级的划分,也可以用数值来编码,比如1代表贵宾客户,2代表普通客户。
这样规则表就分连续规则表和离散规则表两种
连续规则表:
项目??????? 下限??????? 下限开闭??????? 上限??????? 上限开闭??????? 结果
-------------------------------------
工资??????? 1000??????? 开??????????????? 2000??????? 闭?????????? 5
工资??????? 2000??????? 开??????????????? 3000??????? 闭?????????? 10
上面这两条记录表示工资(1000,2000] 积分算5分,工资在(2000,3000]这个区间积分算10分。下限为空时表示没有下限,上限同理。
离散规则表:
项目??????? 取值??????? 结果
-----------------------------
性别??????? 男??????? 5
性别??????? 女??????? 10
上面两条记录表示性别取值是男、女分别积分算5分、10分。
一条规则由N个“项目”组成,这些“项目”就是jbossrules中的fact的度量值,比如工资、性别等等。所以规则表如下:
规则表:
规则id??????? 项目??????? 离散/连续
------------------------------------
1???????????? 工资??????? 连续
1???????????? 性别??????? 离散
这个规则表示由两个项目组成。当一个业务行为的数据传进来比如一个工资为1800男性客户需要计算他的积分,则把规则id为 1的积分规则所有项目与规则表的项目关联,分别累加每个项目的积分值得到总和。

这种想法可行吗? 24 楼 eyejava 2007-01-04   我的想法不是把规则用数据库存储起来,那样有什么意义?
最终目的是通过web页面能让最终用户定义自己的规则,这个定义的过程不是在文本框里面写 a >20 && b <30 之类的表达式,对于最终用户,让他们写这些很简单的表达式都是恶梦。 25 楼 dada 2007-01-04   eyejava 写道我的想法不是把规则用数据库存储起来,那样有什么意义?
最终目的是通过web页面能让最终用户定义自己的规则,这个定义的过程不是在文本框里面写 a >20 && b <30 之类的表达式,对于最终用户,让他们写这些很简单的表达式都是恶梦。
你的表结构和业务太相关了,如果业务发生变化可能会有你的表结构不支持的情况发生。
例:
when
    sample : Sample()
    parameter : Parameter()
    eval(sample.getA() < parameter.getUpper())
    eval(sample.getA() > parameter.getLower())
then
    sample.setResult(parameter.getResult());
如果多加了其他值得判断比如!=null你的表结构如何支持?

热点排行