¿Cuáles son las ventajas de usar constructores de consultas SQL?


17

¿Hay alguna ventaja de usar un generador de consultas, en lugar de usar SQL sin formato?

P.ej

$q->select('*')
  ->from('posts')
  ->innerJoin('terms', 'post_id')
  ->where(...)

vs:

SELECT * FROM posts WHERE ...

Veo que muchos marcos usan este tipo de capas de abstracción, pero no entiendo los beneficios.


Creo que uno debería escribir consultas contra vistas y no contra tablas. Tiendo a pensar que las personas que usan constructores de consultas tienden a no escribir vistas o pedirle a los DBA que las creen para ellos. Al hacerlo, no aprovechan todo el poder del RDBMS.
Tulains Córdova

1
@ user61852: Aparte de posiblemente algo de seguridad y filtrado gratuito, ¿qué pueden proporcionar las consultas sobre vistas que las consultas sobre tablas no pueden proporcionar también?
Robert Harvey

44
@RobertHarvey Lo mismo que programar para interfaces en lugar de clases concretas. Desacoplamiento y flexibilidad. El diseño de las tablas subyacentes podría funcionar siempre y cuando el "contrato", la vista, siga "simulando" las mismas columnas de siempre.
Tulains Córdova

@ user61852 Lo suficientemente justo.
Robert Harvey

@RobertHarvey Lo convertí en una respuesta.
Tulains Córdova

Respuestas:


20

La abstracción de escribir el SQL a través de un marco bien, los resúmenes.

Escribir SQL a mano no es tan malo en sí mismo, pero comienza a tener problemas para escapar y desinfectar, y esto se convierte en un desastre. Una capa de abstracción puede encargarse de todo esto detrás de escena, permitiendo que su código esté limpio y libre de muchas mysql_real_escape_string()llamadas o similares.

Además, esto brinda la posibilidad de contabilizar diferentes dialectos de SQL. No todas las bases de datos están construidas de la misma manera y puede haber variaciones en las palabras clave o la sintaxis de una determinada funcionalidad. El uso de una capa de abstracción brinda la capacidad de generar la sintaxis correcta para su variante dinámicamente.

Si bien una capa de abstracción puede introducir un impacto en el rendimiento, generalmente es insignificante en comparación con la limpieza y la solidez del código que recibe a cambio.


1
No creo que los dialectos de SQL difieran entre los RDBMS. Y en PHP hay PDO que hace la desinfección para usted
Anna K.

12
Los dialectos SQL difieren, es por eso que se llaman dialectos. En cuanto a PDO, la capa de abstracción simplemente nos oculta este desastre.

@GlennNelson Anna se refería a cualquier dialecto, utilizando diferentes backends (PSQL / MySQL / SQLite ...)
Izkata

2
@AnnaK. Es posible que el dialecto no cambie, pero a veces las características son diferentes. Por ejemplo, MySQL (con el motor MyISAM) no admite restricciones de clave externa, mientras que PostGres sí. O el dialecto tendrá que manejar tal cosa por sí mismo (lo que requiere un conocimiento completo de la estructura de datos, como lo hace el Django ORM) o, más probablemente: el usuario debe ser inteligente sobre cómo lo usa, lo que podría hacer que se vea como el dialecto cambia, dependiendo de las circunstancias.
Izkata

1
+1 por permitir que una herramienta bien construida escape y se desinfecte por usted. Si también puede validar, aún mejor.
Dan Ray

11

Los creadores de consultas son mi odio favorito, ¡tanto que escribí mi propio Framework (Apeel) para evitar usarlos!

Si usa PDO (lo que definitivamente recomiendo que haga), entonces la santificación de la entrada se maneja por usted.

Como alguien más dijo, aunque facilitan el cambio entre bases de datos, tienden a admitir la funcionalidad del "mínimo común denominador" y no admitirán o tendrán un rendimiento más bajo para funciones más avanzadas.

He estado desarrollando sistemas con bases de datos desde alrededor de 1986 y en todo ese tiempo rara vez me he encontrado con una compañía que realmente esté cambiando la base de datos que usan, aparte de cuando necesitaban un mejor rendimiento. Si está cambiando las bases de datos para obtener un mejor rendimiento, entonces tiene mucho más sentido dedicar su tiempo a optimizar sus consultas a mano para aprovechar al máximo la nueva base de datos en lugar de aprovechar el éxito de un generador de consultas por simplicidad.

El tiempo dedicado a familiarizarse con las qwirks de un generador de consultas (luego volver a aprender cuando se cambia a uno mejor) sería mucho más productivo dedicado a aprender cómo optimizar su SQL.

De todos modos, es por eso que NO usar uno, aunque algunas personas los aman.


4

Teóricamente? Si. Glenn Nelson señaló cómo a menudo te ayudarán. (Si es un buen generador de consultas).

