\documentclass[a4paper]{article}
\usepackage{linuxdoc-sgml}
\usepackage{qwertz}
\usepackage{url}
\usepackage[latin1]{inputenc}
\usepackage{t1enc}
\usepackage[english]{babel}
\usepackage{epsfig}
\usepackage{null}
\def\addbibtoc{
\addcontentsline{toc}{section}{\numberline{\mbox{}}\relax\bibname}
}%end-preamble
\title{Artículo para la revista Linux Actual número 13: Interfaces WWW a Bases de Datos.}
\author{Javier Fernández-Sanguino Peña {\em }
{\tt <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.}


\begin{document}
\maketitle

\section{Introducción a la serie}

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 {\itshape World Wide
Web\/}.

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.




\section{Introducción breve a las Bases de Datos}

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 {\itshape /etc/passwd\/}) 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, {\itshape Standard Query Language\/}). 






\section{El interfaz World Wide Web a una base de datos.}

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 ({\itshape switches\/},
conmutadores, o {\itshape routers\/}) 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 {\itshape yahoo\/}, 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.




\section{GNU/Linux como sistema de desarrollo}

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.






\section{Elección de los componentes}

Para montar un sistema de interfaz de bases de datos vía WWW se han
elegido como componentes básicos:
\begin{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 {\itshape debe\/} 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..).
\end{itemize}





\section{Instalación de los componentes}

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 {\ttfamily apache} y {\ttfamily postgresql}.

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.




\section{Comprobación de la instalación: Apache}

Para ver que efectivamente tenemos el servidor de web instalado y
lanzado haremos lo siguiente:

