SQL es otro de los lenguajes esenciales en la vida de un desarrollador que se encuentra deseando crear sitios web que manejen informaci贸n y hagan uso de bases de datos.
Sin embargo, muchos desarrolladores no est谩n familiarizados con varios aspectos del SQL, es por esto que en el siguiente art铆culo analizaremos 10 consejos esenciales a tener en cuenta sobre este lenguaje.
1. Utiliza el lenguaje correcto
Los desarrolladores web por lo general poseen una gran cantidad de lenguajes a su disposici贸n. Es crucial que seleccionen el ideal para cada trabajo.
Revisemos el c贸digo que sigue. En el primer ejemplo, el desarrollador est谩 seleccionando todas las columnas y todas las filas desde la tabla del cliente. En el segundo ejemplo, el desarrollador est谩 seleccionando s贸lo el primer nombre, apellido y direcci贸n de la tabla del cliente para un cliente particular cuya ID es 1001. El segundo pedido no solo limita las columnas que se devuelven sino que tambi茅n tiene un mejor desempe帽o.
SELECT聽*聽FROM聽customer;
SELECT firstName, lastName, shippingAddress FROM customer WHERE customerID = 1001;
Al escribir c贸digo es necesario que te asegures que trabaje con eficiencia.
2. Asegura tu c贸digo
Las bases de datos almacenan informaci贸n valiosa. Debido a esto, suelen ser objetivo de ataques. Muchos desarrolladores no est谩n al tanto de que su c贸digo posee serios problemas de vulnerabilidad lo que resulta algo muy temido. Actualmente, los desarrolladores pueden tener problemas legales si su propia negligencia en cuanto a los temas de seguridad lleva a que una base de datos sea explotada.
Veamos otro ejemplo utilizando pseudo-c贸digo
// Theoretical code
txtUserName.setText(”eshafer’ OR 1=1″);
query = “SELECT username, password FROM users WHERE username = ‘” + txtUserName.getText() + “‘;”;// Final statement
query = “SELECT username, password FROM users WHERE username = ejshafer OR 1=1;”
Con suerte al ver el c贸digo de arriba notaste las vulnerabilidades del mismo. El pedido terminar谩 seleccionando todos los nombres de usuarios y contrase帽as grabadas de la tabla, porque 1 es igual a 1. Ahora, este ejemplo particular no tendr铆a mucha importancia para un supuesto hacker. Sin embargo, hay posibilidades casi ilimitadas sobre c贸digo adicional malicioso que pueda ser a帽adido con resultados catastr贸ficos.
驴C贸mo puedes escribir c贸digo seguro?
La soluci贸n es a menudo espec铆fico DBMS; que es, una variante entre MySQL, Oracle o SQL Server. En PHP con MySQL, por ejemplo, es usual escapar a los par谩metros utilizando la funci贸n mysql_real_escape_string antes de enviar el pedido SQL. De forma alternativa, puedes utilizar afirmaciones preparadas para “preparar” tu pedido. Es tu obligaci贸n entender el DBMS con el que est谩s trabajando y los problemas de seguridad inherentes.
La inyecci贸n SQL no es el 煤nico problema de seguridad con el que los desarrolladores deben tratar, sin embargo, es uno de los m谩s comunes m茅todos de ataque.
3. Entender las uniones
Las declaraciones SQL de tablas singulares son bastante f谩ciles de escribir. Sin embargo, los requerimientos de los negocios a menudo hacen que sea necesario escribir pedidos m谩s complejos. Por ejemplo, “encontrar todas las ordenes de un cliente, y mostrar los productos para cada orden”. Ahora, en esta situaci贸n particular, ser铆a probable que haya una tabla de cliente, una tabla de orden y una tabla de order_line. Para aquellos que est谩n m谩s familiarizados con SQL, es f谩cilmente aparente la uni贸n de la tabla, dos tablas juntas ser谩n requeridas para este pedido. Miremos el c贸digo de muestra:
SELECT customer.customerID, order.order_id, order_line.order_item
FROM customer
INNER JOIN order
ON customer.customerID = order.customerID
INNER JOIN order_line
ON order.orderID = order_line.orderID;
Para aquellos que no lo saben, el c贸digo de arriba es una uni贸n interna. M谩s espec铆ficamente, una equi-join. Definamos los distintos tipos de uniones:
Uniones internas:聽 Su prop贸sito b谩sico es devolver registros que combinen.
Uniones externas:聽 No requieren que cada registro tenga un registro que le corresponda.
- Uni贸n externa izquierda: Una uni贸n externa izquierda de tablas A y B devolver谩 todos los registros correspondientes de A y B, como as铆 tambi茅n cualquier registro no-correspondiente de la tabla izquierda.
- Uni贸n externa derecha: Una uni贸n externa derecha de tablas A y B devolver谩 todos los registros correspondientes de A y B, como as铆 tambi茅n cualquier registro no-correspondiente de la tabla derecha.
- Uni贸n externa completa: Una uni贸n externa completa de tablas A y B devolver谩 todos los registros correspondientes de A y B, como as铆 tambi茅n cualquier registro no-correspondiente de ambas.
Uniones propias
Las uniones propias son el 煤ltimo tipo de uniones que debemos considerar: se trata de una union de la tabla a s铆 misma.
EMPLOYEE聽TABLE
EmployeeName
SupervisorID
En esta situaci贸n, para poder encontrar cu谩les empleados son supervisados por un empleado dado, se requerir谩 una uni贸n propia.
Las uniones son una de las propiedades principales de SQL, as铆 que aseg煤rate de usar la apropiada para cada situaci贸n.
4. Conoce tus tipos de informaci贸n
En SQL, tradicionalmente cada columna de la tabla posee un tipo de informaci贸n asociada. Text, Date, VarChar, Integer, etc, son algunos de los tipos disponibles de los cuales los desarrolladores pueden elegir.
Al desarrollar, debes asegurarte de escoger el tipo de informaci贸n propicio para cada columna. Las fechas deber谩n ser variables DATE, n煤meros deber谩n ser de tipo num茅rico, etc. Esto se vuelve especialmente importante al tratar con el tema que sigue:聽 indexaci贸n. Veamos un ejemplo:
SELECT employeeID, employeeName
FROM employee
WHERE employeeID = 112457891;
Parece correcto basado en lo que sabemos hasta ahora 驴No? Sin embargo 驴Qu茅 pasar铆a si employeeID fuera una cadena?聽 Tendr铆amos un gran problema, ya que DBMS puede no encontrar jam谩s una coincidencia (ya que los tipos de informaci贸n son de distinto tipo).
Si est谩s utilizando indexaci贸n, probablemente te quedar谩s perplejo porque tu pedido jam谩s llegar谩. Esta es la raz贸n por la que los desarrolladores deben prestar atenci贸n especial a los tipos de informaci贸n en sus aplicaciones.
La utilizaci贸n debida de los tipos de informaci贸n es esencial para la buena programaci贸n de base de datos, porque 茅sta gu铆a directamente a la eficiencia del pedido. Y pedidos eficientes son esenciales en la creaci贸n de aplicaciones escalables de calidad.
5. Escribe c贸digo d贸cil
Todos los lenguajes de programaci贸n poseen est谩ndares que los desarrolladores web deben conocer. SQL fue estandarizado por ANSI y luego ISO, con nuevas revisiones del lenguaje siendo agregadas ocasionalmente. La 煤ltima revisi贸n es SQL: 2008, aunque la m谩s importante es SQL: 1999. La revisi贸n de 1999 introdujo disparadores, pedidos recursivos, soporte para PL/SQL y T-SQL, y algunas otras propiedades nuevas. Tambi茅n defini贸 que las declaraciones JOIN sean realizadas en la cl谩usula FROM, en oposici贸n a la cl谩usula WHERE.
Al escribir el c贸digo, es importante tener en mente qu茅 est谩ndares d贸ciles de c贸digo resultan 煤tiles. Existen dos razones principales por la que los est谩ndares son utilizados. La primera es el mantenimiento y la segunda es la estandarizaci贸n de plataformas cruzadas. El sistema se pasa la mayor parte de su tiempo de vida en fase de mantenimiento. Cuando otro programador acceda a tu c贸digo en 2, 5 o 10 a帽os, es necesario que todav铆a pueda entender lo que tu c贸digo est谩 haciendo. Es por eso que los est谩ndares est谩n dise帽ados para desarrollar la capacidad de mantenimiento.
La otra raz贸n es la funcionalidad de plataformas cruzadas. Con CSS, hay actualmente una batalla de est谩ndares entre Firefox, Internet Explorer, Chrome, y otros navegadores sobre la interpretaci贸n del c贸digo. La raz贸n para los est谩ndares SQL es prevenir una situaci贸n similar entre Oracle, Microsoft y otras variantes SQL como MySQL.
6. Normaliza tu informaci贸n
La normalizaci贸n de base de datos es una t茅cnica para organizar el contenido de las mismas. Sin esto las bases de datos pueden ser inapropiadas, lentas e ineficientes. La comunidad de profesionales de base de datos ha desarrollado una serie de gu铆as para la normalizaci贸n de las mismas. Cada “nivel” de normalizaci贸n es referido como una forma y existen cinco formas en total.
- Primer Forma Normal (1NF): Es el nivel m谩s b谩sico de normalizaci贸n, requiere la eliminaci贸n de todas las columnas duplicadas de una tabla, y tambi茅n la creaci贸n de tablas separadas para informaci贸n relacionada, e identificaci贸n de cada tabla con un atributo clave principal.
- Segunda Forma Normal (2NF): Encuentra todos los requerimientos de la primera forma normal, y crea relaciones entre las tablas utilizando claves extra帽as.
- Tercera Forma Normal (3NF): Encuentra todos los requerimientos de las primeras dos formas, y elimina todas las columnas que no dependan de la clave principal. Tambi茅n elimina todos los atributos derivados, tales como la edad.
- Cuarta forma Normal (4NF): Adhiere un requerimiento extra, que es la remoci贸n de cualquier dependencia multi-valuada en las relaciones.
- Quinta Forma Normal (5NF): Es una rara forma de normalizaci贸n, en la que las dependencias de uniones de caso est谩n implicadas por claves candidatas.
En la realidad de las bases de datos llegar hasta la 3er forma es lo m谩s importante. Si est谩s luchando con los conceptos, existe una simple relaci贸n entre ellos “La clave, la clave completa y nada m谩s que la clave” relaciona a 1NF, 2NF y 3NF.
Los beneficios de la normalizaci贸n son que a medida que la informaci贸n progresa a trav茅s de las formas se vuelve m谩s clara, mejor organizada y m谩s r谩pida. A medida que la base de datos crezca, los efectos de la normalizaci贸n se volver谩n m谩s aparentes en lo que respecta a velocidad y mantenci贸n de la integridad de la informaci贸n. Sin embargo, existen situaciones en las que la normalizaci贸n no tiene sentido, como por ejemplo cuando la normalizaci贸n de la informaci贸n crear谩 pedidos excesivamente complejos para devolver la misma.
7. Califica completamente los objetos de tu base de datos
Este es un punto com煤nmente ignorado. En t茅rminos de un desarrollo de base de datos, un nombre de objeto completamente calificado luce as铆: DATABASE.schema.TABLE. El prop贸sito de un nombre de objeto completamente calificado es eliminar la ambig眉edad. Los desarrolladores principiantes raramente tienen acceso a bases de datos m煤ltiples y esquemas, lo que complica el problema en el futuro. Cuando un usuario dado tiene acceso a m煤ltiples bases de datos, m煤ltiples esquemas y las tablas que hay ah铆, se vuelve crucial especificar directamente a qu茅 est谩 el usuario intentado acceder.
Clasificar por completo los nombres de tus bases de datos es importante al trabajar con bases de datos grandes que son utilizadas por muchos usuarios y poseen varios esquemas.
8. Entender indexaci贸n
El 铆ndice de una base de datos es una estructura de informaci贸n que mejora la velocidad de las operaciones en una base de datos. Los 铆ndices pueden ser creados utilizando una o m谩s columnas de la tabla de la base de datos, dando la base tanto de vistazos r谩pidos al azar como de acceso eficiente a registros ordenados. La indexaci贸n es incre铆blemente importante al trabajar con tablas grandes, sin embargo, ocasionalmente las tablas peque帽as deber铆an ser indexadas si se espera que crezcan.
Cuando un pedido busca a una base de datos para registros correspondientes, hay dos formas en que la b煤squeda puede ser desempe帽ada:
- La primera y la m谩s lenta es un escaneo de tabla. En este, el pedido busca cada registro de la tabla en miras de una correspondencia.
- La segunda y la m谩s r谩pida es el escaneo indexado. En este, los pedidos buscan el 铆ndice para encontrar los registros. En t茅rminos de no-base de datos, un escaneo de tabla ser铆a el equivalente a leer cada p谩gina de un libro para buscar una palabra, mientras que uno de 铆ndice ser铆a el equivalente a dar vuelta al final del libro, encontrar la palabra, ir a la p谩gina especifica y luego leer esa p谩gina para encontrar la palabra.
Es importante recordar que los 铆ndices deben ser reconstruidos ocasionalmente, a medida que informaci贸n es a帽adida en la tabla. Por esto, la mayor铆a de las DBMS poseen una opci贸n para temporalmente deshabilitar un 铆ndice para facilitar la modificaci贸n masiva de informaci贸n, y as铆 permitir que sea re-habilitada y reconstruida despu茅s.
9. Utilizaci贸n propicia de los permisos de base de datos
Al trabajar con una base de datos que tiene m煤ltiples usuarios es importante manejar correctamente los permisos. Obviamente, la mayor铆a de las bases de datos tienen un administrador, pero no siempre tiene sentido correr tus pedidos como administrador. Tampoco desear谩s proveer a todos los desarrolladores juniors con las credenciales de administrador para que puedan escribir sus propios pedidos. Los varios permisos posibles para tu base de datos dependen de tu DBMS, pero existen temas comunes entre ellos.
En MySQL, por ejemplo, el tipear “SHOW TABLES” revelar谩 una lista de tablas en tu base de datos, en la que m谩s que seguro notar谩s una tabla “user”. Tipeando ‘DESC user’ revelar谩 que hay varios campos en esta tabla. Junto con un host, nombre de usuario y contrase帽a, hay tambi茅n una lista de privilegios que pueden ser programados para cada usuario. Sumado a este, hay una tabla ‘db’ que gobierna privilegios m谩s espec铆ficos para una base de datos.
Adem谩s, SQL Server provee las declaraciones GRANT, DENY y REVOKE para dar o sacar permisos a un usuario o rol.
10. Conoce las limitaciones de tu DBMS
Las bases de datos son herramientas poderosas pero todas tienen limitaciones. Oracle, SQL Server y MySQL poseen limitaciones propias en ciertas cosas como tama帽os m谩ximos de bases de datos, n煤mero m谩ximo de tablas y otras cosas. Muchos desarrolladores sin saberlo eligen la soluci贸n DBMS para sus proyectos sin planear o considerar los requerimientos de sus bases de datos.
Para conocer las limitaciones puedes referirte al manual de tu DBMS, por ejemplo, las limitaciones de SQL Server est谩n localizadas en el sitio de MSDN: http://msdn.microsoft.com/en-us/library/ms143432.aspx
Conclusi贸n
En este art铆culo revisamos 10 consejos esenciales para desarrolladores SQL. Sin embargo, existen otras muchas t茅cnicas SQL que pueden ser mencionadas. Contin煤en desarrollando y recuerden que el c贸digo que escriben debe soportar la infraestructura de internet y que sin ustedes, Internet no ser铆an tan exitoso como es.
Fuente: Net Tuts Plus








Jueves, 18 de Junio de 2009 a las 00.19
Muy buena la info!! pero la llamaria “El Decalogo del Desarrollador de Base de datos”. Todo desarrollador que no tiene en mente la Seguridad y el dise帽o de la base de datos, no puede ser desarrollador. Esto lo pegaria en mi lugar de trabajo!!!! asi no se olvidan jamas de “el decalogo” del desarrollador.
Saludos sigan asi con el blog!
Lunes, 22 de Junio de 2009 a las 04.40
Muy buen post pero igual uno que lhaya llevado una clase de BD debe de saber la mayoria, y sobre lo de desarrollador… no se si este mal… pero una partde deben de hacerlo los analistas y otra los desarroladores, en este caso yo creo que desde el analisis todo debe de estar bien implementado… y los desarrolladores no deberian tener problema al escribir todo en codigo…
Lunes, 22 de Junio de 2009 a las 22.31
buenisimo.
quisiera si es posibel que me envien link sobre SQL mas relacionado con Contabilidad.
Dios los bendiga
A Jes煤s por Maria.
AvaTor
Martes, 30 de Junio de 2009 a las 23.50
me encanta obre su informacion me ayuda a conocer mas. gracias