È utile mantenere le entità di 'definizione' in un database o usare un enum?

5

In un progetto su cui ho iniziato a lavorare, il database contiene molte tabelle FooDefinition che si comportano come un enum. È un progetto C # che utilizza Entity Framework anche se non è centrale nella domanda.

Le entità hanno un ID, un campo Nome stringa e un campo Tipo int convertito in enum. Ad esempio:

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
}

La tabella FooDefinition viene popolata con un'entità per ogni valore enum definito e non cambia a meno che non sia aggiunto un nuovo valore enum.

Sto facendo fatica a vedere l'uso in questo schema semplicemente usando l'enum direttamente anziché entrare in questa tabella di definizione. Quali sono i possibili vantaggi di questo approccio?

    
posta AlexFoxGill 21.07.2014 - 10:51
fonte

5 risposte

4

Ci sono diversi problemi che devono essere risolti.

Categorie

L'uso usuale delle categorie è identificare classi o gruppi di record. Se crei report, se i valori sono mantenuti in una tabella di categorie, è facile per i generatori di report o per i data warehouse esterni classificare correttamente gli articoli.

Control Flavors

Molto spesso, i valori controllano il funzionamento del programma, cambiando l'interpretazione dei dati o influenzando altre decisioni. Per questi, tendo a favorire le enumerazioni. Poiché questi valori influiscono direttamente sul funzionamento del programma, la modifica o l'aggiunta di valori è associata al codice nuovo o modificato, quindi la ricostruzione e la distribuzione del software sono quasi sempre necessarie.

Descrizioni e valori aumentati

I valori delle categorie sono raramente interessanti per gli umani; non metterei mai "1", "2", "3" in un elenco a discesa per indicare "Avanti", "Indietro" o "Fermato". Avere un campo descrittivo per mostrare i valori selezionabili dall'utente corrispondenti al valore in programma è abbastanza importante. Allo stesso modo, avere una forma abbreviata (per i drop down) e una forma lunga (per i generatori di report) è anche molto utile.

C #, a mio avviso, non consente di aumentare il valore di enum . Le versioni recenti di Java fanno, che ho trovato abbastanza utile. Per un'implementazione C #, è meglio usare una tabella di categorie per qualsiasi valore di questo tipo che abbia una rappresentazione esterna.

Categorie strutturate

Le categorie sono raramente non qualificate. Una categoria di PERIODICO potrebbe avere sottocategorie di ARBITRO e NON RISCOSSO. Se il tuo software deve essere in grado di raccogliere dati sui periodici, allora hai bisogno di un modo per ottenere le sottocategorie. Utilizzare una tabella per mantenere l'elenco delle categorie, con le relazioni genitore-figlio, è probabilmente il modo migliore per farlo.

Combina e abbina

Spesso, ho combinato entrambi gli approcci per una categoria. Usando un tipo enumerato, posso fare dichiarazioni di switch e controllare il flusso. Mappare il valore sottostante del tipo enumerato su una chiave primaria del database richiede un po 'di attenzione. Questo metodo è molto utile quando è necessario modificare regolarmente il testo di sapore di una categoria, poiché ciò non influirà sul funzionamento del programma.

Quindi, il contenuto della tabella delle categorie viene caricato all'avvio dell'applicazione. Il valore del tipo enumerato può essere utilizzato per indicizzare questa tabella nei rari casi in cui è necessario fare riferimento a un aspetto della categoria, ad esempio il nome breve.

    
risposta data 22.07.2014 - 18:10
fonte
5

Vedo tre motivi

1) Come dice jimwise, possono essere modificati senza ricompilare. Se vengono effettivamente utilizzati come valori di enumerazione nell'applicazione (fai qualcosa se è uguale a quello), solo la cosa utile da cambiare senza doverne ricorrere è il loro nome.

2) possono contenere più di un nome e un id, ma due non possono avere lo stesso id a differenza delle enumerazioni in stile C #

3) possono essere utilizzati in query / viste per rendere i risultati più leggibili. È meglio vedere la richiesta con stato fallito rispetto allo stato 3.

    
risposta data 21.07.2014 - 17:17
fonte
1

Il vantaggio principale che vedo è che è possibile aggiungere nuovi valori enum con un'operazione di database, senza compilare e distribuire una nuova versione dell'applicazione. Trattando il set di "Foos" che può esistere come dati, l'impatto sull'applicazione in esecuzione di aggiungere nuovi tipi di "Foo" è ridotto.

    
risposta data 21.07.2014 - 15:24
fonte
0

In realtà dovevo solo fare una modifica che collegasse due di queste tabelle insieme, il che avrebbe dovuto essere fatto in codice altrimenti (e poi richiesto un rilascio di codice ogni volta che questa relazione cambiava). Quindi suppongo che una ragione sia l'estensibilità nel salvataggio dei dati su queste enumerazioni.

    
risposta data 22.07.2014 - 12:18
fonte
0

Ho visto questo usato in Microsoft Dynamics CRM. Consente agli utenti di personalizzare rapidamente elenchi a discesa e simili rapidamente e facilmente.

A meno che tu non intenda che un'applicazione sia ampiamente modificabile dagli utenti, non sono sicuro che vorrai seguire questa strada, poiché potrebbe comportare una maggiore complessità nel lavorare con i dati del back-end.

    
risposta data 22.07.2014 - 17:20
fonte

Leggi altre domande sui tag