Pergunta

Eu tenho uma pergunta sobre as melhores práticas sobre como se deve abordar o armazenamento de estados de fluxo de trabalho complexos para o processamento de tarefas em um banco de dados. Eu estive procurando on-line sem sucesso, então eu percebi que eu iria pedir à comunidade o que eles pensavam que era melhor.

Esta questão sai do mesmo exemplo "BoxItem" Eu dei uma pergunta antes. Este "BoxItem" está sendo monitorado no meu sistema como várias tarefas são executadas nele. A tarefa pode ter lugar ao longo de vários dias e com a interação humana, de modo que o estado da BoxItem deve ser persistentes. Quem fez a tarefa (se aplicável), e quando a tarefa foi feito também devem ser monitorados.

Em primeiro lugar, eu me aproximei isso adicionando três campos para a tabela de "BoxItems" para cada tarefa humana-interativo que precisava ser feito:

TaskName completo

Data TaskName completo

Usuário TaskName completo

Isso funcionou quando o fluxo de trabalho era simples ... mas agora que tem crescido a um processo complexo (> 10 possíveis interações humanas no fluxo ... cerca de metade dos quais são opcionais, e pode ou não ser feito para o BoxItem, o que resultou em me começando a adicionar "do TaskName " campos, bem como para as tarefas opcionais), eu descobri que o que deveria ter sido uma simples tabela agora tem 40 ou mais campo consagrado inteiramente para a retenção desta informação estado.

Eu me pergunto se não há uma maneira melhor de fazê-lo ... mas eu estou em uma perda.

Meu primeiro pensamento foi para fazer uma tabela genérica "BoxItemTasks" que definiu as tarefas que podem ser feitas em uma determinada caixa, mas eu ainda seria necessário para salvar as informações de data e usuário individualmente, por isso realmente não ajuda.

Meu segundo pensamento foi que talvez ele não importa, e não deve se preocupar se esta tabela tem 40 ou mais campos dedicados à retenção do estado ... e talvez eu esteja apenas sendo paranóico. Mas parece que isso é um monte de informações para reter.

De qualquer forma, eu estou em uma perda, tanto quanto o que uma terceira opção poderia ser, ou se uma das duas opções acima é realmente razoável. Eu posso ver este fluxo de trabalho potencialmente ficando ainda mais complexa no futuro, e para cada nova tarefa vou necessidade de adicionar 3-4 campos apenas para apoiar o rastreamento dele ... parece que ele está fora de controle.

O que você faria nessa situação?

Gostaria de salientar que esta é a manutenção de um sistema existente, uma que foi construída sem um ORM, então eu não posso deixá-lo até o ORM para cuidar dela.

EDIT:

Kev, você está falando sobre fazer algo como isto:

BoxItems

(PK) BoxItemID

(Outras coisas irrelevantes)

BoxItemActions

(PK) BoxItemID

(PK) BoxItemTaskID

IsCompleted

DateCompleted

UserCompleted

BoxItemTasks

(PK) TaskType

Descrição (se mesmo necessário)

Hmm ... que iria trabalhar ... isso representaria uma necessidade de mudança como eu Actualmente, a abordagem a fazer consultas SQL para ver quais itens estão em que estado, mas a longo prazo algo como isso parece que poderia funcionar melhor (sem ter que fazer uma alteração de design fundamentais como a idéia de serialização representa ... embora se eu tivesse tempo, eu gostaria de fazê-lo dessa maneira que eu penso.).

Então é isso o que você estava mencionando Kin, ou estou fora nele?

EDIT: Ah, eu vejo sua idéia, bem como com a "Última Ação" para determinar o estado atual ... I like it! Eu acho que o trabalho força para mim ... eu poderia ter de mudar um pouco (porque em algumas tarefas pontuais acontecem simultaneamente), mas a idéia parece ser um bom!

EDIT FINAL: Então, em suma, se alguém está olhando isso no futuro com a mesma pergunta ... parece que a abordagem de serialização seria útil se o seu sistema tem a informação pré-carregada em alguma interface onde é queryable (ou seja, não chamar diretamente o próprio banco de dados, como o sistema ad-hoc que estou trabalhando faz),mas se você não tem isso, a idéia adicional mesas parece que ele deve funcionar bem! Obrigado a todos por suas respostas!

Foi útil?

Solução

Se eu estou entendendo corretamente, eu gostaria de acrescentar tabela de BoxItemTasks (apenas uma tabela de enumeração, certo?), Então uma tabela BoxItemActions com chaves estrangeiras para BoxItems e para BoxItemTasks para o tipo de tarefa que é. Se você quiser fazer com que uma determinada tarefa só pode ser realizada uma vez em um item da caixa particular, basta fazer os (Itens + tarefas) par de colunas ser a chave primária de BoxItemActions.

(Você colocou-o muito melhor do que eu fiz, e elogios para interpretar corretamente o que eu estava dizendo. O que você escreveu é exatamente o que eu estava imaginando.)

Como para determinar o estado atual, você poderia escrever um gatilho em BoxItemActions que atualiza um único BoxItems.LastAction coluna. Para ações simultâneas, seu gatilho poderia ter apenas casos especiais para decidir qual ação se recência.

Outras dicas

Como a resposta anterior sugeriu, eu iria quebrar a sua tabela em vários.

BoxItemActions, contendo uma lista de ações que o fluxo de trabalho precisa passar por, criado cada vez que um BoxItem é criado. Nesta tabela, você pode acompanhar as datas detalhados \ times \ usuários de quando cada tarefa foi concluída.

Com este tipo de aplicação, sabendo onde a caixa é ir próxima pode ficar muito complicado, assim que ter um 'Map' das etapas restantes para o Box irá revelar-se bastante útil. Assim, essa tabela pode agrupar como um louco, centenas de linhas por caixa, e vai ainda ser muito fácil de consulta.

Ele também torna possível ter 'caminhos diferentes' que podem ser facilmente alterados. Uma tabela de dados mestre de 'caminhos' através do fluxo de trabalho é uma solução, em que à medida que cada caixa é criado, o utilizador tem de seleccionar qual 'caminho' a caixa vai seguir. Ou você pode configurar para que quando o usuário cria a caixa, eles selecionar tarefas são necessárias para essa caixa particular. Depende do nosso problema de negócios.

Como cerca de um híbrido da serialização e os modelos de banco de dados. Tem um documento XML que serve como documento de fluxo de trabalho mestre, que contém um nó para cada etapa com atributos e elementos que detalhá-lo do nome, a ordem no processo, as condições para se é opcional ou não, etc. Mais importante cada nó etapa pode ter um Unique ID passo.

Então, em seu banco de dados você tem uma estrutura simples de dois mesa. Os BoxItems tabela armazena seus dados básicos BoxItem. Em seguida, uma mesa BoxItemActions bem como na solução que você marcado como a resposta.

É essencialmente similar à solução aceita como a resposta, mas em vez de uma tabela BoxItemTasks para armazenar a lista principal de tarefas, você pode usar um documento XML que permite mais alguma flexibilidade para a definição de fluxo de trabalho real.

Por que vale a pena, no BizTalk eles "Desidratar" longa execução padrões de mensagens (fluxos de trabalho e similares), serialização binária-los para o banco de dados.

Eu acho que eu serializar o objeto de fluxo de trabalho para XML e armazenar no banco de dados com uma coluna de ID. Pode ser mais difícil de relatar, mas parece que ele pode trabalhar no seu caso.

Para este tipo de problema, considere o esquema de banco de dados mostrado na http: // www .databaseanswers.org / data_models / fluxo de trabalho / index.htm que modela uma série de eventos em um processo busniess.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top