Stai costruendo un sistema che tiene traccia delle Aziende. Quelle aziende hanno contatti. Questi contatti sono spesso specialisti che rispondono solo a determinati tipi di domande, ad esempio Fatturazione / Pagamento, Vendite, Ordini e Assistenza clienti.
Usando Domain Driven Design e una Onion Architecture, ho modellato questo con il seguenti tipi:
-
società
- Ha contatti
-
contatto
- Ha tipi di contatto
- ContactType (enum)
- CompanyRepository (interfaccia)
- EFCompanyRepository (definito in un assembly esterno, utilizza EntityFramework, implementa CompanyRepository)
Il nostro team ha un'opinione divisa su come modellare il database per questa applicazione.
Lato A: DDDer magra:
- È compito del dominio definire quali ContactTypes sono validi per un contatto. L'aggiunta di una tabella al database per convalidare che ContactTypes sconosciuto non è stato salvato è un segno di un dominio che perde. Si diffonde la logica troppo in là.
- L'aggiunta di una tabella statica al database e il codice corrispondente sono inutili. In questa applicazione il database risolve un problema: persistere la cosa e restituirla a me. Scrivere una tabella in più e il codice CRUD corrispondente è uno spreco.
- Cambiare la strategia per la persistenza dovrebbe essere il più semplice possibile. È più probabile che cambi le regole aziendali. Se decido che SQL Server costa troppo, non voglio dover ricostruire tutta la validazione che ho inserito nel mio schema.
Lato B: i tradizionalisti [che probabilmente non è un nome giusto. I DBCentrists?]:
- È una cattiva idea avere dati nel database che non hanno senso senza leggere il codice. Rapporti e altri utenti devono ripetere l'elenco di valori.
- Non è tanto il codice per caricare i dizionari di tipo db su richiesta. Non preoccuparti per questo.
- Se l'origine di questo è codice e non dati, dovrò distribuire bit anziché un semplice script SQL quando cambierà.
Nessuna delle due parti è giusta o sbagliata, ma una di queste è probabilmente più efficiente a lungo termine, contando i tempi di sviluppo per lo sviluppo iniziale, i bug, ecc. Di che lato si tratta - o c'è un compromesso migliore? Cosa fanno gli altri team che scrivono questo stile di codice?