Estoy seguro de que no soy el único que se frustra cuando ven una página de código llena de consultas SQL. El ActiveRecord y otros patrones ORM ayudan a mitigar una buena cantidad de SQL utilizado en un proyecto, pero en muchos casos de consultas complejas, el uso de SQL es aparentemente inevitable.
¿Estoy buscando opiniones sobre cómo deberían organizarse las consultas SQL con el resto del código (o externamente) para evitar que se dispersen por todo el lugar? Una idea obvia es el uso de Vistas, pero a menudo las Vistas pueden ser una fuente de problemas de rendimiento cuando se trata de múltiples tablas indexadas grandes, etc.
EDITAR 1 - Supongo que ya lo tienes separado en la capa del modelo
sql
code-formatting
jellyfishtree
fuente
fuente
Respuestas:
Para mí, SQL es una parte fundamental (en muchos casos, la mayoría) del código de lógica de negocios. Si intenta separarlo del código que opera en los datos devueltos, es más propenso a desequilibrar la comprensibilidad y la facilidad de mantenimiento del código.
Según lo miro, leer datos, procesar datos, escribir datos, buscar datos ... son operaciones similares, y se mantienen mejor en el mismo lugar.
Si comienza a sentir una duplicación de esfuerzos con las consultas, quizás necesite una vista de base de datos o un objeto que pueda encapsular ese aspecto del acceso a la base de datos.
Otro consejo es tener un buen método de consulta de base de datos. En el software que escribo (PostgreSQL, MySQL, SQL Server), me he asegurado de que la mayor parte de mis operaciones de consulta puedan tener lugar como una sola declaración de código.
Esas son (aproximadamente) las llamadas a funciones principales que aseguro que son parte de mi "objeto de conexión". Depende del idioma, lo que realmente implemente, pero mi punto es mantenerlo realmente, realmente simple y sin dolor.
En resumen, trate a SQL como una parte nativa de la programación y no haga un resumen por el bien de la abstracción.
fuente
Generalmente, tener una capa de modelo separada es el mejor enfoque. Hay una serie de patrones de diseño empresarial que dan formas de diseñar esto.
fuente
Podría ser una buena idea separar la capa de su modelo en 3 subcapas: "entidades", "repositorios" y "servicios". Esto le dará una separación de preocupaciones y reunirá SQL en un solo lugar, fuera de su lógica empresarial.
En este escenario, todo el código de recuperación de datos, incluido el SQL complejo, se ubicará en repositorios. Por lo tanto, el objetivo del repositorio es ocultar sentencias SQL complejas detrás de métodos autoexplicativos como
getUsersWithActiveSubscription()
.La entidad extrae los nombres de campo reales de la tabla DB con getters y setters, puede proporcionar alguna conversión de datos entre los tipos de campo DB y los tipos disponibles en su lenguaje de aplicación / programación. Si su ORM lo admite, las entidades pueden manejar asociaciones.
La capa de servicio es el lugar para la lógica empresarial. El servicio recupera entidades utilizando repositorios, actúa sobre ellas y las almacena de nuevo.
fuente