Хранить деревья выражений в базе данных - PullRequest
7 голосов
/ 17 февраля 2011

Мне нужно хранить логические условия в базе данных.например: (condition1 || condition2) && condition3 должно храниться в базе данных.

Я планирую создать таблицу [ ExpressionTree ] для обработки структуры:

Id
condition
combinationId
nextId(FK->[Condition2Combination.Id])
operator (AND, OR, null)

If (условие1|| condition2) && condition3 в таблице [ExpressionTree], записи должны быть:

Id  conditionId combinationId nextId  operator
1  condition1   combination1  2       OR
2  condition2   combination1  3       AND
3  condition3   combination1  null    null

Но решение не хорошее, что вы предлагаете?Спасибо!

Ответы [ 2 ]

10 голосов
/ 17 февраля 2011

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

3 голосов
/ 17 февраля 2011

Я не вижу древовидную структуру в вашем решении.В частности, я не думаю, что ваш столбец nextId способен работать с выражениями, в которых есть скобки.Но я мог что-то упустить.

Я предлагаю вам взглянуть на способ выражения древовидных структур, который известен как техника вложенного множества.В этом методе столбец «следующего идентификатора» заменяется двумя столбцами, которые называются «левый идентификатор» и «правый идентификатор», которые могут указывать, какие под улицы находятся внутри других поддеревьев.Это слишком упрощенная сводка того, что вы собираетесь найти.

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

Почему эти данные в базе данных?

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