Este artículo describe MySQL, una herramienta eficaz para desarrollar comercio electrónico y otros sitios web complejos y dinámicos que utilizan bases de datos de terceros. MySQL es un servidor SQL rápido, multiproceso y con todas las funciones. Además de describir la arquitectura básica del sistema MySQL, este artículo también proporciona ejemplos sencillos escritos en Tcl y C++ para ayudarle a desarrollar aplicaciones web compatibles con bases de datos. Este artículo describe MySQL, una herramienta eficaz para desarrollar comercio electrónico y otros sitios web complejos y dinámicos que utilizan bases de datos de terceros. MySQL es un servidor SQL rápido, multiproceso y con todas las funciones. Además de describir la arquitectura básica del sistema MySQL, este artículo también proporciona ejemplos sencillos escritos en Tcl y C++ para ayudarle a desarrollar aplicaciones web compatibles con bases de datos.
Una aplicación que debe almacenar o acceder a grandes cantidades de información puede beneficiarse enormemente del uso de un producto de base de datos de terceros. Esto es especialmente cierto cuando el acceso a la información debe ocurrir en múltiples instancias del programa. Las aplicaciones basadas en la Web (incluido el comercio electrónico) son buenos ejemplos de ello.
¿Por qué utilizar una base de datos independiente?
Los servidores web deben tener una forma para que sus scripts de procesamiento almacenen información sobre su estado para su acceso posterior. Aunque es posible utilizar métodos más primitivos, como volcarlos en un archivo de texto o desarrollar una minibase de datos casera, sólo una aplicación de base de datos completa puede proporcionar todos los servicios requeridos por una aplicación web más compleja. No resulta muy beneficioso escribir un motor de base de datos personalizado y específico para una aplicación, ya que existen algunos paquetes de software disponibles gratuitamente para este fin. Además, el uso de una base de datos de terceros también elimina la necesidad de que los desarrolladores web se dediquen a la tarea de desarrollar y mantener una base de datos.
base de datos mysql
Integrar bases de datos en aplicaciones Linux puede ser bastante sencillo mediante el uso de lenguajes de scripting y lenguajes de sistemas compilados como C. La base de datos MySQL (distribuida bajo la licencia pública GNU), disponible gratuitamente, proporciona un sofisticado conjunto de funciones SQL y es fácil de integrar en las aplicaciones. MySQL es rápido, multiproceso y admite los estándares ANSI y ODBC SQL. Junto con el software de terceros, MySQL admite tablas seguras para transacciones para aplicaciones de procesamiento de transacciones.
Nota: ¿Qué es el procesamiento de transacciones?
Una transacción es una serie de cambios en una base de datos que deben realizarse de forma atómica. O se deben ejecutar todos o no se debe ejecutar ninguno. Por ejemplo, todos los cambios necesarios en la base de datos al vender un producto en la Web forman una sola transacción.
La base de datos necesita restar tanto el saldo de la cuenta del cliente como el inventario de productos; de lo contrario, falla y no se realiza ninguna operación.
Una caída del servidor, por cualquier motivo, no debería provocar que las transacciones se ejecuten parcialmente. Por ejemplo, la sobrefacturación, la falta de entrega de productos o un inventario inexacto pueden ser el resultado de transacciones parcialmente completadas.
Una base de datos que admite el procesamiento de transacciones puede encapsular un conjunto de código de base de datos en una transacción. Cualquier falla durante la ejecución de la transacción hará que la base de datos vuelva al estado anterior a que comenzara la transacción.
Esto se logra manteniendo un registro de todas las operaciones de la base de datos, así como una copia de su tabla de estado original, lo que permite operaciones de reversión la próxima vez que se reinicie el servidor después de una falla. Esta sobrecarga de tiempo y espacio es una compensación necesaria para un sistema de base de datos seguro para las transacciones.
Un único servidor MySQL controla una serie de bases de datos, a todas las cuales se accede de manera similar a través del servidor. Cada base de datos es en realidad un conjunto de cualquier número de tablas, similar en concepto a los usuarios de otras bases de datos SQL. Cada tabla consta de columnas de datos escritos. Los datos pueden ser números enteros, valores reales, cadenas u otros tipos, incluidos flujos binarios sin formato. Cada fila de la tabla es un registro almacenado en la base de datos.
MySQL está diseñado y estructurado como cliente/servidor. El servidor mysqld puede ejecutarse en cualquier máquina a la que se pueda acceder desde Internet (preferiblemente en la misma máquina que el servidor web o lo más cerca posible para garantizar tiempos de respuesta razonables). El cliente MySQL utiliza solicitudes para contactar al servidor MySQL para modificar o consultar la base de datos propiedad del servidor. En una aplicación web habilitada para bases de datos, el cliente de la base de datos es el servidor web o un script CGI generado por el servidor web. Estos clientes pueden escribirse en un lenguaje de secuencias de comandos de alto nivel o en un lenguaje de sistema de bajo nivel, siempre que exista una API de base de datos para ese lenguaje. En Linux, la mayoría de los lenguajes de secuencias de comandos se implementan en C y, dado que existe la API MySQL C, debería ser fácil agregar soporte MySQL a cualquier lenguaje o herramienta de secuencias de comandos existente. La mayoría de los lenguajes de secuencias de comandos ya han completado este paso.
API MySQL
La API de MySQL está disponible en una variedad de idiomas, incluidos casi todos los idiomas que realmente se utilizan para escribir backends de sitios web. Usando estas API podemos construir un cliente MySQL controlado por un servidor web.
La API (para acceso a la base de datos) funciona en modo basado en conexión. Lo primero que debe hacer el cliente es abrir una conexión al servidor MySQL. Esto incluye autenticar adecuadamente la conexión utilizando un nombre de usuario y una contraseña conocidos por el servidor. Una vez establecida la conexión, el servidor selecciona una base de datos específica para usar. Una vez que se determina la inicialización, la aplicación cliente (en nuestro caso, el script CGI del lado del servidor) puede interactuar con la base de datos de dos maneras: puede ejecutar comandos SQL regulares, incluida la adición y eliminación de tablas, y agregar registros a ellos también puede ejecutar consultas en la base de datos que devuelve resultados. La consulta genera un conjunto de registros que coinciden con la consulta y el cliente puede acceder a los registros uno por uno hasta que se hayan visto todos los registros o el cliente cancele la recuperación de registros pendientes. Una vez que el script ha terminado de trabajar con la base de datos, se cierra la conexión con el servidor.
Para crear un sitio web que integre el acceso a la base de datos, debe escribir scripts CGI para generar resultados dinámicos según el estado de la base de datos. Los servidores web ejecutan scripts CGI y luego generan HTML con el formato adecuado en su flujo de salida estándar. El servidor web captura el HTML y lo envía de vuelta al cliente como si la solicitud fuera una página HTML estática. En el proceso de generación de HTML, los scripts pueden modificar la base de datos o pueden consultar e incorporar los resultados en su salida.
Como ejemplo para explicar brevemente el proceso anterior, el siguiente código (escrito en C y Tcl) consulta una base de datos que contiene una lista de productos a la venta por una empresa. Esto de ninguna manera utiliza todas las características de la API de MySQL en ambos idiomas, pero proporciona un ejemplo rápido y fácilmente extensible que puede ejecutar cualquier comando SQL en el contenido de la base de datos. En este ejemplo, el script muestra todos los productos por debajo de un precio específico. En la práctica, el usuario podría introducir el precio en un navegador web y luego enviarlo al servidor. Hemos omitido los detalles de la lectura de variables de entorno para determinar los valores del formulario HTML porque no es diferente a ejecutar en un script CGI que no admite una base de datos. Para mayor claridad, asumimos que ciertos parámetros (como el precio a consultar) se establecen de antemano.
El siguiente código se implementa en Tcl utilizando la interfaz de base de datos genérica Tcl disponible gratuitamente. La ventaja de una interfaz de este tipo es que Tcl se interpreta y puede desarrollar y modificar el código rápidamente.
ejemplo de tcl
#Este código imprime todos los productos en la base de datos.
# que están por debajo de un precio específico (se supone que ha sido determinado
# de antemano y almacenado en la variable targetPrice)
# La salida está en formato de tabla HTML, apropiada para salida CGI
#cargar la biblioteca de objetos compartidos de SQL, el intérprete Tcl también podría hacerlo.
#se han compilado con la biblioteca, por lo que esta línea es innecesaria
cargar /home/aroetter/tcl-sql/sql.so
#estos están bien definidos de antemano, o podrían
#ser pasado al script
establecer DBNAME "clienteWebSite";
establecer TBLNAME "productos";
establecer DBHOST "backend.company.com"
setDBUSER "usuario mysql"
establecer DBPASSWD "abigsecret"
establecer precio objetivo 200;
#conectarse a la base de datos
establecer identificador [sql connect $DBHOST $DBUSER $DBPASSWD]
sql selectdb $handle $DBNAME ;# obtener base de datos de prueba
#ejecutar una consulta utilizando el código SQL especificado
consulta SQL $handle "seleccione * de $TBLNAME donde precio <= $targetPrice"
#imprimir el encabezado de la tabla html
pone "<borde de la tabla=4>"
pone "<th>Id. del producto <th ancho=200>Descripción <th>Precio ($)"
#filas de la tabla de salida: cada fila de recuperación recupera un resultado
#de la consulta sql
while {[establecer fila [sql fetchrow $handle]] != ""} {
establecer prodid [lindex $ fila 0]
descripción del conjunto [lindex $fila 1]
precio fijo [lindex $fila 2]
pone "<tr><td>$prodid <td align=center>$descript <td>$precio"
}
pone "</table>"
#vaciar el búfer de resultados de la consulta; en este caso ya debería estar vacío
consulta final SQL $ manejar
#cerrar la conexión db - en la práctica esta misma conexión
#se utiliza para múltiples consultas
sql desconectar $ manejar
El siguiente código es el script equivalente escrito en C++ usando la API oficial de MySQL C++ MySQL++. La ventaja de esta versión es que está compilada y, por tanto, es más rápida que los lenguajes interpretados. El código de base de datos que se utiliza con frecuencia en un sitio específico debe escribirse en C o C++ y luego accederse mediante scripts o directamente desde el servidor web para mejorar el tiempo de ejecución general.
Ejemplo de C++
#incluir
#incluir
#incluir
const char *DBNAME = "sitio web del cliente";
const char *DBTABLE = "productos";
const char *DBHOST = "backend.empresa.com";
const char *DBUSER = "mysqluser";
const char *DBPASSWD = "abigsecret":
int principal() {
intentar {
//abre la conexión a la base de datos y consulta
Conexión con(DBNAME, DBHOST, DBUSER, DBPASSWD);
Consulta consulta = con.query();
//escribe código sql válido en el objeto de consulta
consulta << "seleccionar * de " << DBTABLE;
//ejecutar la consulta y almacenar los resultados
Resultado res = query.store();
//escribe el encabezado de la tabla html
cout << "<borde de tabla=4>n";
cout << "<th>Id. del producto <th ancho=200>Descripción"
<< "<th>Precio ($)" << endl;
Resultado::iterador curResult;
fila fila;
//iterar cada resultado y ponerlo en una tabla html
para (curResult = res.begin(); curResult != res.end(); curResult++) {
fila = *curResultado;
cout << "<tr><td align=center>" << fila[0]
<< "<td>" << fila[1]
<< "<td>" << fila[2] << endl;
}
cout << "</table>" << endl;
} captura (BadQuery er) {
// manejar una consulta incorrecta (generalmente causada por un error de sintaxis SQL)
cerr << "Error: " << er.error << endl;
devolver -1;
} captura (BadConversioner) {
//manejamos también los errores de conversión fuera de la base de datos
cerr << "Error: No se puede convertir "" << er.data << "" a ""
<< er.type_name << ""." << endl;
devolver -1;
}
devolver 0;
}
seguridad
La creación de aplicaciones basadas en la Web en la Web tiene algunos problemas que los desarrolladores deben considerar. Aún es necesario considerar todas las cuestiones relacionadas con los programas CGI en el servidor web, como los permisos de procesamiento del servidor web y las comprobaciones de entrada en el lado del script.
Además, también es necesario mantener la seguridad del sistema de base de datos. Esto implica proteger el sistema de permisos del servidor de la base de datos y hacer que las conexiones desde los clientes de la base de datos al servidor sean seguras.
MySQL proporciona un sistema de seguridad profundo que algunas personas describen como "avanzado pero no estándar". MySQL permite el acceso del cliente según el nombre de usuario, el host del cliente y la base de datos a la que se accede. Para crear un sistema seguro, haga que todos los usuarios utilicen contraseñas seguras y no les dé ningún acceso que no necesiten en absoluto. Esto incluye privilegios aparentemente inofensivos, como privilegios de manejo que permiten a un usuario ver todos los procesos en ejecución, incluidos aquellos que cambian las contraseñas de otros usuarios. El mejor enfoque es ejecutar el proceso del servidor como un usuario Unix sin privilegios para que, si una base de datos se ve comprometida, no destruya todo el sistema. Esto es similar a ejecutar httpd como usuario nadie en lugar de root. Las tablas que describen el acceso al sistema se almacenan como bases de datos MySQL independientes y el usuario root de MySQL puede actualizarlas. Tenga en cuenta que el servidor MySQL otorga privilegios basados en los nombres de usuario de MySQL, que son diferentes de los nombres de usuario de Unix. Sin embargo, existe un nombre de usuario raíz de MySQL, que tiene permisos completos en la base de datos. Una vez que el servidor determina quiénes son los clientes que se conectan y a qué intentan conectarse, el acceso se controla en función de un conjunto determinado de permisos. Para evitar que DNS falsifique los nombres de host en la tabla de acceso, puede ingresar las direcciones IP de todos los hosts o pedirle al servidor que resuelva las direcciones IP en los nombres de host originales para que sea más difícil para otros interceptar solicitudes y respuestas de DNS. .
Además de las tablas de acceso al servidor, la comunicación con el servidor también debe ser segura. Al iniciar sesión en el servidor desde el cliente, la contraseña no se envía en texto sin formato; sin embargo, todos los comandos SQL posteriores se enviarán en texto sin formato; Para mayor seguridad, utilice ssh para configurar el reenvío de puertos. Cifra toda la comunicación entre el servidor y el cliente, evitando que nadie pueda observarla en tránsito. Los datos del cliente se envían al puerto de la máquina local del cliente donde está escuchando el servidor ssh local. Lo utiliza el servidor ssh local, lo cifra y lo envía al servidor ssh remoto, que lo descifra y lo reenvía al puerto del servidor MySQL.
En la práctica, el enfoque más seguro es ejecutar el servidor de base de datos en la misma máquina que el servidor web y dejar que los scripts CGI generados por el servidor web se comuniquen con el servidor MySQL a través de sockets UNIX (nativos). Esta configuración permite al administrador de la base de datos deshabilitar todas las conexiones remotas al servidor MySQL. Si los servidores web y de base de datos deben estar en máquinas diferentes, cifre todas las comunicaciones entre ellos o conecte las dos máquinas a través de sus propias redes dedicadas y físicamente aisladas. Cree solo una cuenta de usuario (que no sea el usuario raíz) utilizada por el servidor web para iniciar sesión en el servidor de la base de datos.
Los sitios web basados en bases de datos son herramientas poderosas que permiten a los desarrolladores crear sitios dinámicos que brindan información actualizada y permiten que los cambios iniciados por el cliente persistan en múltiples sesiones. El uso de bases de datos back-end es esencial para gestionar usuarios de comercio electrónico y otras aplicaciones. Al utilizar software disponible gratuitamente, es posible crear un sitio basado en bases de datos que integre de forma segura la conectividad de la base de datos en la arquitectura CGI existente del sitio.