Estou criando um programa que postará dados em um banco de dados e encontrei um padrão que tenho certeza de que é familiar: Uma pequena tabela com os valores fixos mais prováveis (muito prováveis) que servem como enumeração. Então, suponha a seguinte tabela chamada Status
:
Status Id Descrição -------------- 0 Não processado 1 Pendente 2 Processado 3 Erro
No meu programa, preciso determinar um ID de status para outra tabela ou possivelmente atualizar um registro com um novo ID de status.
Eu poderia codificar os IDs de status em uma enumeração e espero que ninguém mude o banco de dados. Ou eu poderia pré-buscar os valores com base na descrição (hardcoding assim que em vez disso).
Qual seria a abordagem correta para manter esses dois enum e table sincronizados?
Respostas:
Eu codificaria a enumeração dentro do seu programa, pois suspeito que esses status diferentes afetem a lógica do seu programa. Se você tem um novo status, como o seu programa deve reagir a esse novo status?
Como o banco de dados faz parte do seu aplicativo, acho que não faria sentido afetar um sem consultar o outro, meio que falar.
fonte
pending
seria o ID . É claro que ter umaStatus
tabela fornece integridade referencial, mas esse é o ponto que estou tentando fazer.Status
tabela não deve ser considerada dinâmica durante o tempo de execução do aplicativo e, portanto, acho que você não deve lê-la como tal.Normalmente, eu carregaria esses dados em um cache estático (geralmente em um HashMap ou algo assim) quando o aplicativo é iniciado. Evita ter que recompilar apenas porque o enum foi modificado de alguma maneira.
fonte
Como esses são status, eles devem ser codificados no aplicativo para garantir que nenhuma alteração no banco de dados corrompa seu programa (pelo menos não facilmente). Isso é importante porque todos os status que devem ser adicionados precisam ser codificados primeiro e não simplesmente adicionados ao banco de dados.
Você ainda deve ter esses valores de status gravados no banco de dados com suas descrições corretas, caso precise extrair um relatório, por exemplo.
Normalmente, tenho um pequeno trecho de código que se conectará ao banco de dados e verificará se os status listados em uma tabela específica têm todos os mesmos valores de id / nome que eu codifiquei na memória. Se não corresponderem, abortarei a execução do software.
Dependendo das suas necessidades, convém implementar comportamentos ligeiramente diferentes, mas no geral é uma boa ideia ter esses status codificados de qualquer maneira.
fonte
Temos problemas semelhantes no meu projeto (código legado, viva!) O grande problema é que "as tabelas enum nunca mudam" até que o código seja alterado. Eu tenho duas estratégias para mitigar as quais eu tenho migrado lentamente.
Primeiro, e melhor, é eliminar as referências diretas a esses valores sempre que possível. Sempre pergunte: "por que preciso usar diretamente o valor de enum?" Em muitos casos, isso é um sinal de que o código tem muitas suposições codificadas ou está tentando fazer muita manipulação nos dados. Veja se você não pode estabelecer melhores relacionamentos no banco de dados ou um código mais flexível para lidar com o que está sendo manipulado.
Quando isso não funciona, vou para o plano B: geração de código. Como as tabelas mudam com pouca frequência e publicamos novas compilações regularmente, um gerador de código pode ler as tabelas enum e escrever o código enum. Essa biblioteca gerada dinamicamente é usada no projeto. Se o banco de dados mudar, a próxima compilação não será compilada, o que é muito melhor do que obter erros de tempo de execução misteriosos.
fonte