Armazenar regra lógica em BD

11 respostas
J

Oi pessoal…Desculpe se este tópico está na categoria errada, mas não consegui descobrir uma categoria mais adequada para ele.

Eu tenho que armazenar regras lógica no BD. Estas regras serão embarcadas em uma aplicação de uma empresa que quer que todos os dados manipulados pela aplicação estejam em BD, inclusive as regras.

Quando eu falo de regras, podemos pensar em estruturas como as utilizadas pelo drools, por exemplo.

Estas regras são formadas por duas partes: o antecedente (ou condição) e o consequente.

Ambas as partes são expressões lógicas formadas por termos do domínio, unidos por consctivos lógicos (AND ou OR). Os termos do domínio são estruturas do tipo Conceito:atributo:operador:valor, que neste aplicação são ::operador:valor.

Para dar um exemplo, vamos supor a tabela Empresa a tabela tipo de empresa e regras sobre esta tabela. As tabelas seriam:

Empresa:
-ID: identificador
-QTD_FUNC: quantidade de funcionários
-RECEITA: receita anual
-QTD_FILIAIS_INTERNACIONAIS: quantidade de filiais em outros países

Tipo_De_Empresa:
-ID: identificador da empresa
-TAMANHO:
-NATUREZA:

Possíveis regras seriam:

Empresa:QTD_FUNC>1000 OR Empresa:RECEITA>1000000 -> Tipo_De_Empresa:TAMANHO=GRANDE

Empresa:QTD_FILIAIS_INTERNACIONAIS>0 -> Tipo_De_Empresa:NATUREZA=MULTINACIONAL

A primeira regra relaciona quantidade de funcionários ou receita para estimar o tamanho da empresa. A segunda determina se a empresa é multinacional ou não, conforme a quantidade de filiais internacionais dela.

Pois bem. Alguém tem uma idéia de como eu posso armazenar essas regras em BD? Eu até pensei em usar uma estrutura baseada em grafos, mas me pareceu confuso.

11 Respostas

Anime

Olá,

Você quer armazenar as regras e executá-las,seria isso? :roll:

Alexandre_Saudate

Não seria melhor você usar uma engine de regras especializada, tipo o Drools? Uma regra dessas ficaria mais ou menos assim:

rule "TamanhoEmpresa"
when empresa:Empresa(qteFuncionarios > 1000 || receita > 1000000)
then
empresa.setTipo(Tamanho.GRANDE);
update(empresa);
end

[]´s

Anime

asaudate:
Não seria melhor você usar uma engine de regras especializada, tipo o Drools?

[]´s

Oi,
O que é Drools?

Alexandre_Saudate

Anime:
asaudate:
Não seria melhor você usar uma engine de regras especializada, tipo o Drools?

[]´s

Oi,
O que é Drools?

É uma engine especializada em definição de regras de negócio. É como se fosse um texto que fosse compreensível por analistas de negócio e, ao mesmo tempo, fosse executável. Você passa pra ele o texto, tipo esse que eu passei aí em cima, ele compila. Depois, você passa pra ele os dados (no contexto de regras de negócio, são chamados “fatos”) e ele interpreta de acordo com a regra, dando o resultado esperado. E o legal é que ele pode ser executado tanto num contexto web como standalone, além de ser super rápido. O link do drools é esse, dê uma olhada.

[]´s

Anime

Novidade pra mim,estou tentando entender, rsrs…

Seria mais ou menos uma visão ou trigger? :oops:

Alexandre_Saudate

Anime:
Novidade pra mim,estou tentando entender, rsrs…

Seria mais ou menos uma visão ou trigger? :oops:

Nenhum dos dois =P

O Drools não fica no banco. Ele é um framework.

[]´s

Anime

asaudate:
Anime:
Novidade pra mim,estou tentando entender, rsrs…

Seria mais ou menos uma visão ou trigger? :oops:

Nenhum dos dois =P

O Drools não fica no banco. Ele é um framework.

[]´s

rsrs,ta bom,acho melhor eu estudar…Obrigada…

J

Anime:
Olá,

Você quer armazenar as regras e executá-las,seria isso? :roll:

Isso, vou precisar executá-las depois, sim…

J

Pois é…Usar engines como o drools ou o jess seria uma mão na roda. Mas é parte das restrições impostas pela empresa em que a aplicação vai rodar que estas regras sejam armazenadas explicitamente no BD. Ou seja, não posso nem criar um objeto e armazenar como um blob. Então, estava pensando em não usar nenhum engine de regras e fazer meu próprio motor de inferências…Já consegui fazer isso representando as regras como grafos. Este grafo tem nodos relacionados por arestas. Tenho nodos evidência e nodos conectivos lógicos. Está funcionando. O problema é que a representação em BD fica muito complicada.

Alexandre_Saudate

Oras, armazene as regras como texto, ou outra forma qualquer (como várias entidades, mesmo), e depois traduza para regras. Fiz isso recentemente num projeto, e o resultado ficou muito bom.

[]´s

Anime

Jokabeludoido:
Anime:
Olá,

Você quer armazenar as regras e executá-las,seria isso? :roll:

Isso, vou precisar executá-las depois, sim…

Eu tinha pensado em triggers,mas acho que é mais facil dessa outra maneira :wink:

Criado 6 de setembro de 2010
Ultima resposta 7 de set. de 2010
Respostas 11
Participantes 3