Seu princípio orientador deve ser Não se repita :
Na engenharia de software, o DRY (Não se repita) é um princípio de desenvolvimento de software que visa reduzir a repetição de informações de todos os tipos, especialmente útil em arquiteturas de várias camadas. O princípio DRY é declarado como "Todo conhecimento deve ter uma representação única, inequívoca e autorizada dentro de um sistema".
O ORM é essencialmente uma camada extra (ou camada, se preferir), situada confortavelmente entre o aplicativo e o (s) armazenamento (s) de dados. Suas restrições devem estar em um local e apenas em um local, seja o ORM ou o armazenamento de dados; caso contrário, em breve, você acabará mantendo versões diferentes deles. Você realmente não quer fazer isso.
No entanto, na prática, a maioria dos ORMs decentes gera automaticamente uma grande quantidade de seus modelos a partir do seu esquema de dados. Embora ainda haja duplicação, as chances de manutenção são mínimas, pois o código ORM duplicado é gerado seguindo o mesmo padrão a cada vez. Seria ideal não ter código duplicado, mas as restrições geradas automaticamente são a próxima melhor opção.
Além disso, ter suas restrições em um local não significa necessariamente que você deve ter todas as restrições no mesmo local. Algumas, como restrições de integridade referencial, podem ser mais adequadas para o armazenamento de dados (mas podem ser perdidas se você mudar para outro armazenamento de dados) e outras, principalmente aquelas que envolvem lógica de negócios complexas, são mais adequadas para o seu ORM. Seria preferível ter todas as suas maçãs na mesma cesta, mas…
Falhas
Você mencionou a falha do ORM. Isso é absolutamente irrelevante para sua pergunta, seu aplicativo deve pensar no ORM e no armazenamento de dados como uma entidade única. Se falhar, falhar, ignorar o ORM para conversar diretamente com o armazenamento de dados não é uma boa ideia.
Ignorando o ORM para qualquer outra coisa
Também não é uma boa ideia. No entanto, isso pode acontecer por vários motivos:
Partes herdadas do aplicativo que foram criadas antes da introdução do ORM.
Essa é uma pergunta difícil, e exatamente a situação com a qual estou lidando agora , daí a minha repetição constante do "inferno da manutenção". Você continua mantendo as partes que não são do ORM ou as reescreve para usar o ORM. A segunda opção pode fazer mais sentido inicialmente, mas é uma decisão baseada apenas no que exatamente essas partes do seu aplicativo estão fazendo e em quão valiosa seria uma reescrita completa a longo prazo.
Tente alterar uma chave em uma tabela MySQL 2 * 10 ^ 8 mal projetada (sem tempo de inatividade) e você entenderá de onde estou vindo.
Partes não herdadas do aplicativo que precisam absolutamente conversar diretamente com o armazenamento de dados:
Ainda mais complicado. Os ORMs são ferramentas sofisticadas e cuidam de quase tudo, mas às vezes atrapalham ou são absolutamente inúteis. A palavra-chave (na verdade, palavra-chave) é incompatibilidade de impedância objeto-relacional ; basta dizer que não é tecnicamente possível para o seu ORM fazer tudo o que seu banco de dados relacional faz e, para algumas das coisas que fazem, há uma penalidade significativa no desempenho.
Comentários
Do ponto de integridade dos dados, as restrições DEVEM estar no banco de dados e DEVEM estar no aplicativo. E se o seu aplicativo for acessado a partir de aplicativos da Web e de desktop, ou aplicativo móvel ou serviço da Web? - Luiz Damim
É aqui que adicionar uma camada extra seria extremamente útil e, se estamos falando de um aplicativo Web, eu usaria uma API REST. Um design excessivamente simplista para isso seria:
O ORM fica entre a API e os armazenamentos de dados, e tudo por trás da API (incluindo ela) seria considerado uma entidade única dos vários aplicativos.