Tenho certeza de que não sou o único que fica frustrado ao ver uma página de código repleta de consultas SQL. O ActiveRecord e outros padrões ORM ajudam a mitigar uma boa quantidade de SQL usada em um projeto, mas em muitos casos de consultas complexas, o uso do SQL é aparentemente inevitável.
Estou procurando opiniões sobre como as consultas SQL devem ser organizadas com o restante do código (ou externamente) para impedir que ele seja espalhado por todo o lugar? Uma idéia óbvia é o uso de Views, mas muitas vezes as Views podem ser uma fonte de problemas de desempenho ao lidar com várias tabelas indexadas grandes, etc.
EDIT 1 - Estou assumindo que você já o separou na camada do modelo
sql
code-formatting
água-viva
fonte
fonte
Respostas:
Para mim, o SQL é uma parte fundamental (em muitos casos, a maioria) do código de lógica de negócios. Se você tentar separá-lo do código que opera nos dados retornados, é mais provável que você desequilibre a compreensibilidade e a capacidade de manutenção do código.
Na minha opinião, ler dados, processar dados, gravar dados, pesquisar dados ... são todas operações semelhantes e devem ser mantidas no mesmo local.
Se você começar a perceber uma duplicação de esforços nas consultas, talvez seja necessário uma visualização do banco de dados ou um objeto que possa encapsular esse aspecto do acesso ao banco de dados.
Outra dica é realmente ter um bom método de consulta ao banco de dados. No software que escrevo (PostgreSQL, MySQL, SQL Server), assegurei que a maior parte das minhas operações de consulta pudesse ocorrer como uma única declaração de código.
Essas são (aproximadamente) as principais chamadas de função que eu garanto que fazem parte do meu "objeto de conexão". Depende da linguagem, o que você realmente implementa, mas meu objetivo é mantê-la realmente, realmente simples e indolor.
Em resumo, trate o SQL como parte nativa da programação e não faça abstrações por abstração.
fonte
Geralmente, ter uma camada de modelo separada é a melhor abordagem. Existem vários padrões de design corporativo que oferecem maneiras de arquitetar isso.
fonte
Pode ser uma boa idéia separar a camada do modelo em três subcamadas - "entidades", "repositórios" e "serviços". Isso permitirá separar as preocupações e reunir o SQL em um único local, fora da lógica de negócios.
Nesse cenário, todo o código de recuperação de dados, incluindo SQL complexo - estará localizado em repositórios. Portanto, o objetivo do repositório é ocultar instruções SQL complexas por trás de métodos autoexplicativos
getUsersWithActiveSubscription()
.A entidade abstrai os nomes reais dos campos da tabela do banco de dados com getters e setters, pode fornecer alguma conversão de dados entre os tipos e tipos de campos do banco de dados disponíveis na sua aplicação / linguagem de programação. Se o seu ORM suportar isso, as entidades podem lidar com associações.
Camada de serviço é o local para a lógica de negócios. O serviço recupera entidades usando repositórios, age sobre elas e as armazena de volta.
fonte