\begin{itemize}
\item Comprobaremos que existe el demonio que atiende a las peticiones
y está actualmente ejecutándose. Para ello ejecutamos {\ttfamily ps aux $|$
grep apache}. Que nos deberá mostrar el proceso ejecutándose. Si
no aparece una lista de procesos lo deberíamos reiniciar con
{\ttfamily /etc/init.d/apache start} (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 {\ttfamily telnet localhost 80} 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 {\ttfamily close} (más
información {\ttfamily man telnet})
\item Para ver que sirve adecuadamente páginas lanzaremos un navegador
contra el servidor, escribiendo como dirección
{\ttfamily http://localhost/}. Si el servidor ha sido adecuadamente
lanzado veremos una página de muestra.
\end{itemize}


En cualquier caso si vemos cualquier problema es recomendable acudir a
la documentación. En el caso de Debian viene dentro del paquete
{\ttfamily apache-doc}, y que, tras instalar, incluirá la documentación
en {\ttfamily /usr/doc/apache-doc}. También es recomendable acudir a los
registros del programa que se encuentran (en Debian) en
{\ttfamily /var/log/apache}.






\section{Comprobación de la instalación: PostgreSQL}

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 ({\itshape Database Administrator\/}) 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, {\itshape su -
postgres\/}. Este usuario tiene como directorio {\itshape home\/} el
{\ttfamily /var/postgres} que es donde se van a encontrar todos los
ficheros que utilice la base de datos. Tras esto haremos algunas
pruebas:

\begin{itemize}
\item De igual manera que para el servidor de web, la base de datos se
lanza como un servicio llamado {\itshape postmaster\/} en un puerto
determinado. Para ver si el servidor está lanzado haremos {\ttfamily ps aux
$|$grep postgres} 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
{\ttfamily /etc/init.d/postgres start}.
\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 {\ttfamily /etc/services}), y
podríamos probarlo conectándonos mediante un {\ttfamily telnet} 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 {\ttfamily pgsql} sin argumentos. Si nos da un
{\itshape prompt\/} del estilo de {\ttfamily template1=$>$} estará
funcionando correctamente (saldremos con Ctrl+D o con "$\backslash$q"). Si da un
error posiblemente no esté funcionando.
\end{itemize}


De la misma forma que Apache, para cualquier problema debemos
consultar la documentación, que en Debian se instala en el paquete
{\ttfamily postgres-doc}, y los ficheros de registro que ahora estarán en
{\ttfamily /var/log/postgres.log}.




\section{Gestión como usuario postgres}

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
{\ttfamily /usr/lib/postgresql/bin} los programas que son necesarios para
gestionar "desde cero" la base de datos. Estos programas estarán en el
{\ttfamily PATH} 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 {\itshape postmaster\/} se encarga de gestionar, en el
caso de Debian estos ficheros se instalan por defecto en
{\ttfamily /var/lib/postgres/data}. 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.

\begin{itemize}
\item {\ttfamily cleardbdir}: 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 {\itshape postmaster\/}.
\item {\ttfamily initdb}: crea un nuevo sistema de base de datos, crea
los directorios necesarios para el sistema y la base de datos
{\itshape template1\/} 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 {\ttfamily initlocation}: prepara un directorio para albergar el
sistema de base de datos.
\item {\ttfamily pg\_passwd}: permite manipular el fichero de contraseñas
de la base de datos. Se trata de una aplicación similar al programa
{\ttfamily passwd} pero para el sistema de base de datos.
\item {\ttfamily pg\_upgrade}: 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 {\ttfamily pg\_dump} y {\ttfamily pg\_dumpall} 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 {\ttfamily pg\_id}: devuelve el identificador de usuario
correspondiente al usuario administrador de las bases de datos.
\item {\ttfamily createdb}: crea una base de datos en nuestro sistema de
base de datos. En realidad llama al interfaz {\ttfamily pgsql} para
realizar esto.
\item {\ttfamily createuser}: crea un usuario reconocido en el sistema de
bases de datos. Los usuarios del sistema de base de datos{\itshape no\/}
tienen por qué tener relación con los usuarios en nuestro sistema
operativo, pudiendo haber usuarios distintos. 
\item {\ttfamily destroydb}: elimina una base de datos.
\item {\ttfamily destroyuser}: elimina un usuario del sistema de bases de
datos.

\end{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.




\section{Herramientas de gestión de la base de datos}

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:

\begin{itemize}
\item {\ttfamily pgsql}: 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 {\ttfamily $\backslash$h} 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
{\ttfamily $\backslash$?}. 
\item {\ttfamily pgaccess} (ú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 {\ttfamily libpgtcl}.
\item {\ttfamily gtksql} (ú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 {\ttfamily gasql}: un interfaz en Gtk para PostgreSQL desarrollado
para el proyecto GNOME, aún se encuentra en desarrollo, pero tiene
algunas funcionalidades útiles.
\end{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 {\ttfamily wisql} y {\ttfamily owd} que el autor aún no ha probado, y
serán comentadas en posteriores artículos.




\section{Siguientes artículos}

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.




\section{Sumarios}






\section{Listados}

LISTADO 1-



Para el lector interesado se recomienda buscar más información en
diversos servidores de web. Estos son:

\begin{itemize}
\item PostgreSQL: {\em }
{\tt <http://www.postgresql.org>} y su FAQ en
{\em }
{\tt <http://www.postgresql.org/docs/>}.
\item Apache: http://www.apache.org
\item El HOWTO de PostgreSQL para Linux: 
{\em }
{\tt <http://metalab.unc.edu/LDP/HOWTO/PostgreSQL-HOWTO.html>},
también se instala en {\ttfamily /usr/doc/HOWTO} al instalar el paquete
HOWTO en Debian.
\item PGaccess: {\em }
{\tt <http://www.flex.ro/pgaccess>}
\item gtksql: {\em }
{\tt <http://www.mygale.org/\~{}bbrox/GtkSQL>}
\item gasql: {\em }
{\tt <http://www.gnome.org/applist>}
\end{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."
({\em }
{\tt <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
({\em }
{\tt <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 {\em }
{\tt <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










\section{Capturas}

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.
\begin{itemize}
\item postgresl.jpg: PostgreSQL es el sistema de base de datos libre
más potente del mundo.
\label{fig-postgresql}
\item pgaccess.gif. PgAccess es un interfaz tremendamente útil para la
gestión de nuestro sistema de base de datos.
\label{fig-pgaccess}
\item gtksql.gif. Para los que quieran una simple "hoja SQL" gtksql es
la herramienta a utilizar.
\label{fig-gtksql}
\end{itemize}





\section{Notas de maquetación}

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.






\section{Notas de coordinación}

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.





\end{document}
