Per me, che tu vada su una singola riga o su EAV dipende da come vuoi consumarli.
Il potere di EAV è che i nuovi dati possono essere aggiunti senza modifiche alla struttura. Ciò significa che se si desidera un nuovo valore di configurazione, è sufficiente aggiungerlo alla tabella ed estrarlo dove desiderato nel codice e non è necessario aggiungere un nuovo campo al dominio, schema, mapping, query DAL , ecc.
Il suo difetto è che ha solo la struttura più sottile, che richiede di trattare i dati in modo pessimistico. Ogni utilizzo di qualsiasi valore di configurazione deve aspettarsi che il valore non sia presente o non nel formato corretto e si comporti di conseguenza quando non lo è. Un valore di configurazione potrebbe non essere analizzabile a un doppio, a un int o a un carattere. Potrebbe essere nullo. potrebbe non esserci nessuna riga per il valore. Le modalità attorno a questo richiedono solitamente un unico valore "predefinito" valido per tutti i valori di configurazione di un particolare tipo in-code ( estremamente raro, più spesso il valore predefinito è altrettanto problematico per il consumo del codice come niente affatto), o per mantenere un dizionario hardcoded di valori predefiniti (che deve cambiare ogni volta che viene aggiunta una nuova colonna, rendendo il vantaggio principale dello storage EAV piuttosto moot).
Una singola riga larga è praticamente l'opposto. Si esegue il mapping su una singola istanza di un oggetto Configuration con un campo / una proprietà per ogni valore di configurazione esistente. Sai esattamente di che tipo dovrebbero essere quei valori in fase di compilazione, e "fallisci velocemente" nel DAL se una colonna di configurazione non esiste o non ha un valore del tipo corretto, dandoti un posto dove catturare le eccezioni basate sui problemi di recupero / idratazione della configurazione.
Il principale svantaggio è che è necessario un cambiamento strutturale per ogni nuovo valore; nuova colonna DB, nuova colonna nel DAL (il mapping o le query SQL / SP), nuova colonna di dominio, tutto il necessario per testare correttamente l'utilizzo.
La situazione corretta in cui utilizzare una di queste è la situazione in cui gli svantaggi vengono mitigati. Per me, la maggior parte delle situazioni per la codifica di configurazione ha richiesto un'implementazione a riga singola. Questo è principalmente dovuto al fatto che se stai introducendo un valore di configurazione completamente nuovo che regola il comportamento di una parte del tuo programma, devi già cambiare il codice in usare il nuovo valore di configurazione; perché non passare all'oggetto config e aggiungere il valore da utilizzare?
In breve, uno schema EAV per archiviare la configurazione in realtà non risolve il problema che si propone di risolvere, e la maggior parte delle soluzioni alternative ai problemi che presenta violano DRY.