хранение и анализ логических выражений в базе данных - PullRequest
3 голосов
/ 15 ноября 2010

это дополнительный вопрос для моего предыдущего вопроса какой шаблон проектирования подходит для этого требования рабочего процесса? . Я хотел бы знать, каков наилучший способ сохранить логическое выражение в базе данных, а затем оценить его во время выполнения без особых усилий. У меня есть требование, когда набор заданий нужно выполнять с экрана каждый конец месяца, и решение о том, можно ли выполнить задание, зависит от результатов предыдущих заданий. поэтому я должен быть в состоянии сохранить выражение в базе данных что-то вроде E = (A или B) и (C или D) (может быть любое сложное вложенное выражение). это означает, что E может работать, если A или B успешны, а C или D успешны. как это может быть представлено в базе данных и проанализировано, и условие будет оценено позже?

думает сделать это так (еще не проверено)
если "Работа E = (A и B) или (C и D)". сохранить его в виде древовидной структуры в таблице

JobId DependentJobId SuccessJobId FailureJobId
E        A             B             C              
E        C             D             0
E        D             1             0
E        B             1             0

это означает, что «если A успешен, проверьте B, иначе проверьте C», «если C успешен, проверьте D». процесс начинается с самого высокого узла, у которого нет «DependentJobId», и останавливается на конечном узле. Я использую фиктивные идентификаторы заданий "1" для успеха и "0" для неудачи. если конечный узел равен нулю, то задание разрешается запускать. не уверен, как лучше я могу оценить это в T-SQL. Возможно, мне придется использовать рекурсивную функцию.

Используемая технология: ASP.NET 3.5, C # 3.0, SQL Server 2008

.

Ответы [ 4 ]

6 голосов
/ 15 ноября 2010

Вы можете сохранить выражения в виде строк в базе данных, а затем проанализировать их во время выполнения, используя либо набор пользовательских функций, либо существующий механизм.Для достижения этой цели в предыдущих проектах я использовал следующее:

FLEE (быстрый легкий анализатор выражений)

Dynamic Linq

Я бы сказал, что с Dynamic Linq проще, поскольку вы можете по существу создать предложение where с использованием знакомого синтаксиса Linq / C # и сохранить его в виде строки в базе данных.Я использовал FLEE в проектах, где я хотел создать свой собственный простой язык запросов, однако многие из них я, вероятно, теперь мог бы получить, используя Dynamic Linq.

1 голос
/ 16 ноября 2010

И у макросов, и у RC_Cleland есть отличные ответы.Единственное, что я хотел бы добавить, - это возможность использовать Windows Workflow Foundation для написания рабочего процесса для требований обработки.

1 голос
/ 16 ноября 2010

Мне кажется, вы пытаетесь записать бизнес-правило в таблицу.Я считаю, что написание кода для заполнения таблицы лучше потратить на написание правила в хранимой процедуре.Хранимая процедура может выбирать состояние выполнения, дату выполнения и т. Д. Заданий из MSDB.Если есть условия, которые не являются заданиями агента SQL, результаты могут быть сохранены в таблице, содержащей имя задания, статус задания и дату задания.Хранимая процедура может использовать простое присвоение переменной для извлечения всех значений, а затем обрабатывать оператор бизнес-логики с использованием битовых операторов TSQL.

& (Bitwise AND) (Transact-SQL) 
~ (Bitwise NOT) (Transact-SQL) 
| (Bitwise OR) (Transact-SQL) 
^ (Bitwise Exclusive OR) (Transact-SQL)

Ваш пример E = (A и B) или (C и D)стать

Select @E=(@A & @B) | (@C & @D)

Попробуйте приведенный ниже код и посмотрите, будет ли он работать в соответствии с вашим бизнес-правилом.

declare @E bit
declare @Bit1 bit
declare @Bit2 bit
declare @Bit3 bit
declare @Bit4 bit
declare @Bit5 bit
SET @Bit1 = 1
SET @Bit2 = 0
SET @Bit3 = 1
SET @Bit4 = 'fALSE'
SET @Bit5 = 0

SELECT @Bit1, @Bit2, @Bit3, @Bit4, @Bit5

SELECT @Bit1 & @Bit2


 Select @E=(@Bit1 & @Bit2) | (@Bit3 & @Bit4)
 Select @E as [E value]
0 голосов
/ 19 ноября 2010

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

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