【问题标题】:Validation of interrelated fields验证相关领域
【发布时间】:2009-10-05 20:05:01
【问题描述】:

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

用户必须填写列表中的第一个值,他们选择的任何值都决定了他们可以在第二个字段中选择哪一组值。他们在第二个字段中选择的值限制了第三个字段中的选择集。以此类推。

所有相互关联的字段都以树状结构组织,即用户从一个根字段开始,从根开始沿着树向下有各种路径,例如:

        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)可以帮助解决包含如此大量组合的类似问题?
  • 对替代实施策略有什么建议吗?

谢谢。

【问题讨论】:

    标签: java validation jakarta-ee


    【解决方案1】:

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

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

    PMML 涵盖了很多模型,但树模型可能最适合您的需求。

    【讨论】:

      【解决方案2】:

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

      JBoss Drools 可能值得一看。

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

      【讨论】:

      • 谢谢。我认为规则引擎更多地用于诸如业务规则之类的事情,例如检查一个人的年龄是否在 18 到 25 岁之间?
      • 它们当然适用于业务规则,但您所描述的内容与我有关。 :-)
      • 所以你可以问 Drool 诸如“如果字段 1 的值为 A,字段 2 的值为 B,那么字段 3 的可能值集是多少”?