Проверка взаимосвязанных полей - PullRequest
1 голос
/ 06 октября 2009

У нас есть система проверки, которая заставляет пользователей выбирать из допустимого набора значений в наборе взаимосвязанных полей.

Пользователь должен заполнить первое значение в списке, и какое бы значение оно не выбрало, оно определяет, какой набор значений он сможет выбрать во втором поле. Их выбор значения во втором поле ограничивает набор вариантов в третьем. И так далее.

Все взаимосвязанные поля организованы в виде древовидной структуры, то есть есть одно корневое поле, с которого пользователь начинает, и есть различные пути вниз по дереву, начиная с корня, например:

        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), которые помогают с подобными проблемами, содержащими такие большие объемы комбинаций?
  • Есть ли у кого-нибудь предложения по альтернативным стратегиям реализации?

Спасибо.

Ответы [ 2 ]

1 голос
/ 06 октября 2009

Как насчет описания ваших правил в документе PMML и реализации посетителя с поддержкой предикатов на каждом узле.

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

PMML охватывает довольно много моделей, но модель дерева может лучше всего соответствовать вашим потребностям.

1 голос
/ 06 октября 2009

Взгляните на правила двигателей. Они используют алгоритм Rete , чтобы ускорить время, необходимое для миллионов сравнений, используя память вместо процессора.

JBoss Слюни , вероятно, стоит посмотреть.

Вот краткий обзор способа настройки логики принятия решений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...