Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Web Development
Code

10 consejos esenciales de SQL para desarrolladores

by
Difficulty:IntermediateLength:LongLanguages:

Spanish (Español) translation by Ana Paulina Figueroa Vazquez (you can also view the original English article)

SQL es otro lenguaje esencial para los desarrolladores que desean crear sitios web basados en datos. Sin embargo, muchos desarrolladores no están familiarizados con diversos aspectos de SQL; por lo tanto, en este artículo analizaremos diez consejos esenciales.

1. Usa el lenguaje adecuado

Los desarrolladores web a menudo tienen una gran cantidad de lenguajes a su disposición. Para los desarrolladores es crucial usar el lenguaje adecuado para el trabajo.

Echemos un vistazo al siguiente código. En el primer ejemplo, el desarrollador está seleccionando todas las columnas y todas las filas de la tabla customer (cliente). En el segundo ejemplo, el desarrollador está seleccionando solamente el nombre, el apellido y la dirección de la tabla customer para un solo cliente con el ID 1001. La segunda consulta no solamente limita las columnas devueltas, sino que también tendrá un mejor desempeño.

Cuando escribas código, asegúrate de que funcione eficientemente.

Demasiados desarrolladores están satisfechos teniendo código con un desempeño adecuado en 100 filas de datos, sin pensar mucho en el futuro, cuando la base de datos tendrá 10,000 filas.

2. Asegura tu código

Las bases de datos almacenan información valiosa. Debido a este hecho, las bases de datos a menudo son los principales blancos de ataques. Muchos desarrolladores no están conscientes de que sus códigos tienen vulnerabilidades de seguridad críticas, lo que es un hecho bastante aterrador no solamente para los clientes, sino también para ti. En la actualidad, los desarrolladores pueden ser considerados responsables legalmente si su negligencia personal ocasiona un riesgo en la seguridad de la base de datos que posteriormente es explotado.

En caso de que no estés convencido de la seriedad de la seguridad de las bases de datos, estos dos artículos deberían ayudar a aclarar este punto:

"El FBI y la Policía Estatal de Virginia se encuentran en la búsqueda de piratas informáticos que exigieron que el estado les pague un rescate de $10 millones para el jueves por la devolución de millones de registros farmacéuticos personales que dicen haber robado de la base de datos de medicamentos con receta del estado".
Lee el artículo del Washington Post

"Kaspersky Lab, una compañía de seguridad con sede en Moscú, admitió hoy que una base de datos que contiene información sobre clientes estuvo expuesta durante casi 11 días y que solamente se enteró de la brecha cuando piratas informáticos rumanos informaron a la firma sobre esto el sábado pasado".
Lee el artículo de ComputerWorld

Vamos a analizar otro ejemplo usando pseudocódigo.

Ojalá que viendo el código anterior hayas notado la vulnerabilidad. La consulta terminará seleccionando todos los registros de usuarios y contraseñas de la tabla, ya que 1 siempre es igual a 1. Ahora bien, este ejemplo en particular no logra mucho para el posible pirata informático. Sin embargo, hay posibilidades casi ilimitadas de código malicioso adicional que puede ser agregado con resultados catastróficos.

¿Cómo puedes escribir código seguro?

La solución a menudo depende del DBMS (sistema gestor de base de datos, o SGBD); es decir, varía entre MySQL, Oracle o SQL Server. En PHP con MySQL, por ejemplo, es habitual escapar parámetros usando la función mysql_real_escape_string antes de enviar la consulta SQL. Alternativamente, puedes utilizar declaraciones preparadas para "preparar" tus consultas. Haz que tu misión sea comprender el DBMS con el que estés trabajando y los problemas de seguridad inherentes.

La inyección SQL no es la única vulnerabilidad en la seguridad de las bases de datos de la que deben preocuparse los desarrolladores, pero es uno de los métodos de ataque más comunes. Es importante probar tu código y estar familiarizado con los más recientes problemas de seguridad para tu DBMS con el fin de protegerlo de los ataques.

3. Comprendiendo los joins

Las instrucciones select de SQL de una sola tabla son bastante fáciles de escribir. Sin embargo, los requisitos de los negocios a menudo requieren escribir consultas más complejas. Por ejemplo, "obtén todas las órdenes de cada cliente, y muestra los productos de cada orden". Ahora bien, en esta situación en particular es probable que haya una tabla customer (cliente), una tabla order (orden) y una tabla order_line (línea_orden, esta última sería para resolver una posible relación de registros de muchos a muchos). Para aquellos que están un poco más familiarizados con SQL, es evidente que un join en las tablas, de hecho dos joins en las tablas, serán necesarios para esta consulta. Veamos algunos ejemplos de código.

