Come dovrei rappresentare un tipo enumerato in un database relazionale?

12

Sto lavorando allo sviluppo di un database relazionale che tenga traccia delle transazioni che si verificano su un dispositivo su cui sto lavorando per la mia azienda. Ci sono diversi tipi di transazioni che potrebbero verificarsi sul dispositivo, quindi abbiamo un campo "trans_type" in una delle nostre principali tabelle dei record. Il mio gruppo ha deciso di rendere il tipo di questo campo un numero intero e di trattarlo come un tipo enumerato. La mia intuizione mi dice che sarebbe una buona idea rendere questo campo una stringa in modo che i dati del nostro database fossero più leggibili e utilizzabili. I miei colleghi sembrano essere preoccupati che ciò causerebbe più problemi di quanti ne valga la pena. I confronti tra stringhe sono troppo costosi e la possibilità di errori di battitura è troppo grande per una barriera.

Quindi, secondo te, quando si ha a che fare con un campo in un database relazionale che è essenzialmente un valore enumerato, è una decisione progettuale migliore per rendere questo campo un intero o una stringa? O c'è qualche altra alternativa che ho trascurato?

Nota: i tipi enumerati espliciti non sono supportati dal database che stiamo utilizzando. E il software che stiamo sviluppando che si interfaccia con questo database è scritto in C ++.

    
posta c.hughes 09.01.2013 - 21:11
fonte

4 risposte

25

I tipi enumerati dovrebbero essere una tabella separata nel tuo database che abbia un numero identificativo e un nome di stringa e qualsiasi altra colonna che potresti trovare utile. Quindi ogni tipo esiste come una riga in questa tabella. Quindi nella tua tabella stai registrando le transazioni il campo "trans_Type" dovrebbe essere una chiave esterna per la chiave di quella tabella di riferimento. Questa è una pratica standard nella normalizzazione del database.

In questo modo hai memorizzato la stringa di un nome ufficiale, hai usato i confronti tra numeri per le prestazioni e hai l'integrità referenziale che ogni transazione ha un tipo valido.

    
risposta data 09.01.2013 - 21:21
fonte
4

Una pratica comune è creare una tabella trans_types , quindi fare riferimento alla tabella principale con la chiave esterna denominata trans_type_id . Ciò garantisce che i tuoi record facciano riferimento solo a tipi enumerati validi.

Esempio:

trans_type
----------
  id
  name

transactions
------------
  id
  trans_date
  details
  trans_type_id (FK to trans_type.id)

Dati di esempio:


trans_type

ID |  NAME
----------
1  |  SUBMIT
2  |  CANCEL


transactions

ID | trans_date  | trans_type_id
---------------------------------
1  | 2012-12-31  | 1
2  | 2013-01-09  | 2
    
risposta data 09.01.2013 - 21:21
fonte
3

Se i valori arrivano nel database come numeri interi, memorizzali in questo modo. Non è necessario mettere l'overhead della conversione in stringhe mentre si scrive nel database. Puoi sempre fare riferimento a una tabella di ricerca con i valori stringa / testo (Più normalizzato).

Questo ha il vantaggio di aggiornare il valore della stringa in una singola posizione invece di eseguire una sorta di routine di aggiornamento. Invece di 1="Rosso" potrebbe essere uguale a "Realmente rosso"

Questo non è l'ideale per il reporting delle prestazioni rispetto al solo bisogno di una tabella con valori stringa (Denormalized). Un indice su questo campo renderebbe le prestazioni abbastanza buone.

La maggior parte dei RDBMS consentirà una potenza sufficiente. Sebbene la tua idea di poter "leggere" il tavolo nella sua semplice forma di dati, unirsi a un tavolo non è un grosso problema. Prendi l'abitudine di usare una vista o qualche oggetto simile.

    
risposta data 09.01.2013 - 21:24
fonte
2

Non sono d'accordo con le altre risposte a questa domanda che sostengono l'approccio alla tabella di enumerazione separata.

Tuttavia, sono certamente favorevole a non ripetere ciò che è già stato detto, quindi mi riferirò semplicemente alla risposta accettata a (più o meno) la stessa domanda su Stack Overflow: link

    
risposta data 14.11.2017 - 14:34
fonte

Leggi altre domande sui tag