¿En la práctica? No siempre cumple con la teoría y en realidad podría causar problemas. Suponga que está utilizando un generador de consultas contra algunos DBMS populares y que todo es color de rosa. Luego, un cliente le pide que acceda a su DBMS que tiene algunas peculiaridades que su generador de consultas elegido simplemente no puede manejar. (Llegué a este problema cuando tuve que trabajar con una versión anterior de Pervasive).

¡PERO! Lo que debe hacer es separar la capa de acceso a datos y asegurarse de que puede intercambiar una nueva si es necesario. De esa manera, puede crear ese generador de consultas genial con todas las características, pero si necesita conectar uno nuevo que use ese extraño pseudo-sql para la base de datos en cuestión.


2
¿No debería resolverse algo como la situación peculiar de DB de antemano? Me refiero a averiguar qué base de datos está usando su cliente y elegir los marcos / bibliotecas adecuados en consecuencia es algo que debe manejarse antes de escribir una sola línea de código.

3

Creo que el beneficio práctico del día a día del generador de consultas es la reutilización del código y la capacidad de seguir el principio DRY.

Con el generador de consultas puede poner partes repetidas de SQL en métodos. Y luego use estos métodos para componer SQL complejo. Un ejemplo sería, por ejemplo, la cláusula JOIN reutilizable:

function joinTaskWithClient($queryBuilder) {
    $queryBuilder->join('task', 'contract', 'task.contract_id = contract.id')
                 ->join('contract', 'client', 'contract.client_id = client.id');
}

Entonces el uso sería:

$queryBuilder->select('client.name')
             ->from('client')
             ->where('task.id=:task')->setParameter('task', 42);
joinTaskWithClient($queryBuilder);

Como puede observar, con el generador de consultas puede agregar partes de SQL en cualquier orden (p. Ej., UNIRSE a la parte después de WHERE one) en contraste con el caso cuando reúne cadenas SQL manualmente. Además, puede leer sobre el patrón del generador para ver su intención y sus beneficios.

Estoy de acuerdo con respecto a escapar y desinfectar, pero esto también podría lograrse sin el generador de consultas. Con respecto a la abstracción de tipo / dialecto de DB: este es un beneficio bastante teórico y cuestionable, casi nunca utilizado en la práctica.


Para mí, esto también es un beneficio principal. Otra es que con la abstracción en métodos puede dar a los métodos nombres más significativos e incluso crear un lenguaje específico de dominio a partir de esto, lo que hace que la intención sea mucho más clara. También puede pasar el generador de consultas y dejar que diferentes componentes le agreguen los bits específicos. Por último, pero no menos importante que encontré que me permitió a los patrones de encapsular detrás métodos significativas llamado .... He encontrado algunos generadores de consultas, donde la adición de columnas estúpidamente sobreescribí los anteriores, que tipo de renders mucho de lo anterior inútil ...
Malte

2

Proporcionaré una respuesta basada en el archivo Léame de un generador de SQL personalizado mío ( Dialecto )

(sigue el texto sin formato, se eliminaron las referencias específicas de la biblioteca)

Requisitos

  1. Admite múltiples proveedores de bases de datos (por ejemplo, MySQL, PostgreSQL, SQLite, MS SQL / SQL Server, Oracle, DB2, ..)
  2. Se extiende fácilmente a nuevas bases de datos (preferiblemente a través de una configuración de configuración independiente de la implementación)
  3. Modularidad y transferibilidad independiente de la implementación
  4. API flexible e intuitiva

Caracteristicas

  1. plantillas gramaticales
  2. soporte de vistas suaves personalizadas
  3. abstracción db, modularidad y transferibilidad
  4. plantillas preparadas
  5. escape de datos

Creo que las características y requisitos anteriores esbozan las razones por las que uno usaría un generador de abstracción SQL

La mayoría de las características anteriores son compatibles con la mayoría de los constructores de SQL (aunque no creo que todos los listados sean compatibles, que yo sepa)

Ejemplos de casos de uso:

  1. Plataforma CMS capaz de funcionar (sin cambio de código subyacente) con múltiples proveedores de bases de datos
  2. Código de aplicación personalizado en el que el proveedor de bases de datos puede cambiar y / o los esquemas de dB son dinámicos (esto significa que muchas consultas no pueden codificarse pero aún deben abstraerse lo suficiente para que el código sea robusto para los cambios)
  3. Creación de prototipos con otra base de datos que no sea la utilizada en producción (requeriría una base de código duplicada al menos para parte del código)
  4. El código de la aplicación no está estrechamente acoplado a un proveedor o implementación de DB específicos (incluso dentro del mismo proveedor de DB, por ejemplo, diferentes versiones del proveedor de DB), por lo tanto, es más robusto, flexible y modular
  5. El marco mismo maneja muchos casos habituales de consultas y escapes de datos y, por lo general, esto es óptimo y más rápido

