`
eyejava
  • 浏览: 1268440 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

阅读更多
看了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的积分规则所有项目与规则表的项目关联,分别累加每个项目的积分值得到总和。

这种想法可行吗?
分享到:
评论
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你的表结构如何支持?
24 楼 eyejava 2007-01-04  
我的想法不是把规则用数据库存储起来,那样有什么意义?
最终目的是通过web页面能让最终用户定义自己的规则,这个定义的过程不是在文本框里面写 a >20 && b <30 之类的表达式,对于最终用户,让他们写这些很简单的表达式都是恶梦。
23 楼 dada 2007-01-01  
江南白衣 写道
yimlin 写道
eyejava 写道
那我把ss1.0弄来参考一下,drools本身也有这个模块,好像。但是现在上不了他的网站,闷的慌。

springside1.0m3的下载也在sf上,yimlin能帮忙传一份到javaeye的ftp上吗,依赖的是drools 2.5?


我现在没有这块代码,而且依赖2.5!建议还是用3.0毕竟支持dsl。


数据库存储规则是十分必需的,起码可以作规则更改的审计,ss2.0 不做这块是因为drools 3.0自己的road map里有这部分,怕做了无用功,否则anders小明出手作一下估计也不用多少时间:)

除非真的有规则更改审批或是集群的需求,要不然我觉得规则本身用数据库存储没有什么意义。
想象一下没有IDE支持的规则修改以及规则修改后的单元测试就很让人头大了。
哪怕不得不用数据库维护,我觉得修改和测试在开发环境使用drl,通过接口同步到实际环境的数据库进行规则审批。
22 楼 江南白衣 2007-01-01  
yimlin 写道
eyejava 写道
那我把ss1.0弄来参考一下,drools本身也有这个模块,好像。但是现在上不了他的网站,闷的慌。

springside1.0m3的下载也在sf上,yimlin能帮忙传一份到javaeye的ftp上吗,依赖的是drools 2.5?


我现在没有这块代码,而且依赖2.5!建议还是用3.0毕竟支持dsl。


数据库存储规则是十分必需的,起码可以作规则更改的审计,ss2.0 不做这块是因为drools 3.0自己的road map里有这部分,怕做了无用功,否则anders小明出手作一下估计也不用多少时间:)
21 楼 dada 2006-12-31  
这个是可行的,项目中有类似的实现。但是lz的表结构的适用范围相当的窄,只适合一些特殊的规则。
我觉得表结构只需要维护因子的值和关系,担负起drools决策表的作用就足够了。实际的LHS还是手工写,而其中的因子项由数据库维护,RHS这里可以写一个表达式解析器把计算的表达式也由数据库维护。
这样在需求所需要的因子项目不发生变化的情况下可以让客户自己更改表达式,如果只是规则的一些域约束的值发生变化也可以让客户自己修改因子的值。
20 楼 Godlikeme 2006-12-31  
youlq 写道
看看这篇文章:

Loading and managing rules dynamically from a database

http://docs.codehaus.org/display/DROOLS/Loading+and+managing+rules+dynamically+from+a+database


感觉lz的路子很奇怪,如果说得是这个链接里面的内容那就是我理解的问题,
如果和链接内容的思路相差比较大,还是建议回头想想规则引擎的初衷,整理下思路。
19 楼 yimlin 2006-12-31  
如果你的case够简单,那么你自己在数据库上参考BizTalk的实现做一个语法树就实现and和or的判断就可以了
18 楼 yimlin 2006-12-31  
eyejava 写道
找到了springside0.8的代码,ss1.0之后就升级到drools3.0了。
ss0.8中把规则部分的script分成两部分:conditionScript,consequenceScript 来存储,这样做对用户来说还不是得写类似脚本语言的东西吗。


是啊!所以用dsl还是比较好的!
至于在web页面上让用户来点鼠标的,还是要自己完成!
17 楼 eyejava 2006-12-31  
找到了springside0.8的代码,ss1.0之后就升级到drools3.0了。
ss0.8中把规则部分的script分成两部分:conditionScript,consequenceScript 来存储,这样做对用户来说还不是得写类似脚本语言的东西吗。
16 楼 eyejava 2006-12-31  
刚刚竟然打开了sf,并且自动找到一个taiwan的代理,正在下载。
用dsl有什么好处?还不是得手写规则吗,只是变了语法。对于最终用户来说一样是很困难的一件事情,至少在易用性上他会给你打不及格。其他好处是什么?
15 楼 yimlin 2006-12-31  
eyejava 写道
那我把ss1.0弄来参考一下,drools本身也有这个模块,好像。但是现在上不了他的网站,闷的慌。

springside1.0m3的下载也在sf上,yimlin能帮忙传一份到javaeye的ftp上吗,依赖的是drools 2.5?


我现在没有这块代码,而且依赖2.5!建议还是用3.0毕竟支持dsl。
14 楼 eyejava 2006-12-31  
那我把ss1.0弄来参考一下,drools本身也有这个模块,好像。但是现在上不了他的网站,闷的慌。

springside1.0m3的下载也在sf上,yimlin能帮忙传一份到javaeye的ftp上吗,依赖的是drools 2.5?
13 楼 yimlin 2006-12-31  
eyejava 写道
yimlin 写道
在springside1.0早的时候,就基于drools2.5实现了基于数据库存储的规则,当然现ss2.0用上drools3.0,要把规则放到数据库中也是可以的,不过web界面的编辑就需要自己做了。

我从svn上拿下来的jbossrules包里面 没几个代码,擦亮眼睛找了几圈都没找到,springside那边说正在开发。


现在的版本是没有的!Drools2.5基于数据库版是我今年3月开发的。springside1.0后来也上drools3.0的。
12 楼 yimlin 2006-12-31  
fins 写道
其实我那个规则引擎 不是基于数据库存储
而是基于数据库pl/sql实现的
和java没有关系 功能很弱 所以我也没发到这里来


你的组织结构让我想起了MS BizTalk的规则组织结构,只不过你最后是通过拼接文本来必要的语法结构。而BizTalk则在表上实现了树形的语法结构。
关于计算因子,也就是Fact,plsql只能怎么做,和java不同的是,通常这些项是数据项,不如java来的丰富。

我个人认为这样的产品或者项目更多是脚本引擎而不是规则引擎,因为规则的推理演算没有重入,而规则的冲突处理在应用程序就消除了。
11 楼 eyejava 2006-12-31  
yimlin 写道
在springside1.0早的时候,就基于drools2.5实现了基于数据库存储的规则,当然现ss2.0用上drools3.0,要把规则放到数据库中也是可以的,不过web界面的编辑就需要自己做了。

我从svn上拿下来的jbossrules包里面 没几个代码,擦亮眼睛找了几圈都没找到,springside那边说正在开发。
10 楼 fins 2006-12-31  
其实我那个规则引擎 不是基于数据库存储
而是基于数据库pl/sql实现的
和java没有关系 功能很弱 所以我也没发到这里来
9 楼 yimlin 2006-12-31  
在springside1.0早的时候,就基于drools2.5实现了基于数据库存储的规则,当然现ss2.0用上drools3.0,要把规则放到数据库中也是可以的,不过web界面的编辑就需要自己做了。
8 楼 fins 2006-12-31  
我这个排他性 和 规则引擎中的排他性定义不同

我这个排他性是这样的
一个规则组内的规则A 规则B 规则C 不是排他的
那么最后会得到类似下面的语句
IF 纪录X 满足 规则A的条件  then 执行 规则A的动作
IF 纪录X 满足 规则B的条件  then 执行 规则B的动作
IF 纪录X 满足 规则C的条件  then 执行 规则C的动作

如果是排他的 那么
IF 纪录X 满足 规则A的条件  then 执行 规则A的动作
ELSE IF 纪录X 满足 规则B的条件  then 执行 规则B的动作
ELSE IF 纪录X 满足 规则C的条件  then 执行 规则C的动作

差别就是 在一个组内 是否满足了自己 就不去判断其他规则了
这个要和规则优先级一起使用




7 楼 eyejava 2006-12-31  
fins 写道
可以看看这个

http://www.iteye.com/topic/41690

这个设计很不错。但是你的条件表达式还是一些基于sql的语句啊,如何能让用户也会书写呢?另外你规则组的排他性不知道怎么实现的,对这个我还没有体会到规则交叉带来的麻烦,rete算法可能就是为了解决这个问题的吧。

把不同的计分项目拆解开放在数据库保存发现有很大的问题,因为逻辑运算(与,并,非)无法进行,比如工资>2000 && 性别=女 计分为10分, 这种复杂的组合 很难用数据库来表达,只能写成表达式。
6 楼 gtivan 2006-12-30  
之前做了一个rule engine UI 让客户通过界面去编辑规则集
个人认为这个并不复杂 复杂的是规则集中决策表的覆盖 完整性的校验

相关推荐

    wpsaccess2010数据库引擎

    Microsoft Office的Access数据库引擎是一个强大的工具,用于管理和操作数据库,尤其在处理Excel、CSV等非结构化数据时。然而,对于使用WPS Office的用户来说,有时可能会遇到无法链接到外部数据源的困扰。这时,"WPS...

    彩虹3引擎纯真IP数据库

    "彩虹3引擎纯真IP数据库"是一个用于网络访问控制和IP管理的专业数据库,它主要服务于中国的互联网环境。这个数据库包含了海量的IP地址信息,旨在帮助用户识别和过滤来自不同地区的网络连接,通常用于防止垃圾邮件、...

    Access 2010数据库引擎

    2. **数据导入与导出**:用户可以方便地将数据从一个数据库或文件导入到另一个,或者将数据导出为其他格式,这对于数据迁移和数据交换非常有用。 3. **数据连接**:通过ODBC(Open Database Connectivity)和OLE DB...

    C++ 实现的一个简单数据库

    标题 "C++ 实现的一个简单数据库" 描述了一个基于C++编程语言开发的初级数据库系统。这个数据库系统可能还处于初级阶段,因为它缺少了语法分析和语义分析这两个关键的数据库管理系统(DBMS)组件。在数据库领域,...

    一种基于Lucene检索引擎的全文数据库的研究与实现

    ### 一种基于Lucene检索引擎的全文数据库的研究与实现 #### 1. 引言 随着信息技术的飞速发展和互联网的普及,大量的文本信息被数字化存储,这为信息检索带来了前所未有的挑战和机遇。传统的数据库管理系统(DBMS)...

    遗传算法和实时数据库规则结合的数据库查询优化方案设计.pdf

    本文旨在结合遗传算法和实时数据库规则,设计一个数据库查询优化方案。数据库的建立是实现各种类型事务查询的关键,而现有的查询处理系统无法满足实时数据库的需求。因此,本文将针对嵌入式实时数据系统 ERTDBMS ...

    springMVC配置连接数据库实现登录功能的一个小demo

    Hibernate是一个流行的ORM(对象关系映射)框架,它简化了与数据库的交互。 首先,我们需要在项目中引入Spring MVC和Hibernate的相关依赖。这通常通过Maven或Gradle的pom.xml或build.gradle文件完成,添加对应的库...

    java多个数据库实现数据同步

    综上所述,Java实现多数据库数据同步是一个涉及多种技术和策略的复杂问题,需要根据具体业务需求和系统架构来选择合适的方法。在实践中,应注重设计的灵活性、可扩展性和容错性,以保证系统的稳定运行。

    用无序的顺序表实现一个城市数据库

    在数据结构课程设计中,选择无序的顺序表作为基础数据结构来实现这样的数据库是一个很好的实践项目,因为它可以帮助学生理解基本的数据操作以及它们在实际应用中的表现。 无序顺序表是一个简单的线性数据结构,其中...

    数据库建设的规则

    数据库建设的规则是指在数据库设计、开发、实施和维护过程中需要遵守的一系列标准和规定,以确保数据库的正确性、可靠性和安全性。这些规则涵盖了数据库的各个方面,包括数据库设计、数据库对象命名、数据库程序编码...

    java毕业设计——搜索引擎的设计与实现(论文+答辩PPT+源代码+数据库).zip

    java毕业设计——搜索引擎的设计与实现(论文+答辩PPT+源代码+数据库).zip java毕业设计——搜索引擎的设计与实现(论文+答辩PPT+源代码+数据库).zip java毕业设计——搜索引擎的设计与实现(论文+答辩PPT+源代码+...

    Dao Jet数据库引擎

    Jet数据库引擎是Microsoft Access的核心组成部分,它提供了一个强大的、高效的、基于文件的数据库系统。Jet引擎不仅支持Access数据库格式(.mdb),还能够与其他数据源,如ODBC(Open Database Connectivity)兼容的...

    dao jet数据库引擎

    DAO(Data Access Objects)是微软在早期开发的一种数据访问接口,主要用于访问Microsoft Jet数据库引擎,它是Access数据库的基础。Jet数据库引擎是微软开发的一种强大的、快速的数据库管理工具,尤其适用于小型到...

    数据库文档源码 数据库实现方法

    在数据库领域,常见的实现方法有关系型数据库的实现,如InnoDB存储引擎在MySQL中的应用,它采用行级锁定和MVCC(多版本并发控制)来保证并发性能;还有NoSQL数据库的实现,如MongoDB的文档存储模型,它支持JSON格式...

    使用FEDERATED引擎,实现数据库,用户表同步.docx

    它可以将多个数据库服务器连接起来,形成一个逻辑上的单一数据库,实现数据的实时同步。 FEDERATED引擎的优点 使用FEDERATED引擎可以实现以下几点优点: * 实现数据的实时同步,确保数据的一致性 * 提高系统的可...

    android sqlite数据库实现登录注册功能

    在Android应用开发中,SQLite数据库是一个轻量级的、嵌入式的关系型数据库,它非常适合存储应用程序中的小规模数据。本教程将详细讲解如何利用SQLiteOpenHelper和SQLiteDatabase类来实现登录注册功能,以及如何处理...

    数据库建模的业务规则和方法2

    数据库建模是IT行业中至关重要的一个环节,它在系统设计初期扮演着定义数据结构和业务逻辑的角色。在“数据库建模的业务规则和方法2”这个主题中,我们将深入探讨如何利用业务规则来构建高效、稳定的数据库模型,并...

    Access2010数据库引擎

    AccessDatabaseEngine.exe是微软的64位Access2010数据库引擎可再发行程序包。 运行软件提示错误 :未在本地计算机上注册 Microsoft.ACE.OLEDB.12.0 ,那么就需要安装这个软件了。本程序的作用在于使得在office系统...

    C#+SQL数据库实现学生管理系统

    在本项目中,“C#+SQL数据库实现学生管理系统”是一个典型的基于C#编程语言和SQL数据库技术构建的应用程序,主要用于管理教育机构中的学生信息。这个系统能够帮助管理员进行学生数据的录入、查询、更新和删除等操作...

Global site tag (gtag.js) - Google Analytics