Artículo para la revista Linux Actual número 13: Interfaces WWW a Bases de Datos. <author>Javier Fernández-Sanguino Peña <url url="jfs@computer.org"> <date>18 Marzo 2000 <abstract> Con este artículo va a dar comienzo a una serie que va a estudiar las herramientas, diseño y programación para unir dos importantes tecnologías entre sí: Internet y las Bases de Datos. <sect>Introducción a la serie <p> Este artículo es el primero de una serie que pretende enseñar al lector como, con herramientas sobre GNU/Linux se pueden unir dos tecnologías tan importantes hoy en día como son las Bases de Datos y el fenómeno de Internet, en particular la <em>World Wide Web</em>. En primer lugar se va a realizar una introducción breve a estas tecnologías y a explicar la razón de usar como herramienta de desarrollo e integración a GNU/Linux. Posteriormente se analizarán las herramientas que pueden servir para gestionar la base de datos, y se aplicarán todos los conceptos en el diseño de una aplicación real. Se verán los métodos de programación y las alternativas existentes actualmente para integrar ambos sistemas, deteniéndonos en una de ellas para solucionar la implementación de la aplicación. <sect>Introducción breve a las Bases de Datos <p> La tecnología de bases de datos es una de las más antiguas dentro de la ciencia de la informática, esencialmente es una tecnología que se basa en la capacidad para almacenar y recuperar información relacionada entre sí. Una base de datos puede ser desde un fichero de texto (estilo <em>/etc/passwd</em>) hasta un conjunto de tablas repartidas en ficheros binarios y que acumulen millones de registros. En cualquier caso es necesario un programa capaz de gestionar estos datos y permitir acceder a esta información de la manera más rápida posible. Existe más de un esquema a la hora del desarrollo y definición de las bases de datos: bases de datos orientadas a objetos, bases de datos relacionales, bases de datos jerárquicas, etc... Hoy en día, a pesar del crecimiento de la programación orientada a objetos y, por tanto, de las bases de datos diseñadas con la misma filosofía (que actualmente permiten el desarrollo de las bases de datos multimedia), el tipo de bases de datos más utilizada sigue siendo las bases de datos relacionales. Es necesario distinguir en una base de datos su diseño de su implementación, como veremos más adelante, para el mismo diseño se pueden escoger implementaciones distintas que se ajusten más o menos a éste. Evidentemente, si se escoge una implementación inadecuada se perderán algunas de las ventajas del modelo realizado en la etapa de diseño. Las bases de datos constituyen una importante herramienta a la hora de almacenar y recuperar la información. Sin embargo, para utilizar esta herramienta es necesario ofrecer un interfaz al usuario para abstraer toda su complejidad. Sin este interfaz la base de datos puede seguir utilizándose pero el usuario ha de conocer el "lenguaje" de la misma para hacer uso de ésta (actualmente el más utilizado es SQL, <em>Standard Query Language</em>). <sect>El interfaz World Wide Web a una base de datos. <p> Así pues, el interfaz es un elemento fundamental a la hora de hacer uso de una base de datos, aquí es donde entra la World Wide Web (WWW). La World Wide Web se puede considerar como el elemento de Internet que integra el cliente universal, y por tanto, puede usarse como el interfaz universal a todo tipo de aplicaciones. Muchos fabricantes de equipos y desarrolladores han empezado a mover sus aplicaciones e interfaces para que puedan ser operados con clientes basados en ésta. Así, por ejemplo, nos encontramos con fabricantes de elementos de interconexión de redes (<em>switches</em>, conmutadores, o <em>routers</em>) o impresoras de red que incluyen en su hardware un servidor de WWW para que sus herramientas puedan ser manejadas, configuradas, en fin, gestionadas, desde un navegador de WWW. La ventaja para el fabricante es clara ya que le evita tener que crear una herramienta para el cliente, ahorrando en el desarrollo; no olvidemos que para un fabricante de hardware un cliente puede ser, potencialmente, cualquier combinación posible de uso de hardware, sistema operativo y software. Así pues en lugar de tener que realizar un interfaz para, por ejemplo, Solaris, otro para Linux y otro para Windows NT, el fabricante indica al usuario que sólo necesita un navegador de WWW como interfaz a la gestión de su equipo. No será necesario que programe un interfaz para cada plataforma en la que quiera que su hardware sea gestionado sino que, al incorporar tecnologías estándar de la WWW tanto de presentación (HTML) como de interacción cliente servidor (protocolo HTTP) su herramienta puede ser utilizada desde cualquier lugar y con cualquier plataforma que tenga un cliente de WWW. El movimiento del acceso de bases de datos de sistemas propietarios a un sistema abierto como es la WWW, empezó ya hace años, y su arquetipo un sistema por y para la WWW, es el conocido <em>yahoo</em>, en realidad cualquier buscador en la WWW. Este buscador no es más que una base de datos de documentos al que se accede mediante un interfaz WWW. La ventaja, al margen de la que ofrezca la aplicación en si, es que, por un lado, cualquiera puede "preguntar" a la base de datos sin conocer el funcionamiento de lo que hay detrás, por otro los "clientes" potenciales son todos aquellos con acceso a la WWW porque los estándares usados son los mismos que para acceder a cualquier otro servidor. <sect>GNU/Linux como sistema de desarrollo <p> GNU/Linux es un sistema ideal para instalar una base de datos que se va a utilizar desde Internet, no sólo por su demostrada velocidad en el acceso a bases de datos, sino también por la multitud de sistemas de bases de datos y herramientas que se pueden encontrar para GNU/Linux. En GNU/Linux se dispone actualmente de un buen número de sistemas de bases de datos, por un lado sistemas libres como PostgreSQL o BeagleSQL, por otro sistemas "semi-libres" como mSQL o mySQL, y, finalmente, sistemas propietarios: Oracle, Informix o Sybase. También dispone de una multitud de servidores de WWW, de entre los que merece una mención especial Apache, el servidor de WWW más utilizado en Internet. Finalmente, al tratarse de un sistema abierto y poderse optimizar "a medida" para el desarrollo a realizar se convierte en la alternativa ideal. No hay que olvidar tampoco el factor coste. En la actualidad se puede montar un sistema profesional utilizando herramientas totalmente libres, el coste será sólo el del hardware y el de las personas dedicadas a montarlo. El coste en licencias será nulo y puede creer el lector que el coste de un sistema de base de datos y un sistema operativo propietarios que dé las mismas prestaciones (sino menos) es ciertamente elevado (estamos hablando de millones de pesetas). Si se monta el sistema con herramientas libres se podrán adaptar al 100% para lo que se precisa ya que el desarrollador tendrá a su disposición el código fuente de todas ellas para adaptarlas a medida. <sect>Elección de los componentes <p> Para montar un sistema de interfaz de bases de datos vía WWW se han elegido como componentes básicos: <itemize> <item>Sistema operativo: Debian GNU/Linux 2.1. Actualmente Debian es la distribución que más herramientas ofrece para un desarrollador y para el usuario, con más de 5000 paquetes (4 cds de binarios en Debian 2.2) de código libre en la distribución principal. Si el lector es un desarrollador <em>debe</em> usar Debian GNU/Linux. Como núcleo del sistema utilizaremos un núcleo Linux 2.2 ajustado a las necesidades. <item>Servidor de web: Apache 1.3.3. El servidor de web más utilizado en Internet, extensible, seguro y rápido, y portado a multitud de sistemas. <item>Gestor de base de datos: PostgreSQL 6.3.2. Se ha elegido PostgreSQL en lugar de otros sistemas de base de datos semi-libres debido a su amplia licencia. Quizás otros sistemas de base de datos (como mySQL) puedan ser más rápidos pero PostgreSQL ofrece todas las capacidades necesarias para un desarrollo e implementación inicial. El cambio posterior de la base de datos a otro sistema de base de datos no será dificil si en las herramientas desarrolladas se hace uso de estándares para comunicarse con la misma (JDBC, SQL..). </itemize> <sect>Instalación de los componentes <p> Gracias al sistema de paquetes usado por las distribuciones de GNU/Linux, hoy en día se pueden instalar los componentes comentados previamente sin mayor esfuerzo por parte del administrador. Simplemente seleccionando el componente e instalándolo, restando sólo hacer la configuración (que en la mayor parte de los casos vendrá una por defecto pero será necesaria adaptar a las necesidades específicas del usuario). En el caso de Debian GNU/Linux instalaremos los paquetes <tt>apache</tt> y <tt>postgresql</tt>. Podríamos comentar cómo hacer la instalación a partir de cero desde el código fuente distribuido por los proyectos de desarrollo, pero no se va a comentar aquí como hacerlo ya que ha sido previamente comentado para ambos componentes en esta misma revista. Dado que aún no hemos especificado la aplicación que vamos a realizar no entraremos aún en la configuración de estos componentes, sino que la dejaremos para más adelante. Nos bastará con ver que los componentes han sido correctamente instalados y funcionan. <sect>Comprobación de la instalación: Apache <p> Para ver que efectivamente tenemos el servidor de web instalado y lanzado haremos lo siguiente: <itemize> <item>Comprobaremos que existe el demonio que atiende a las peticiones y está actualmente ejecutándose. Para ello ejecutamos <tt>ps aux | grep apache</tt>. Que nos deberá mostrar el proceso ejecutándose. Si no aparece una lista de procesos lo deberíamos reiniciar con <tt>/etc/init.d/apache start</tt> (esto es para Debian GNU/Linux, otras distribuciones ponen los guiones para lanzar los demonios de otra forma. <item>Probaremos el servidor para comprobar que funciona conectándonos al puerto en que por defecto se instala el demonio, el puerto 80. Bastará con hacer un <tt>telnet localhost 80</tt> y ver que efectivamente hay una conexión. Para cerrarla sin enviar pulsaremos Ctrl+5 lo que enviará el código de escape a la aplicación telnet y podremos cerrarla escribiendo <tt>close</tt> (más información <tt>man telnet</tt>) <item>Para ver que sirve adecuadamente páginas lanzaremos un navegador contra el servidor, escribiendo como dirección <tt>http://localhost/</tt>. Si el servidor ha sido adecuadamente lanzado veremos una página de muestra. </itemize> En cualquier caso si vemos cualquier problema es recomendable acudir a la documentación. En el caso de Debian viene dentro del paquete <tt>apache-doc</tt>, y que, tras instalar, incluirá la documentación en <tt>/usr/doc/apache-doc</tt>. También es recomendable acudir a los registros del programa que se encuentran (en Debian) en <tt>/var/log/apache</tt>. <sect>Comprobación de la instalación: PostgreSQL <p> Para probar la configuración de PostgreSQL vamos a utilizar uno de los interfaces de gestión que más adelante se comentarán, ya que se trata del más sencillo viene incluido con la distribución normal de PostgreSQL. Conviene comentar que Debian GNU/Linux viene con un usuario de gestión de la base de datos que es que el debe usarse para realizar la gestión de la misma: creación de usuarios de la base de datos y bases de datos. Mientras no se haya creado ningún usuario de base de datos que sea un DBA (<em>Database Administrator</em>) será necesario usar siempre éste. Por ello para probar la base de datos lo primero que haremos será "convertirnos" en este usuario haciendo, como superusuario, <em>su - postgres</em>. Este usuario tiene como directorio <em>home</em> el <tt>/var/postgres</tt> que es donde se van a encontrar todos los ficheros que utilice la base de datos. Tras esto haremos algunas pruebas: <itemize> <item>De igual manera que para el servidor de web, la base de datos se lanza como un servicio llamado <em>postmaster</em> en un puerto determinado. Para ver si el servidor está lanzado haremos <tt>ps aux |grep postgres</tt> que nos deberá listar un proceso lanzado como usuario postgres. Si no es así quizás no esté lanzado (aunque el gestor de paquetes lo lanza al instalarlo) pero se puede lanzar con <tt>/etc/init.d/postgres start</tt>. <item>Ahora mismo no probaremos que nos podemos conectar al servidor ya que, posiblemente, aún no esté configurado para aceptar conexiones a través de TCP/IP. Si estuviera configurado se lanzaría en el puerto 5432 (ver <tt>/etc/services</tt>), y podríamos probarlo conectándonos mediante un <tt>telnet</tt> como antes. <item>Dado que posiblemente acepte sólo conexiones de usuarios de la misma máquina, probaremos a conectarnos con el interfaz de texto. Para ello ejecutaremos <tt>pgsql</tt> sin argumentos. Si nos da un <em>prompt</em> del estilo de <tt>template1=></tt> estará funcionando correctamente (saldremos con Ctrl+D o con "\q"). Si da un error posiblemente no esté funcionando. </itemize> De la misma forma que Apache, para cualquier problema debemos consultar la documentación, que en Debian se instala en el paquete <tt>postgres-doc</tt>, y los ficheros de registro que ahora estarán en <tt>/var/log/postgres.log</tt>. <sect>Gestión como usuario postgres <p> Hay ciertas herramientas de gestión de la base de datos que son necesarias conocer para utilizarlas como usuario 'postgres'. Veremos más adelante su uso particular para la base de datos que se va a crear, pero no está de más recordarlas aquí. Al instalar la distribución de postgres, quedarán instalados en el directorio <tt>/usr/lib/postgresql/bin</tt> los programas que son necesarios para gestionar "desde cero" la base de datos. Estos programas estarán en el <tt>PATH</tt> del usuario postgres. Antes de nada es necesario tener clara una cosa del sistema de base de datos. Un sistema de base de datos es una colección de bases de datos administradas por el mismo usuario, físicamente el sistema así como cada base de datos, es una serie de ficheros pertenecientes al usuario y que el servicio <em>postmaster</em> se encarga de gestionar, en el caso de Debian estos ficheros se instalan por defecto en <tt>/var/lib/postgres/data</tt>. La ventaja de esta filosofía es que para mover la base de datos o hacer una copia de seguridad de ésta basta con copiar los ficheros de la misma. <itemize> <item><tt>cleardbdir</tt>: destruye todas las bases de datos instaladas. Sólo se utiliza cuando se quiere reinicializara el sistema de base de datos y es necesario para el demonio <em>postmaster</em>. <item><tt>initdb</tt>: crea un nuevo sistema de base de datos, crea los directorios necesarios para el sistema y la base de datos <em>template1</em> que se trata de la plantilla a través de la cual se generarán el resto de las bases de datos. En un sistema en el que se haya instalado correctamente la base de datos esto se habrá realizado ya y el usuario no tendrá que hacerlo. <item><tt>initlocation</tt>: prepara un directorio para albergar el sistema de base de datos. <item><tt>pg_passwd</tt>: permite manipular el fichero de contraseñas de la base de datos. Se trata de una aplicación similar al programa <tt>passwd</tt> pero para el sistema de base de datos. <item><tt>pg_upgrade</tt>: permite actualizar el sistema de base de datos. Cuando se cambia de versión del sistema de base de datos es necesario actualizar los datos ya que sino serán incompatibles con el nuevo sistema. Este programa facilita el movimiento de una versión a otra. <item><tt>pg_dump</tt> y <tt>pg_dumpall</tt> vuelcan (una base de datos en el caso del primero y todas las bases el segundo), las ordenes SQL necesarias en un fichero ASCII de forma que la base de datos se pueda recuperar a través de éste. Sin hacer uso de ninguna opción la base de datos será volcada con todos los datos incluidos. Al tratarse de SQL estándar, este mismo fichero puede usarse para crear de nuevo la base de datos en otro sistema de bases de datos, facilitando la migración a cualquier otro sistema. <item><tt>pg_id</tt>: devuelve el identificador de usuario correspondiente al usuario administrador de las bases de datos. <item><tt>createdb</tt>: crea una base de datos en nuestro sistema de base de datos. En realidad llama al interfaz <tt>pgsql</tt> para realizar esto. <item><tt>createuser</tt>: crea un usuario reconocido en el sistema de bases de datos. Los usuarios del sistema de base de datos<em>no</em> tienen por qué tener relación con los usuarios en nuestro sistema operativo, pudiendo haber usuarios distintos. <item><tt>destroydb</tt>: elimina una base de datos. <item><tt>destroyuser</tt>: elimina un usuario del sistema de bases de datos. </itemize> El administrador de la base de datos necesita conocer estas herramientas para usarlas, si surge la necesidad. En particular, aquellas funciones que no se pueden hacer a través del interfaz, ya que la creación y destrucción de bases de datos y usuarios se podrá hacer con las herramientas de gestión que ahora se analizarán. <sect>Herramientas de gestión de la base de datos <p> Antes de hacer nada en el sistema de base de datos, ni crear usuarios ni otras bases de datos, deberemos conocer primero qué programas podremos usar para la gestión de la base de datos: <itemize> <item><tt>pgsql</tt>: el interfaz en modo texto para acceder a la base de datos, permite realizar todas las funciones de acceso a una base de datos mediante órdenes SQL (teclear <tt>\h</tt> para acceder a la lista de todas las órdenes disponibles) y obtener también información del sistema de base de datos, como ver las bases de datos, los tipos de datos soportados, etc... para ver las órdenes disponibles teclear <tt>\?</tt>. <item><tt>pgaccess</tt> (última versión 0.98.4): interfaz en Tcl/Tk que permite visualizar las tablas, crearlas mediante un formulario de forma rápida, etc.. Es el interfaz más evolucionado para postgresql aparte del interfaz textual. No son necesarios conocimientos de SQL para hacer uso de muchas de las funciones y permite administrar tanto la base de datos como los datos en sí de una manera eficaz. En el caso de Debian para instalarlo es necesario instalar el paquete <tt>libpgtcl</tt>. <item><tt>gtksql</tt> (última versión 0.3): interfaz en Gtk a la base de datos. Muestra las tablas de la base de datos y permite hacer consultas SQL, visualizando el resultado en el mismo interfaz. Se trata de una herramienta aún en desarrollo pero que le puede resultar útil a un administrador para hacer tareas sencillas. <item><tt>gasql</tt>: un interfaz en Gtk para PostgreSQL desarrollado para el proyecto GNOME, aún se encuentra en desarrollo, pero tiene algunas funcionalidades útiles. <!-- MIRAR --> <!-- <item><tt>wisql</tt> Precisa Tcl/Tk y TclX (versión extendida), versión 5. No --> <!-- PONER ? <item><tt>owd</tt>: Se trata de un sistema de gestión de bases de datos con un interfaz vía WWW aún en desarrollo. Permite crear bases de datos, consultar y modificar datos... --> </itemize> Estos programas nos van a ser útiles para poder acceder a la base de datos sin tener muchos conocimientos del funcionamiento de ésta, aunque nos va a ser imprescindible el conocimiento del lenguaje SQL, podemos utilizarlas en muchas situaciones. Existen otras herramientas como <tt>wisql</tt> y <tt>owd</tt> que el autor aún no ha probado, y serán comentadas en posteriores artículos. <sect>Siguientes artículos <p> En los siguientes artículos de esta serie vamos a analizar el desarrollo de una aplicación específica y a ver las herramientas necesarias para ofrecer un interfaz de acceso a nuestra base de datos mediante la WWW. Llevaremos a cabo el análisis de la aplicación así como su desarrollo y empezaremos a ver la ventaja de tener herramientas gráficas de gestión de la base de datos para detectar errores y depurar la aplicación. <sect>Sumarios <p> <sect>Listados <p> LISTADO 1- Para el lector interesado se recomienda buscar más información en diversos servidores de web. Estos son: <itemize> <item>PostgreSQL: <url url="http://www.postgresql.org"> y su FAQ en <url url="http://www.postgresql.org/docs/">. <item>Apache: http://www.apache.org <item>El HOWTO de PostgreSQL para Linux: <url url="http://metalab.unc.edu/LDP/HOWTO/PostgreSQL-HOWTO.html">, también se instala en <tt>/usr/doc/HOWTO</tt> al instalar el paquete HOWTO en Debian. <item>PGaccess: <url url="http://www.flex.ro/pgaccess"> <item>gtksql: <url url="http://www.mygale.org/~bbrox/GtkSQL"> <item>gasql: <url url="http://www.gnome.org/applist"> </itemize> También para seguir esta serie puede ser conveniente algún conocimiento de bases de datos generales. Se recomienda el libro de Silberschatz, Korth y Sudarsan: "Database Systems Concepts, III ed, Mc Graw-Hill, 1996." (<url url="http://www.bell-labs.com/topic/books/db-book/index.html">) que también ha sido traducido al castellano, otro libro también recomendado es el de Ullman y Widom: "A First Course in Database Systems" de 1997 editado por Prentice-Hall (<url url="http://www-db.stanford.edu/~ullman/fcdb.html">). Para el lector que quiera profundizar en SQL podrá encontrar muchos enlaces en la parte bibliográfica del HOWTO de PostgreSQL para Linux aunque también es recomendable el tutorial disponible en <url url="http://w3.one.net/~jhoffman/sqltut.htm">. Finalmente, se recomienda la lectura de los artículos relacionados con Bases de Datos publicados en Linux Actual ("Bases de Datos en Internet bajo GNU/Linux" de Alvaro del Castillo en LA 2 y la serie "ODBC sobre Linux" de Juan Antonio Martínez que comienza en LA 3 ) y en Linux Journal (número 5 de la edición en castellano "Especial Bases de Datos"). PIE LISTADO 1:Servidores donde encontrar más información <!-- LISTADO x- PIE LISTADO x: --> <sect>Capturas <p> Esta es la lista de ficheros adjuntos así como su pie de página. La primera captura puede ir en cualquier lado, las segundas conviene que estén hacia el final del artículo. <itemize> <item>postgresl.jpg: PostgreSQL es el sistema de base de datos libre más potente del mundo. <label id="fig-postgresql"><img src="postgresql.jpg"> <item>pgaccess.gif. PgAccess es un interfaz tremendamente útil para la gestión de nuestro sistema de base de datos. <label id="fig-pgaccess"><img src="pgaccess.gif"> <item>gtksql.gif. Para los que quieran una simple "hoja SQL" gtksql es la herramienta a utilizar. <label id="fig-gtksql"><img src="gtksql.gif"> </itemize> <sect>Notas de maquetación <p> Es mejor que, si no entra todo el artículo, antes que ponerlo a cuatro columnas se avise al autor de que es necesario recotarlo. Dado que es una serie no hay ningún problema en poner lo recortado en el siguiente artículo de la serie. Por favor, contactar con el autor si hay algún problema. <sect>Notas de coordinación <p> Este es el primer artículo de la serie, si es necesario recortarlo hablar con el autor para que lo que no se incluya en éste número se incluya en el siguiente artículo. </article>