2009-10-05 128 views
1

我们有一个验证系统,强制用户从一组相互关联的字段中选择一组有效的值。相关领域的验证

用户必须填写列表中的第一个值,并且他们选择的值决定了他们可以在第二个字段中选择哪组值。他们在第二个领域的价值选择限制了第三个领域的选择。等等。

所有相关字段在树结构组织的,即,存在从该用户从开始一个根领域,有各种路径向下树从根开始,例如:

 Field1 
    / \ 
    Field2 Field7 
     |  | 
    Field3 etc 
     | 
    Field4 
    / \ 
Field5 Field6 

我们选择使用以下数据库模型实现方式:

ID 
Parent ID 
Field Type 
Delimited Chain Data 


1,null,Field1,F1-1 
2, 1,Field2,F1-1|F2-1 
3, 1,Field2,F1-1|F2-2 
4, 1,Field2,F1-1|F2-3 
5, 1,Field2,F1-1|F2-4 
6, 2,Field3,F1-1|F2-1|F3-1 
7, 2,Field3,F1-1|F2-1|F3-2 
8, 3,Field3,F1-1|F2-2|F3-1 
9, 3,Field3,F1-1|F2-2|F3-3 
etc 

的数据值之间的关系是多对多的,如Field3中的多个值与Field2中的多个值相关。

什么这种结构可以让你做的是两两件事:

  • 轻松查询一组值的特定字段,可以将该字段上方之前选择的数据。
  • 检查在树中给定路径包含了所有的字段

然而有效值,该系统不断壮大。其中一些字段有数千个可能的值。总共有大约30个领域。所以,当你在树上遍历所有可能的有效值集时,有数千万个组合。系统开始在接缝处发生吱吱声,并且数据维护的数值变得困难。

我的问题是:

  • 有没有人碰到类似的相互关联的领域验证问题?你是如何解决它的?
  • 是否有任何产品或开源库(最好是基于Java的)可以帮助解决包含如此大量组合的类似问题?
  • 对替代实施策略有任何建议吗?

感谢。

回答

1

看看规则引擎。他们使用Rete Algorithm加快了进行数百万次比较所需的时间,使用内存而不是CPU。

JBoss Drools可能值得一看。

这是您设置决策逻辑的方式quickest overview

+0

谢谢。我认为规则引擎更像商业规则,例如检查一个人年龄在18至25岁之间? – 2009-10-05 20:20:05

+0

他们当然是为了商业规则,但是你所描述的声音与我有关。 :-) – 2009-10-06 15:13:45

+0

所以你可以问Drool的东西,如“如果字段1的值是A,字段2的值是B,那么字段3的可能值是多少?”? – 2009-10-13 07:36:28

1

如何在PMML文档中描述您的规则并在每个节点上实现具有谓语能力的访问者。

http://www.dmg.org/v4-0/TreeModel.html

PMML涵盖了不少车型,但树模型可能会适合您需求的最佳选择。