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, come fatturazione / pagamento, vendite, ordini e assistenza clienti.
Utilizzando Domain Driven Design e un'architettura di cipolla, ho modellato questo con i seguenti tipi:
- Azienda
- Ha contatti
- Contatto
- Ha tipi di contatti
- 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: The Lean DDDers:
- È compito del dominio definire quali tipi di contatto sono validi per un contatto. L'aggiunta di una tabella al database per confermare che i ContactTypes sconosciuti non vengono salvati è un segno di un dominio che perde. Diffonde la logica troppo lontano.
- L'aggiunta di una tabella statica al database e al codice corrispondente è dispendiosa. In questa applicazione il database risolve un problema: persiste e restituiscilo. Scrivere una tabella aggiuntiva e il corrispondente codice CRUD è dispendioso.
- Modificare la strategia per la persistenza dovrebbe essere il più semplice possibile. È più probabile che cambi le regole di business. Se decido che SQL Server costa troppo, non voglio ricostruire tutta la convalida che ho inserito nel mio schema.
Lato B: i tradizionalisti [che probabilmente non è un bel nome. The DBCentrists?]:
- È una cattiva idea avere dati nel database che non hanno senso senza leggere il codice. I report e gli altri consumatori devono ripetere da soli l'elenco dei valori.
- Non è molto il codice per caricare i dizionari di tipo db su richiesta. Non ti preoccupare.
- Se la fonte di questo è il codice e non i dati, dovrò distribuire bit invece di un semplice script SQL quando cambia.
Nessuna delle due parti ha ragione o torto, ma una di esse è probabilmente più efficiente a lungo termine, contando i tempi di sviluppo per lo sviluppo iniziale, i bug, ecc. Da che parte sta - o c'è un compromesso migliore? Cosa fanno gli altri team che scrivono questo stile di codice?