Я долго об этом думал. Вот к чему я пришел:
Существует таблица правил:
rule_id int,
field1 varchar,
rule1_id int,
operand varchar, --whatever, can be int, if operand is described in other table.
field2 varchar,
rule2_id int
Ваше примерное правило можно выразить так:
rule_id field1 rule1_id operand field2 rule2_id
1 'price' null '>' '100' null
2 'color' null '=' 'red' null
3 null 1 'and' null 2
4 'price' null '>' '50' null
5 'color' null '=' 'green' null
6 null 4 'and' null 5
7 null 3 'or' null 6
Затем вы будете ссылаться на сложное правило с rule_id
= 7. Чтобы разрешить это правило, каждое правило должно быть разрешено рекурсивно. field
может быть полем в базе данных, а также operand
. После этого вы сможете формировать запросы SQL из этих сохраненных данных. Его также легко загрузить и представить в элементах управления, поэтому пользователь может редактировать это правило, используя поля со списком (HTML <select>
) и прочее.