Os modelos de domínio no banco de dados podem ser uma solução sustentável?


13

Acabei de começar um novo emprego como desenvolvedor de banco de dados para uma empresa de médio e pequeno porte baseada na tecnologia da Microsoft. Percebi desde cedo o quanto as práticas se desviam daquilo que aprendi na escola em relação às melhores práticas, padrões de design, testes e gerenciamento de projetos.

O que mais me incomoda é como nosso principal desenvolvedor de banco de dados (doravante chamado "John") mantém o esquema do modelo no banco de dados! Fazemos isso tendo 3 tabelas "mágicas"; um para esquemas de banco de dados, um para tabelas e um para colunas.

Inserir um registro na tabela " Tabelas " gera (por meio de um gatilho de banco de dados), a tabela correspondente real. Inserir uma linha na tabela " Linhas " atualiza a tabela referenciada com essa linha. Estes, por sua vez, são lidos pelo seu programa caseiro de C # para gerar modelos C #, que são usados ​​pelos desenvolvedores de front-end para controladores e versões externas.

Além disso, a maior parte do desenvolvimento é feita de acordo com a estrutura do ASP.NET MVC .

Vejo algumas falhas nessa abordagem:

  • Precisamos que ele mantenha o ORM, e ele raramente tem tempo para fazê-lo (a segurança no emprego é boa!)
  • Os gatilhos para as tabelas "Tabelas" e "Linhas" são defeituosos. Eles não suportam atualizações de tabela, nem restrições de verificação ou mais recursos "avançados". Embora possamos certamente melhorá-los, ainda não tenho certeza se esse é o caminho a seguir.
  • Manter a lógica programática no banco de dados parece estranho e restritivo (embora seja possível estender seus modelos por meio de C #).
  • Seu gerador de modelo C # deve ser executado manualmente por uma das três pessoas (dentre as quais eu sou uma) e ainda não está maduro o suficiente para ser incluído em um processo de compilação automatizado.

Várias pessoas sugeriram a criação de um produto verdadeiro e testado, como o Entity Framework , mas ele descarta, afirmando que manter a lógica de negócios na camada de código é adequada apenas para aplicativos de pequena escala e projetos de autoinicialização para startups.

Este post está levando a algo que pode parecer uma discussão opinativa, mas essa não é minha intenção. Eu só quero alguns esclarecimentos sobre a nossa abordagem arquitetônica.

Manter os modelos de domínio no banco de dados pode ser uma solução sustentável para uma empresa em crescimento?


Os modelos de domínio estão intimamente ligados ao design orientado a domínio. O objetivo principal do design orientado a domínio é estar livre do design orientado a dados, onde os dados (ou seja, o banco de dados) são o núcleo do aplicativo. Essa abordagem e modelos de domínio realmente não combinam. Ao desenvolver seguindo as práticas de design orientadas por domínio, você não se importa de onde vêm os dados, apenas os usa e executa lógica neles na camada de negócios.
Andy

Não sei ao certo o que você quer dizer com "manter a lógica programática no banco de dados". Você pode esclarecer isso?
21415 Robert

A lógica de negócios no código é exatamente o caminho certo. O banco de dados deve ser um armazenamento de dados estúpido, nada mais.
187 Andy Andy

@ Andy Acho que isso depende. Pode ser que o DBA seja o centro da equipe e ele mantenha toda a lógica de negócios no banco de dados, que é consultada por chamadas estocadas de procs armazenados, extrai dados para o POCO etc. Essa é uma abordagem questionável, mas conheço equipes, mantendo a maior parte da lógica de negócios. se não tudo no DB.
Vladislav Rastrusny

@VladislavRastrusny Seja qual for o motivo, manter a lógica de negócios no banco de dados é um projeto extremamente ruim.
187 Andy Andy

Respostas:


16

Você está descrevendo uma plataforma interna.

O problema com plataformas internas é que você reinventa todos os mecanismos de uma plataforma ou tecnologia (neste caso, um banco de dados relacional) que foram aprimorados e aperfeiçoados ao longo de décadas de evolução e esforço, mas reinventando-o mal. Você está ignorando todas as otimizações disponíveis para aqueles que escolhem um design mais convencional e trocando simplicidade e elegância inicial por complexidade e dificuldades futuras.

Dito isto, se o produto final deste processo é reais mesas e verdadeira aulas de modelagem reais objetos de domínio de negócio, não vejo muito mal nesta abordagem, além da imaturidade das ferramentas. O Stack Exchange realmente usa seu próprio ORM caseiro e isso parece ter funcionado para eles. Então, eu sei que esses tipos de abordagens "caseiras" podem funcionar.

Observe que a maioria dos ORM que adotam a abordagem "tabela em primeiro lugar" simplesmente analisa a estrutura da tabela no banco de dados para criar as classes. As tabelas "table" e "row" que seu amigo criou são meramente metadados que já existem nas tabelas do sistema dos sistemas de banco de dados relacionais mais modernos.

Leituras adicionais
O projeto "Vision", um conto de advertência sobre o efeito da plataforma interna
(você pode pular o preâmbulo e começar a ler na subposição "Introducing Vision")


2
Leitura interessante, eu definitivamente poderia desenhar anologias. Ainda sou novo e continuarei sendo um espectador por enquanto, mas definitivamente vou mantê-lo sob as lentes. Obrigado por uma boa resposta!
krystah
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.