Está creando un sistema que realiza un seguimiento de las empresas. Esas empresas tienen contactos. Esos contactos a menudo son especialistas que solo responden ciertos tipos de preguntas, como facturación / pago, ventas, pedidos y atención al cliente.
Utilizando el diseño impulsado por dominio y una arquitectura de cebolla, he modelado esto con los siguientes tipos:
- Empresa
- Tiene contactos
- Contacto
- Tiene tipos de contacto
- ContactType (enumeración)
- CompanyRepository (interfaz)
- EFCompanyRepository (definido en un ensamblado externo, utiliza EntityFramework, implementa CompanyRepository)
Nuestro equipo tiene una opinión dividida sobre cómo modelar la base de datos para esta aplicación.
Lado A: Los DDD Lean:
- El trabajo del Dominio es definir qué ContactTypes son válidos para un Contacto. Agregar una tabla a la base de datos para validar que los ContactTypes desconocidos no se guardan es una señal de un dominio con fugas. Difunde la lógica demasiado lejos.
- Agregar una tabla estática a la base de datos y el código correspondiente es un desperdicio. En esta aplicación, la base de datos resuelve un problema: persiste la cosa y me la devuelve. Escribir una tabla adicional y el código CRUD correspondiente es un desperdicio.
- Cambiar la estrategia para la persistencia debería ser lo más fácil posible. Es más probable que cambie las reglas de negocio. Si decido que SQL Server cuesta demasiado, no quiero tener que reconstruir toda la validación que puse en mi esquema.
Lado B: Los tradicionalistas [probablemente no sea un nombre justo. Los DBCentrists?]:
- Es una mala idea tener datos en la base de datos que no tengan sentido sin leer el código. Los informes y otros consumidores tienen que repetir la lista de valores ellos mismos.
- No es tanto código para cargar sus diccionarios de tipo db a pedido. No te preocupes por eso.
- Si la fuente de esto es código y no datos, tendré que implementar bits en lugar de un simple script SQL cuando cambie.
Ninguno de los lados está bien o mal, pero uno de ellos es probablemente más eficiente a largo plazo, contando el tiempo de desarrollo para el desarrollo inicial, errores, etc. ¿De qué lado está, o hay un compromiso mejor? ¿Qué hacen otros equipos que escriben este estilo de código?