Muy bien, suficientemente simple. Para aquellos que no lo saben, el código anterior es un inner join. Más específicamente, el código anterior es un equi-join.
Definamos los diferentes tipos de joins.

Inner Joins: El propósito básico de los inner joins es devolver registros coincidentes.

Outer Joins: Los outer joins no requieren que todos los registros tengan un registro coincidente.

  • Left outer join: Un left outer join de las tablas A y B devolverá todos los registros coincidentes de A y B, además de cualquier registro no coincidente de la tabla izquierda, en este caso la tabla A.
  • Right outer join: Un right outer join de las tablas A y B devolverá todos los registros coincidentes de A y B, además de cualquier registro no coincidente de la tabla derecha, que en este caso es la tabla B.
  • Full outer join: Un full outer join de las tablas A y B devolverá todos los registros coincidentes de A y B, además de cualquier registro no coincidente de ambas tablas.

Agradecimientos especiales a Ronald Erdei por las imágenes.

Self Joins

Existe un último tipo de join que debe considerarse, y se trata del self join. Un self join es simplemente un join de una tabla consigo misma.

En esta situación, para encontrar qué empleados son supervisados por otro empleado será necesario un self join.

Ojalá esto aclare los principios básicos de los joins, ya que estos son una de las herramientas principales de SQL que lo convierten en un lenguaje de bases de datos tan poderos. Asegúrate de usar el join adecuado para tu situación.

4. Conoce tus tipos de datos

En SQL, generalmente cada columna en una tabla tiene un tipo de dato asociado. Text, Integer, VarChar, Date y otros tipos más están disponibles generalmente para que los desarrolladores puedan elegir.

Al desarrollar, asegúrate de elegir el tipo de dato adecuado para la columna. Las fechas deben ser variables DATE, los números deben ser de un tipo numérico, etc. Esto se vuelve especialmente importante cuando tratamos con un tema posterior: la indexación; pero mostraré un ejemplo de conocimientos deficientes sobre tipos de datos a continuación:

Se ve bien en base a lo que sabemos actualmente, ¿cierto? sin embargo, qué pasa si employeeID en realidad es una cadena. Ahora tenemos un problema, ya que el DBMS quizá no encuentre datos que coincidan (ya que las cadenas y los enteros son tipos diferentes).

Por lo tanto, si estás usando indexación probablemente te quedes perplejo al ver que tu consulta está tardando una eternidad, cuando debería ser un simple escaneo de índices. Esta es la razón por la que los desarrolladores necesitan prestar especial atención a los tipos de datos y sus aplicaciones. Los atributos no clave que son IDs a menudo son de tipo cadena, en vez de enteros, debido a la mayor flexibilidad que proporcionan. Sin embargo esta también es un área problemática para los desarrolladores júnior que asuman que los campos ID serán enteros.

La utilización adecuada de los tipos de datos es esencial para una correcta programación de la base de datos, ya que estos conducen directamente a la eficiencia de las consultas. Las consultas eficientes son esenciales para la creación de aplicaciones escalables y de buena calidad.

5. Escribe código que cumpla con los estándares

Todos los lenguajes de programación tienen estándares que los desarrolladores web deberían conocer, y SQL no es la excepción. SQL fue estandarizado por ANSI y luego por ISO, teniendo nuevas revisiones para el lenguaje que son enviadas ocasionalmente. La revisión más reciente es SQL:2008, aunque la revisión más importante que los desarrolladores deben conocer es la SQL:1999. La revisión 1999 introdujo consultas recursivas, triggers (desencadenadores), soporte para PL/SQL y T-SQL, además de algunas características más nuevas. También definió que las instrucciones JOIN deben hacerse en la cláusula FROM, en lugar de la cláusula WHERE.

Al escribir código es importante tener en mente por qué es útil tener código que cumpla con los estándares. Existen dos razones principales por las que se usan los estándares. La primera es la facilidad de mantenimiento y la segunda es la estandarización multiplataforma. Al igual que con las aplicaciones de escritorio, se supone que los sitios web tendrán una vida útil prolongada y pasarán por varias actualizaciones para añadir nuevas funcionalidades y reparar problemas. Como cualquier analista de sistemas te diría, los sistemas pasan la mayor parte de su vida útil en la fase de mantenimiento. Cuando un programador diferente tenga acceso a tu código en 2, 5 o 10 años, ¿todavía serán capaces de comprender lo que hace tu código?. Los estándares y comentarios están diseñados para promover la facilidad de mantenimiento.

La otra razón es la funcionalidad multiplataforma. Con CSS, en la actualidad existe una batalla de estándares en curso entre Firefox, Internet Explorer, Chrome y otros navegadores con respecto a la interpretación del código. La razón por la que existen los estándares de SQL es para prevenir una situación similar entre Oracle, Microsoft y otras variantes de SQL tales como MySQL.

