É útil manter as entidades de 'definição' em um banco de dados versus usar um enum?

5

Em um projeto no qual comecei a trabalhar, o banco de dados tem muitas tabelas FooDefinition que agem como um enum. É um projeto em C # usando Entity Framework, embora isso não seja central para a pergunta.

As entidades têm um ID, um campo de nome de cadeia e um campo de tipo de int que é convertido para um enum. Por exemplo:

public class FooDefinition
{
    public int Id { get; set; }
    public string Name { get; set; }
    public FooType FooType { get; set; } // this is an enum that defines the entity
}

A tabela FooDefinition é preenchida com uma entidade para cada valor de enum definido e não é alterada a menos que haja um novo valor de enum adicionado.

Estou lutando para ver o uso desse padrão apenas usando o enum diretamente, em vez de entrar nesta tabela de Definição. Quais são os possíveis benefícios dessa abordagem?

    
por AlexFoxGill 21.07.2014 / 10:51
fonte

5 respostas

4

Existem vários problemas que precisam ser resolvidos.

Categorias

O uso usual de categorias é identificar classes ou grupos de registros. Se você criar relatórios, ter os valores mantidos em uma tabela de categorias facilitará que geradores de relatórios ou armazenamentos de dados externos categorizem itens corretamente.

Sabores de controle

Muitas vezes, os valores controlam a operação do programa, alterando a interpretação dos dados ou influenciando outras decisões. Para estes, tendem a favorecer enumerações. Como esses valores afetam diretamente a operação do programa, a alteração ou a adição de valores acompanha o código novo ou modificado, portanto, a reconstrução e a implantação do software são quase sempre necessárias.

Descrições e valores aumentados

Os valores de categoria raramente são de interesse para os humanos; você nunca colocaria "1", "2", "3" em uma lista suspensa para indicar "Forward", "Backward" ou "Stopped". Ter um campo descritivo para mostrar valores selecionáveis pelo usuário correspondentes ao valor no programa é bastante importante. Da mesma forma, ter um formulário curto (para drop downs) e um formulário longo (para geradores de relatórios) também é bastante valioso.

C #, no meu entender, não permite aumentar o valor de um enum . Versões recentes do Java fazem, o que eu achei bastante útil. Para uma implementação em C #, provavelmente é melhor usar uma tabela de categoria para qualquer valor que tenha uma representação externa.

Categorias estruturadas

As categorias raramente são desqualificadas. Uma categoria de PERIÓDICO pode ter subcategorias de ÁRBITRO e NÃO-RECRUTADO. Se o seu software precisar coletar dados sobre periódicos, você precisará de uma maneira de reunir as subcategorias. Usar uma tabela para manter a listagem de categorias, com relacionamentos pai-filho, é provavelmente a melhor maneira de conseguir isso.

Misture e combine

Frequentemente, eu combinei as duas abordagens para uma categoria. Usando um tipo enumerado, posso fazer switch declarações e controlar o fluxo. Mapear o valor subjacente do tipo enumerado para uma chave primária do banco de dados requer um pouco de cuidado. Esse método é mais útil quando você precisa alterar regularmente o texto de sabor de uma categoria, pois isso não afetará a operação do programa.

Assim, o conteúdo da tabela de categorias é carregado na inicialização do aplicativo. O valor do tipo enumerado pode ser usado para indexar essa tabela nos casos raros em que você precisa se referir a um aspecto da categoria, como o nome abreviado.

    
por 22.07.2014 / 18:10
fonte
5

Eu vejo três razões

1) Como diz o jimwise, eles podem ser alterados sem recompilar. Se eles forem realmente usados como valores de enum no aplicativo (faça algo se for igual a isso), somente a coisa útil para alterar sem recommpilar é o nome deles.

2) eles PODEM conter mais de nome e id, mas dois não podem ter o mesmo id ao contrário de enums no estilo C #

3) eles podem ser usados em consultas / visualizações para tornar os resultados mais legíveis para humanos. É melhor ver a solicitação com estado com falha do que com o estado 3.

    
por 21.07.2014 / 17:17
fonte
1

A principal vantagem que vejo é que você pode adicionar novos valores enum com uma operação de banco de dados, sem compilar e implantar uma nova versão de seu aplicativo. Ao tratar o conjunto de "Foos" que pode existir como dados, o impacto na aplicação em execução da adição de novos tipos de "Foo" é mantido pequeno.

    
por 21.07.2014 / 15:24
fonte
0

Na verdade, só tive que fazer uma alteração que ligasse duas dessas tabelas juntas, o que teria de ter sido feito no código de outra forma (e, em seguida, exigia uma liberação de código sempre que esse relacionamento mudasse). Então, suponho que uma razão seja a extensibilidade para salvar dados sobre essas enumerações.

    
por 22.07.2014 / 12:18
fonte
0

Eu já vi isso usado no Microsoft Dynamics CRM. Ele permite que os usuários personalizem listas suspensas e coisas semelhantes de maneira rápida e fácil.

A menos que você pretenda que um aplicativo seja extensivamente modificável pelos usuários, não tenho certeza se você gostaria de seguir esse caminho, pois isso poderia levar a uma complexidade extra para trabalhar com os dados do back-end.

    
por 22.07.2014 / 17:20
fonte