Você está construindo um sistema que monitora as empresas. Essas empresas têm contatos. Esses contatos geralmente são especialistas que respondem apenas a certos tipos de perguntas, como cobrança / pagamento, vendas, pedidos e suporte ao cliente.
Usando o Design Orientado a Domínio e uma Arquitetura de Cebola, modelei isso com os seguintes tipos:
- Companhia
- Possui contatos
- Contato
- Tem tipos de contato
- Tipo de contato (enumeração)
- CompanyRepository (interface)
- EFCompanyRepository (definido em uma montagem externa, usa EntityFramework, implementa CompanyRepository)
Nossa equipe tem uma opinião dividida sobre como modelar o banco de dados para este aplicativo.
Lado A: Os DDD Lean:
- É o trabalho do domínio definir quais ContactTypes são válidos para um contato. Adicionar uma tabela ao banco de dados para validar que ContactTypes desconhecidos não são salvos é um sinal de domínio com vazamento. Ele espalha a lógica muito longe.
- Adicionar uma tabela estática ao banco de dados e o código correspondente é um desperdício. Nesta aplicação, o banco de dados resolve um problema: persistir e devolver para mim. Escrever uma tabela extra e o código CRUD correspondente é um desperdício.
- Alterar a estratégia de persistência deve ser o mais fácil possível. É mais provável alterar essas regras de negócios. Se eu decidir que o SQL Server custa muito, não quero reconstruir toda a validação que coloquei no esquema.
Lado B: Os tradicionalistas [provavelmente não é um nome justo. Os DBCentrists?]:
- É uma má idéia ter dados no banco de dados que não façam sentido sem a leitura do código. Relatórios e outros consumidores precisam repetir a lista de valores.
- Não é muito código para carregar seus dicionários do tipo db sob demanda. Não se preocupe com isso.
- Se a fonte disso for código e não dados, terei que implantar bits em vez de um script SQL simples quando ele mudar.
Nenhum dos lados está certo ou errado, mas um deles é provavelmente mais eficiente a longo prazo, contando o tempo de desenvolvimento para o desenvolvimento inicial, bugs etc. De que lado está - ou há um compromisso melhor? O que as outras equipes que escrevem esse estilo de código fazem?