6. Normaliza tus datos

La normalización de bases de datos es una técnica para organizar el contenido de estas últimas. Sin la normalización, los sistemas de bases de datos pueden ser inexactos, lentos e ineficientes. La comunidad de profesionales de bases de datos desarrolló una serie de pautas para la normalización de las bases de datos. Cada "nivel" de normalización se conoce como una forma, y hay 5 formas en total. La primera forma normal es el nivel de normalización más bajo, y así hasta la quinta forma normal, que es el nivel de normalización más alto.

  • Primera Forma Normal (1FN): El nivel más básico de normalización de datos, la primera forma normal requiere la eliminación de todas las columnas duplicadas de una tabla, y también requiere la creación de tablas separadas para datos relacionados, así como la identificación de cada tabla con un atributo de clave primaria.
  • Segunda Forma Normal (2FN): Cumple con todos los requisitos de la primera forma normal, y crea relaciones entre tablas usando claves foráneas.
  • Tercera Forma Normal (3FN): Cumple con todos los requisitos de la segunda y la primera forma normal, y elimina todas las columnas que no dependan de la clave primaria. La tercera forma normal también elimina todos los atributos derivados, tales como la edad.
  • Cuarta Forma Normal (4FN): La cuarta forma normal agrega un requisito adicional, que es la eliminación de cualquier dependencia de valores múltiples en las relaciones.
  • Quinta Forma Normal (5FN): La quinta forma normal es una forma más rara de normalización, en cuyo caso las dependencias join están implícitas a través de claves candidatas (posibles valores de claves primarias).

En la realidad del desarrollo de bases de datos, llegar a la 3FN es el salto más importante. La 4FN y la 5FN son un poco más un lujo (y algunas veces una molestia) en el desarrollo de bases de datos, y rara vez se ven en la práctica. Si estás teniendo problemas con los conceptos, o problemas para recordar las primeras tres formas, hay una relación simple. "La clave, toda la clave y nada más que la clave", que se relaciona con la 1FN, la 2FN y la 3FN.

Los beneficios de la normalización

Ahora bien, sin adentrarnos demasiado en la teoría de las bases de datos, simplemente vamos a enfocarnos en los beneficios de la normalización. A medida que la información progresa a través de las formas de la normalización, los datos se vuelven más limpios, mejor organizados y más rápidos. Ahora, con una pequeña base de datos que tenga solamente 5 tablas y 100 filas de datos, esto no será inmediatamente evidente. Sin embargo, a medida que la base de datos crezca los efectos de la normalización se volverán mucho más evidentes con respecto a la velocidad y al mantenimiento de la integridad de los datos. No obstante, hay algunas situaciones en las que la normalización no tiene sentido, por ejemplo cuando la normalización de los datos crea consultas excesivamente complejas que sean necesarias para obtener la información.

7. Escribe los nombres completos de los objetos de tu base de datos

Ahora, este es un punto comúnmente ignorado; de hecho, todo el código de ejemplo que he mostrado en este tutorial ha violado esencialmente esta sugerencia. En términos del desarrollo de bases de datos, un nombre de objeto completo se ve de esta manera: BASEDEDATOS.esquema.TABLA. Ahora veamos por qué los nombres completos son importantes y en qué situaciones son necesarios. El propósito de un nombre de objeto completo es eliminar la ambigüedad. Los desarrolladores principiantes rara vez tienen acceso a múltiples bases de datos y esquemas, lo que complica los problemas en el futuro. Cuando un usuario determinado tiene acceso a múltiples bases de datos, múltiples esquemas y las tablas que contienen, se vuelve crucial especificar directamente a qué intenta acceder el usuario. Si tienes una tabla de empleados, tu jefe tiene una tabla de empleados y el esquema en el que tu aplicación web se está ejecutando tiene una tabla de empleados, ¿a cuál estás intentando acceder realmente?.

Lógicamente, el nombre completo se vería como BASEDEDATOS.ESQUEMA.NOMBREOBJETO, sin embargo, sintácticamente (es decir, en instrucciones ejecutables), simplemente sería ESQUEMA.NOMBREOBJETO. Si bien varios DBMS tienen diversas diferencias sintácticas, el estilo anterior es generalmente aplicable.

Escribir los nombres completos de tus bases de datos es importante al trabajar con bases de datos más grandes, que estén siendo accedidas por múltiples usuarios y que contengan múltiples esquemas. Sin embargo, es un buen hábito para adquirir.

8. Comprendiendo la indexación