Finalmente, un ejemplo de un caso de uso que tuve. Estaba creando una aplicación en la que el esquema de base de datos subyacente (wordpress) no era adecuado para el tipo de consultas de datos que debían realizarse, además de que algunas de las tablas de WP (por ejemplo, publicaciones) tenían que usarse (por lo tanto, tener tablas completamente nuevas para todos los datos de la aplicación no era una opción).

En ese caso, poder hacer una aplicación similar a MVC donde el modelo podría ser consultado por condiciones personalizadas / dinámicas hizo que la codificación de consultas fuera casi una pesadilla. Imagina tener que admitir consultas de hasta 2-3 tablas con combinaciones y filtrar las condiciones para ver qué tabla unir con qué y también cuidar los alias necesarios, etc.

Es evidente que se trataba de un caso de uso abstracción de consulta y, aún más, que necesitaba (o al menos en gran medida benefició de) que tiene una capacidad de definir vistas personalizadas suaves (un conglomerado de tablas unidas como si fueran una tabla personalizada adecuada para el modelo) . Entonces fue mucho más fácil, más limpio, modular y flexible. En otro aspecto, la aplicación (código) también usó la capa de abstracción de consulta como una herramienta de normalización (esquema db) . Como algunos dicen, era a prueba de futuro .

Si mañana las personas deciden que necesitan algunas opciones o datos adicionales, es muy fácil agregarlos al modelo en un par de líneas y funcionar bien. Además, si mañana las personas deciden que ya no quieren usar wordpress (ya que la aplicación está acoplada libremente a wordpress como complemento), también es relativamente fácil cambiar ( solo la definición de) los modelos en un par de líneas de código para adaptarse al nuevo esquema.

¿Ves lo que quiero decir?


1

Muy a menudo, algunos de los argumentos para estas consultas son, en efecto, algunos valores en lugar de constantes. Ahora, muchos de ellos se han derivado esencialmente de publicaciones de formularios de usuario. Y, por lo tanto, hay muchas posibilidades de ataques de inyección SQL. Entonces, inherentemente, la formación de consultas requiere una validación completa.

Ahora, esto no quiere decir que no confiamos en el desarrollador, pero la formación de la consulta puede ser fácil, pero repetir todas las posibles comprobaciones de validación en todas partes puede implicar que a veces puede fallar de forma incidental o modificar la consulta, pero no modifique la consulta, pero no Actualice la verificación de validación. Algunos novatos incluso podrían conocer todos los peligros de perderse esto. Por lo tanto, la abstracción del generador de consultas es bastante esencial.


0

Solía ​​pensar que los creadores de consultas eran aplicaciones GUI que le permitían seleccionar tablas y unir gráficamente mientras generaba SQL, pero ahora entiendo que también llama a los creadores de consultas las API que proporcionan una forma de no tener que crear consultas SQL puras , abstrayéndose de posibles diferencias en los sabores de SQL.

Usar tales constructores de consultas es bueno , pero tiendo a pensar que las personas que dependen en gran medida de ellos tienden a no preguntar a los DBA: "oye, esta es una consulta que uso mucho, cree una vista desde ella".

No me malinterpretes.

Creo que deberías escribir consultas en vistas y no en tablas. No por seguridad o filtrado, que son buenas razones, sino por la misma razón que debe codificar contra interfaces y no contra clases concretas: desacoplamiento. Las vistas son como "contratos", de la misma manera que las interfaces son "contratos" en OOP. Puede cambiar las tablas subyacentes, pero siempre y cuando obligue a las vistas a mostrar el mismo "contrato" a los programadores, el código no debe romperse.

Una vez más, no me malinterpretes, puedes usar constructores de consultas para consultar vistas, pero muchas vistas llegan a existir como un proceso de maduración que es el producto de tener que escribir consultas y preguntarle a tu DBA: "hombre, crea esto, por favor" .

¿Me equivoco al pensar que al no escribir consultas no puede detectar la necesidad de crear ciertas vistas?

Otra cosa que me preocupa es que los programadores novatos no dominen SQL, una de las piezas de tecnología más hermosas creadas por el hombre, al no tener que hacerlo.


¿Qué tal un DBA que dice: "Esta consulta está funcionando mal, trabajemos juntos y mejorémosla"? Puede que haya funcionado bien al principio, pero ahora tiene problemas. Si todo lo que se necesita es un índice, ¿por qué molestar al desarrollador con eso?
JeffO

Esa es una situación totalmente diferente, y está perfectamente bien.
Tulains Córdova

Simplemente tengo ganas de involucrar al DBA cada vez que una consulta extrae un solo registro de una tabla o vista crea un cuello de botella en el proceso de desarrollo.
JeffO
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.