Per me, se vai a fila singola o EAV dipende da come vuoi consumarli.
Il potere di EAV è che è possibile aggiungere nuovi dati senza modificare la struttura. Ciò significa che se si desidera un nuovo valore di configurazione, è sufficiente aggiungerlo alla tabella ed estrarlo nel punto desiderato nel codice e non è necessario aggiungere un nuovo campo al dominio, schema, mappatura, query DAL , eccetera.
Il suo difetto è che ha solo la struttura più debole, che richiede di gestire i dati pessimisticamente. Ogni utilizzo di qualsiasi valore di configurazione deve aspettarsi che il valore non sia presente o non sia nel formato corretto e comportarsi di conseguenza quando non lo è. Un valore di configurazione potrebbe non essere analizzabile in un double, in un int o in un char. Potrebbe essere nullo. potrebbe non esserci alcuna riga per il valore. I modi per aggirare questo in genere richiedono l'esistenza di un singolo valore "predefinito" valido per tutti i valori di configurazione di un particolare tipo di codice ( estremamente raro; più spesso il valore predefinito è altrettanto problematico per il consumo del codice come nessuno), oppure per mantenere un dizionario hardcoded di valori predefiniti (che deve cambiare ogni volta che viene aggiunta una nuova colonna, rendendo piuttosto discutibile il vantaggio principale dell'archiviazione EAV).
Una singola riga larga è praticamente l'opposto. Lo si mappa su una singola istanza di un oggetto Configuration con un campo / proprietà per ogni valore di configurazione esistente. Sai esattamente quale tipo dovrebbero essere quei valori in fase di compilazione e "DAL non riesci velocemente" nel DAL se non esiste una colonna di configurazione o non ha un valore del tipo corretto, dandoti un posto dove catturare le eccezioni in base su problemi di recupero / idratazione della configurazione.
Lo svantaggio principale è che è necessario un cambiamento strutturale per ogni nuovo valore; nuova colonna DB, nuova colonna nel DAL (mappatura o query SQL / SP), nuova colonna dominio, tutto necessario per testare correttamente l'utilizzo.
La situazione corretta in cui utilizzare uno di questi è la situazione in cui gli svantaggi sono mitigati. Per me, la maggior parte delle situazioni per la configurazione del codice ha richiesto un'implementazione a riga singola. Questo principalmente perché se stai introducendo un valore di configurazione completamente nuovo che regola il comportamento di alcune parti del tuo programma, devi già modificare il codice per utilizzare il nuovo valore di configurazione; perché non passare all'oggetto config e aggiungere il valore da utilizzare?
In breve, uno schema EAV per l'archiviazione della configurazione non risolve davvero il problema che pretende di risolvere e la maggior parte delle soluzioni alternative ai problemi che presenta violano il DRY.