Un índice de bases de datos es una estructura de datos que mejora la velocidad de las operaciones en una tabla. Los índices pueden ser creados usando una o más columnas de una tabla de la base de datos, proporcionando los fundamentos para hacer búsquedas rápidas aleatorias y para el acceso eficiente a registros ordenados. La indexación es increíblemente importante al trabajar con tablas grandes. Sin embargo, en ocasiones las tablas más pequeñas deben ser indexadas si se espera que crezcan. Las tablas pequeñas que permanecerán de ese tamaño no deben ser indexadas (por ejemplo, si tu libro es de 1 página ¿tiene sentido ir al índice?).

Muchos desarrolladores escriben su código y lo prueban en una tabla con 10 o 100 filas, y se sienten satisfechos cuando el código funciona adecuadamente. Sin embargo, a medida que la tabla crece a 10,000 o 1,000,000 de filas, el código se ralentiza a la velocidad de un caracol y el cliente bien podría salir a almorzar en vez de esperar a que el código se ejecute.

Cuando una consulta busca un registro coincidente en una base de datos, existen dos maneras en las que la búsqueda puede llevarse a cabo.

  • La primera, y la más lenta, es un escaneo de la tabla. En un escaneo de la tabla, la consulta busca en cada registro de la tabla para encontrar una coincidencia.
  • La segunda, y la manera más rápida, es un escaneo por índice. En un escaneo por índice la consulta busca el índice para encontrar el registro. En términos no relacionados con bases de datos, un escaneo de tablas sería el equivalente a leer cada página de un libro buscando una palabra, mientras que un escaneo por índice sería el equivalente a ir a la parte posterior del libro, encontrar la palabra, ir a la página especificada y luego leer las palabras de la página para encontrar esa palabra.

Es importante recordar que los índices necesitan ser reconstruidos ocasionalmente, a medida que se agreguen datos a la tabla. Además, si bien los índices incrementan el desempeño en cuanto al acceso a los datos, estos ralentizan la modificación de la información. Debido a esto, la mayoría de los DBMS tienen una opción para deshabilitar temporalmente un índice y así facilitar la modificación masiva de datos, y posteriormente se puede permitir que se vuelva a habilitar y reconstruir.

9. Usa adecuadamente los permisos de la base de datos

Al trabajar con una base de datos que tiene múltiples usuarios, es importante gestionar adecuadamente los diversos permisos. Obviamente, la mayoría de las bases de datos tienen un usuario administrador, pero ¿tiene sentido ejecutar tus consultas siempre como administrador?. Además, ¿querrías proporcionar a todos tus usuarios y desarrolladores júnior tus credenciales de administrador para que escriban sus consultas? probablemente no. Los diferentes permisos posibles para tu base de datos dependen de tu DBMS, pero existen temas comunes entre ellos.

En MySQL, por ejemplo, escribir "SHOW TABLES" mostrará una lista de tablas de tu base de datos, entre las cuales probablemente notarás una tabla "user". Escribir "DESC user" mostrará que hay varios campos en la tabla user. Junto con un host, nombre de usuario y contraseña, también hay una lista de privilegios que pueden configurarse para un usuario. Además, hay una tabla "db" que gobierna sobre más privilegios para una base de datos específica.

SQL Server proporciona las instrucciones GRANT, DENY y REVOKE para otorgar o quitar permisos a un usuario o a un rol. Además, SQL Server proporciona roles tales como db_writer y db_reader. A menudo, los desarrolladores poco experimentados otorgan estos roles (en vez de crear sus propios roles personalizados) a otros usuarios, lo que ocasiona una menor seguridad en la base de datos, así como la posibilidad de que un usuario lleve a cabo una operación no deseada.

La gestión adecuada de los permisos para los usuarios de tu base de datos es esencial para administrar no solamente la seguridad, sino también para proporcionar los fundamentos para un desarrollo más rápido y para proteger la integridad de los datos.

10. Conoce las limitaciones de tu DBMS

Las bases de datos son poderosas herramientas, pero tienen sus limitaciones. Oracle, SQL Server y MySQL tienen limitaciones únicas en cuanto al tamaño máximo de las bases de datos, el número máximo de tablas, entre otras. Sin saberlo, muchos desarrolladores eligen una solución de DBMS para sus proyectos sin planificar ni considerar los requisitos posteriores de sus bases de datos.

Consulta el manual de tu DBMS para ver las diferentes limitaciones, por ejemplo, las limitaciones de SQL Server se encuentran en el sitio web de MSDN: http://msdn.microsoft.com/en-us/library/ms143432.aspx

Conclusión

En este artículo revisamos 10 consejos esenciales para desarrolladores de SQL. Sin embargo, existen muchas otras técnicas útiles en SQL que pueden ser mencionadas; así que por favor escribe tus pensamientos en los comentarios, ya sea que pienses que este artículo cubrió todos los temas esenciales o si piensas que se omitió alguno. Sigue desarrollando, y recuerda, el código que escribes soporta la infraestructura de Internet, y sin ti, Internet no tendría el éxito que tiene.


Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.