questa è una domanda interessante.Sicuramente devi prendere in considerazione gli obiettivi di performance qui. Se non vuoi andare veloce, int è un must. Un database può indicizzare gli interi un po 'meglio delle stringhe, anche se devo dire che non è affatto una cattiva perdita di prestazioni.
In questo esempio si trova il database Oracle in cui hanno il lusso di fare enum large cap come stringhe sulle proprie tabelle di sistema. Cose come USER_ALLOCATION_TYPE o cose del genere sono la norma. Come dici tu, le stringhe possono essere più "estensibili" e più leggibili, ma in ogni caso nel codice ti ritroverai con:
Stringa finale statica USER_ALLOCATION_TYPE = "USER_ALLOCATION_TYPE";
in luogo di
statico int USER_ALLOCATION_TYPE finale = 5;
Perché se lo fai, ti ritroverai con tutti questi stringhe letterali che sono solo dolorosi per qualcuno che va lì e mette un po 'in ordine! :)
Nella mia azienda utilizziamo tabelle con chiavi primarie intere; tutti i tavoli hanno una chiave primaria seriale, perché anche se non pensi di averne bisogno, prima o poi te ne pentirai.
Nel caso in cui si sta descrivendo ciò che facciamo è che abbiamo una tabella con (PK Int, Descrizione String) e quindi facciamo Visualizzazioni sulle tabelle principali con join per ottenere le descrizioni, in questo modo si arriva a vedere il descrizioni dei campi uniti, se necessario, e manteniamo le prestazioni migliori.
Inoltre, con una tabella di descrizione separata puoi avere informazioni EXTRA su quegli ID che non avresti mai pensato. Ad esempio, diciamo che un utente può avere accesso ad alcuni campi nella casella combinata se e solo se hanno tale proprietà e così via. È possibile utilizzare campi aggiuntivi nella tabella di descrizione per memorizzarli al posto del codice ad hoc.
I miei due centesimi.
Un vantaggio dell'uso di stringhe è che sono più facili da leggere se tu o qualcun altro dovessi mai lavorare direttamente con il DB. Ti farà risparmiare la fatica di unirti alle tabelle che definiscono gli int per rendere le query leggibili. Ho visto implementazioni piuttosto grandi usando stringhe - l'impatto sulle prestazioni è trascurabile. –