Vous construisez un système qui assure le suivi des entreprises. Ces entreprises ont des contacts. Ces contacts sont souvent des spécialistes qui ne répondent qu'à certains types de questions, telles que la facturation / paiement, les ventes, les commandes et le support client.
En utilisant la conception pilotée par domaine et une architecture oignon, j'ai modélisé cela avec les types suivants:
- Compagnie
- A des contacts
- Contact
- A des types de contact
- ContactType (énumération)
- CompanyRepository (interface)
- EFCompanyRepository (défini dans un assembly externe, utilise EntityFramework, implémente CompanyRepository)
Notre équipe a une opinion partagée sur la façon de modéliser la base de données pour cette application.
Face A: Les DDD Lean:
- Il appartient au domaine de définir quels types de contact sont valides pour un contact. L'ajout d'une table à la base de données pour valider que les ContactTypes inconnus ne sont pas enregistrés est le signe d'un domaine qui fuit. Cela étend la logique trop loin.
- L'ajout d'une table statique à la base de données et au code correspondant est un gaspillage. Dans cette application, la base de données résout un problème: persister la chose et me la rendre. Écrire une table supplémentaire et le code CRUD correspondant est un gaspillage.
- Changer la stratégie de persistance devrait être aussi simple que possible. Il est plus probable que ces règles commerciales changent. Si je décide que SQL Server coûte trop cher, je ne veux pas avoir à reconstruire toute la validation que j'ai mise dans mon schéma.
Face B: Les traditionalistes [ce n'est probablement pas un nom juste. Les DBCentristes?]:
- C'est une mauvaise idée d'avoir des données dans la base de données qui n'ont aucun sens sans lire le code. Les rapports et autres consommateurs doivent répéter eux-mêmes la liste des valeurs.
- Ce n'est pas beaucoup de code pour charger vos dictionnaires de type db à la demande. Ne t'en fais pas.
- Si la source de ceci est du code et non des données, je devrai déployer des bits au lieu d'un simple script SQL lorsqu'il changera.
Aucun côté n'a raison ou tort, mais l'un d'eux est probablement plus efficace à long terme, en comptant le temps de développement pour le développement initial, les bogues, etc. De quel côté s'agit-il - ou y a-t-il un meilleur compromis? Que font les autres équipes qui écrivent ce style de code?