Sfondo
In una tipica applicazione Model-View-Controller che utilizza un database per memorizzare il modello, il consenso sembra essere che le tabelle di ricerca sono una decisione di progettazione solida per i tipi enumerati. Sebbene alcuni DBMS supportino tipi ENUM
- una soluzione più semplice - le persone citano gli svantaggi come "i dati non vengono trattati come dati" e "le costose modifiche all'elenco dei membri" come motivi per evitare l'alternativa ENUM
.
Tuttavia, un vantaggio della soluzione ENUM
è che i dati enumerati sono, per definizione, dichiarati prima che l'applicazione inizi l'esecuzione .
Un semplice esempio potrebbe essere un sito di incontri con User
se Relationship Status
es. La tabella User
verrebbe compilata durante l'esecuzione normale dell'applicazione, ma i dati di Relationship Status
dovrebbero (credo) essere "pronti all'uso" non appena l'applicazione viene attivata. Anche se gli stati possono essere configurati / aggiunti / rimossi durante il runtime, si potrebbe pensare che il client non debba aggiungere manualmente l'insieme di relazioni enumerate iniziale ogni volta che viene utilizzata una nuova istanza del database.
Come affermato in precedenza, le colonne ENUM
raggiungono questo obiettivo, ma non ho trovato alcuna documentazione generica su come le tabelle di ricerca (le migliori pratiche accettate) possono comportarsi allo stesso modo.
Domanda
Le tabelle di ricerca contengono dati come qualsiasi altra riga in un database, ma con l'avvertenza che rappresentano le enumerazioni: costrutti che, nella logica del programma, sono in genere definiti in fase di compilazione anziché in fase di esecuzione. In che modo le applicazioni MVC gestiscono l'inizializzazione e l'utilizzo dei dati della tabella di ricerca, riconciliandoli con i paradigmi di progettazione della funzione di un programma?
Soluzioni tentate
Per illustrare il motivo per cui i paragrafi precedenti rappresentano effettivamente un ostacolo mentale, ecco alcune alternative che ho considerato (cercando ancora di rimanere indipendenti dal sistema) e perché sembrano non essere all'altezza.
-
L'utente definisce i dati enumerati durante l'esecuzione
Per quanto mi riguarda, questa non è una soluzione valida, perché i dati elencati spesso svolgono un ruolo nella logica dell'applicazione. Ad esempio, un sistema di contabilità a partita doppia può avere
credit
edebit
account e le transazioni per tali account devono essere confrontate e riconciliate in modo diverso a seconda di quali tipi di account sono in uso. Anche se un client è autorizzato a creare altri tipi di account, dovrebbe essere previsto che sappia checredit
/debit
deve essere aggiunto prima che l'applicazione sia addirittura funzionante? -
Includi istruzioni di inserimento dei dati nella definizione dello schema del database
Questa opzione sembra molto più ragionevole, e il mio istinto mi dice che questa soluzione è corretta, ma la mia inesperienza mi impedisce di legare insieme le estremità. La chiamata allo script di creazione dello schema si verifica in genere in alcuni processi di distribuzione prima dell'esecuzione dell'applicazione, ma qual è la procedura se sono necessari aggiornamenti ai valori della tabella di ricerca? Inoltre, l'applicazione nel suo complesso dovrebbe seguire il principio DRY, ma (riferendosi all'esempio precedente) se la logica dell'applicazione dipende dalla conoscenza dei tipi di account
credit
/debit
, come deve il codice "sapere" che dati senza una definizione ridondante nella fonte?
Per inciso, ho sempre lavorato con due ORM nella mia storia di ingegnere del software: SQLAlchemy , e un strumento di acquisto utilizzato da un datore di lavoro per generare dinamicamente codice appropriato per classi di modelli in Java. In ogni caso, voglio che questa domanda sia indipendente dal sistema, ma forse questo sfondo può aiutare i lettori a lottare per capire i miei ostacoli mentali su questo problema.