ejemplos de postgre

40
Introducción a PostgreSQL Un ejemplo sencillo Tomás Javier Robles Prado Raúl Turienzo Fernández

Upload: melvin-marcos

Post on 06-Mar-2016

284 views

Category:

Documents


6 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Ejemplos de Postgre

Introducción a PostgreSQL

Un ejemplo sencillo

Tomás Javier Robles Prado

Raúl Turienzo Fernández

Page 2: Ejemplos de Postgre

Introducción a PostgreSQL: Un ejemplo sencillopor Tomás Javier Robles Prado y Raúl Turienzo Fernández

Se autoriza la copia, distribución y/o modificación de este documento según los términos de la GNU FreeDocumentation License (Licencia de documentación libre GNU), versión 1.1 o cualquier versión posterior publicadapor la Free Software Foundation; sin secciones invariables, textos previos o textos finales.Los programas de ejemplo de este documento son software libre; pueden ser redistribuidos y/o modificados según lostérminos de la licencia de Python publicada por la Python Software Foundation.

Historial de revisionesRevisión 0.01 25-11-2002 Revisado por: tjrp-rtfDocumento de partidaRevisión 0.10 16-12-2002 Revisado por: tjrp-rtfDocumento terminado

Page 3: Ejemplos de Postgre

Tabla de contenidos1. Introducción.......................................................................................................................12. Empezando.........................................................................................................................3

Consiguiendo e instalando PostgreSQL ...................................................................3Poniendo en marcha el servidor ................................................................................3Administración remota con OpenSSH........................................................................4

3. Describiendo el problema...............................................................................................9Enunciado del problema .............................................................................................9Construyendo el diagrama E-R..................................................................................9Construyendo las tablas ............................................................................................13Consultando nuestra Base de Datos........................................................................16Consideraciones finales .............................................................................................17

Observaciones ...................................................................................................17Semántica no reflejada .....................................................................................18

4. Pgaccess : La herramienta gráfica de PostgreSQL ....................................................19Introducción a Pgaccess ...........................................................................................19Utilizando Pgaccess ..................................................................................................20

5. Accediendo mediante software: Pycemen ...................................................................25¿Por qué Python?........................................................................................................25Comentando el programa .........................................................................................25

Funcionalidades de Pycemen ..........................................................................25Pycemen en acción.............................................................................................26¿Por qué una interfaz basada en texto? .........................................................28

6. Conclusiones finales.......................................................................................................317. ¿Por dónde sigo? .............................................................................................................33

Bibliografía ..................................................................................................................33Índice.....................................................................................................................................35

iii

Page 4: Ejemplos de Postgre

iv

Page 5: Ejemplos de Postgre

Capítulo 1. Introducción

En los últimos años, el software de bases de datos ha experimentado un auge extraor-dinario, a raíz de la progresiva informatización de casi la totalidad de las empresasde hoy día. No es extraño pues, que existan multitud de gestores de bases de datos,programas que permiten manejar la información de modo sencillo. De este modotenemos Oracle™1, Microsoft SQL Server™2, Borland Interbase™3 entre otras. Lassoluciones software que hemos citado son comerciales. Como siempre, en el mundodel software libre, siempre que se necesita algo, tarde o temprano se implementa. Asítenemos MySQL™4, gestor muy usado en la web (combinado con php y apache ) oPostgreSQL™5, que será el gestor que trataremos 6 .

Como hemos comentado, PostgreSQL es software libre. Concretamente está liberadobajo la licencia BSD, lo que significa que cualquiera puede disponer de su códigofuente, modificarlo a voluntad y redistribuirlo libremente 8, PostgreSQL además deser libre es gratuito y se puede descargar libremente de su página web para multitudde plataformas.

La versión actual de PostgreSQL es la 7.3, liberada el 27 de Noviembre de 2002 ypuede descargarse libremente desde su sitio oficial9. Incluso, si se tiene curiosidad,se puede bajar un fichero de audio con la pronunciación correcta10 de PostgreSQL .

Notas1. http://www.oracle.com

2. http://www.microsoft.com/sql/default.asp

3. http://www.borland.com/interbase/index.html

4. http://www.mysql.com

5. http://www.postgresql.org

6. Existe una interesante

7. http://www.mmlabx.ua.es/mysql-postgres.html. Viene a decir que PostgreSQL es superior en BBDD "a lo grande", mientras quepara conjuntos de datos pequeños o medianos MySQL gunciona mejor.

7. http://www.mmlabx.ua.es/mysql-postgres.html

8. Es más, la licencia BSD permite redistribuir el código modificado o no como soft-ware cerrado, en contraposición a la licencia GPL que fuerza a que las modifica-ciones sean publicadas también bajo la GPL.

9. http://www.postgresql.org

10. http://www.fr.postgresql.org/postgresql.mp3

1

Page 6: Ejemplos de Postgre

Capítulo 1. Introducción

2

Page 7: Ejemplos de Postgre

Capítulo 2. Empezando

Consiguiendo e instalando PostgreSQL

Vamos a describir el proceso de instalación de PostgreSQL para Linux. En nuestrocaso hemos utilizado la distribución RedHat™ 8.0. RedHat™ utiliza un sistema degestión de paquetes denominado RPMque permite instalar fácilmente el gestor debase de datos. Además PostgreSQL viene incluido en la distribución estándar por loque simplemente hemos de instalar los paquetes q nos interesen:

[jav@cable213a078 jav]$ rpm-Uvh postgresql-7.2.2-1.i386.rpm

En caso de no usar distribuciones basadas en RPMo simplemente por gusto, podemosbajar el código fuente de PostgreSQL de su web1. Una vez bajado, lo descomprimi-mos,

[jav@cable213a078 jav]$ tar xvzfpostgresql-7.2.2-1.tar.gz

nos movemos al directorio resultante y ejecutamos el script de configuración. 2

[jav@cable213a078 postgresql]$./configure

Si todo ha ido bien, es hora de compilar. Para ellos ejecutaríamos

[jav@cable213a078 postgresql]$ make

y si no hay errores, nos logueamos como root y ejecutamos

[root@cable213a078 postgresql]# make install

Y ya tenemos PostgreSQL instalado en nuestro equipo.

Poniendo en marcha el servidorVeamos ahora cómo hacer funcionar el servidor de base de datos. Lo primero es fijarla variable de entorno que almacenará la ruta hasta el directorio donde guardaremosla información de la base de datos:

[jav@cable213a078 postgresql]$ export PGDATA=/el/path/deseado/data

En nuestro caso:

[jav@cable213a078 postgresql]$ export PGDATA=/home/jav/db/data

El siguiente paso es crear las estructuras necesarias para iniciar el servidor de la basede datos. Esto se consigue con la orden initdb:

[jav@cable213a078 postgresql]$ initdbThe files belonging to this database system will be owned by user "jav".This user must also own the server process.

Fixing permissions on existing directory /home/jav/db/data... okcreating directory /home/jav/db/data/base... okcreating directory /home/jav/db/data/global... okcreating directory /home/jav/db/data/pg_xlog... okcreating directory /home/jav/db/data/pg_clog... okcreating template1 database in /home/jav/db/data/base/1... okcreating configuration files... ok

3

Page 8: Ejemplos de Postgre

Capítulo 2. Empezando

initializing pg_shadow... okenabling unlimited row size for system tables... okcreating system views... okloading pg_description... okvacuuming database template1... okcopying template1 to template0... ok

Success. You can now start the database server using:

/usr/bin/postmaster -D /home/jav/db/dataor

/usr/bin/pg_ctl -D /home/jav/db/data -l logfile start

Siguiendo las instrucciones que amablemente nos da initdb iniciamos el servidor,añadiendo los parámetros -i (para admitir conexiones TCP/IP, ya lo explicaremosmás adelante) y -o para obtener formato de fechas europeo en nuestra base de datos:

[jav@cable213a078 db]$ /usr/bin/postmaster -o -i -D /home/jav/db/data &

Tras algunos mensajes de depuración, tenemos el servidor corriendo en nuestramáquina. Ahora crearemos una base de datos para ver que la cosa marcha:

[jav@cable213a078 db]$ createdb pepaCREATE DATABASE

Como nos hemos quedado un poco fríos con la respuesta de PostgreSQL vamos aver si podemos hacer algo con esta base de datos:

[jav@cable213a078 db]$ psql pepaWelcome to psql, the PostgreSQL interactive terminal.

Type: \copyright for distribution terms\h for help with SQL commands\? for help on internal slash commands\g or terminate with semicolon to execute query\q to quit

pepa=# create table provincias(prefijo integer, nombre varchar(20));CREATE

pepa=# insert into provincias values(987, ’León’);INSERT 16559 1

pepa=# insert into provincias values(91, ’Madrid’);INSERT 16560 1

pepa=# insert into provincias values(923, ’Salamanca’);INSERT 16561 1

pepa=# select * from provincias;prefijo | nombre

---------+-----------987 | León

91 | Madrid923 | Salamanca

(3 rows)

Pues bueno, parece que la cosa funciona. Ya tenemos todo en marcha y funcionando.En adelante pasaremos a cosas mayores.

4

Page 9: Ejemplos de Postgre

Capítulo 2. Empezando

Administración remota con OpenSSH

En este apartado veremos cómo acceder a un máquina remota (donde está corriendola base de datos) de modo seguro para administrarla. Para ello utilizaremos ssh quepermite establecer conexiones entre máquinas de modo que toda la información queintercambien vaya encriptada.

Lo primero es habilitar el servidor ssh en la máquina a la que pretendamos ac-ceder.ssh utiliza el puerto 22 para las comunicaciones. Una vez cumplido este paso,ya estamos listos para aceptar conexiones remotas.

Ya hemos configurado lo necesario del lado del servidor. Veamos ahora los pasosnecesarios del lado del cliente. Distinguiremos entre máquinas Linux y Windows 3 .

• En Linux (o Unix) posiblemente ya tengamos el cliente ssh instalado. Si no es asínos dirigiremos al sitio oficial de OpenSSH4 de donde bajaremos los fuentes, loscompilaremos e instalaremos. Dependiendo de la distribución que usemos serámás fácil o más difícil encontrar paquetes precompilados que nos ahorren el tra-bajo.

Suponiendo que ya tenemos el cliente instalado, es hora de acceder a la máquinaremota. Sin entrar en detalles, diremos que basta con:[jav@cable213a078 jav]$ ssh [email protected]@212.183.213.178’s password:Esta cuenta aloja el trabajo de BBDDDirectorios:-datos: Contiene los ficheros de la base de datos-docbd: Contiene los fuentes de la documentación y la documentación en sí. Eje-cute make single-html para documentación en un único html o make multiple-html para doc-umentación en varios html.-programa: Contiene el código del programa que acceda a la BBDD

Cualquier duda puede remitirla a [email protected] o [email protected][bbdd@cable213a078 bbdd]$

Genéricamente basta con ssh login@IP y se nos pedira el password. Una vez intro-ducido, ya estaremos trabajando en la máquina remota y todo lo que hagamos seejecutará en ella:[bbdd@cable213a078 bbdd]$ lsdatos docbd programa

• En Windows actuaremos de un modo similar. Lo primero será bajar PuTTY5, uncliente para conexiones ssh en windows. PuTTY tiene una interfaz amigable, enla que sólo tendremos que especificar la IP a la que conectarnos en indicar quepretendemos hacer una conexión ssh :

El aspecto de PuTTY funcionando es similar al de una consola de Unix. Tras un ratotrabajando con PuTTY se nos olvidará que estamos utilizando Windows.

5

Page 10: Ejemplos de Postgre

Capítulo 2. Empezando

En ocasiones será necesario mover archivos de nuestra máquina local a la remotao viceversa. En Windows existe una aplicación que proporciona una interfaz deusuario a scp (secure copy). Esta aplicación de llama WinSCP6 y es también muysencilla de usar, con una configuración muy intuitiva:

Hemos descrito herramientas que nos servirán para conectarnos a la máquina quealoje la base de datos. Esto será útil para administrarla sin estar físicamente junto aella y ayuda a que diferentes personas trabajen sin molestarse (n manos teclean másque 2).

6

Page 11: Ejemplos de Postgre

Capítulo 2. Empezando

Notas1. http://www.postgresql.org

2. Si algo va mal, o tiene necesidades especiales (un directorio diferente del estándar,compilación para otras arquitecturas...) debería ejecutar

[jav@cable213a078 postgresql]$ ./configure --help

y observar la salida.

3. Las IPs que aparecen en los ejemplos son inventadas (obviamente).

4. http://www.openssh.com/

5. http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html

6. http://winscp.vse.cz/eng/download.php

7

Page 12: Ejemplos de Postgre

Capítulo 2. Empezando

8

Page 13: Ejemplos de Postgre

Capítulo 3. Describiendo el problema

Enunciado del problemaSe desea implementar una base de datos para facilitar la gestión y administraciónde un cementerio, en dicha base de datos se contemplan diferentes categorías labo-rales, distintos tipos de enterramiento, facturas por los servicios prestados, incluso sepermite que una familia posea su propio panteón para un determinado número depersonas.

El cementerio está dividido en sectores, teniendo estos una capacidad y extensiónvariable que ha de quedar reflejada.

Asimismo se ha quiere tener información sobre los empleados mediante datos per-sonales como nombre y apellidos,dirección, telefóno, salario, antigüedad, etc.

Las categorías en las que se dividen los empleados son:

• Enterradores

• Jardineros

• Administrativos

Los jardineros se ocuparán del cuidado de los sectores, de tal forma que un jardineroestá al cuidado de un sector, aunque del cuidado de un sector pueden encargarsevarios jardineros.

Asimismo,cada sector contendrá un determinado número de tumbas.Una tumbapertenece a un sector.

Las Tumbas pueden ser de uno de los siguientes tipos:

• Nicho

• Panteón

• Fosa Común

Es necesario, además, almacenar información sobre el fallecido, así como de la per-sona (familiar) que se hará cargo de los costes del servicio (todo ello, obviamenteidentificado mediante los datos personales y de interés para la empresa).

• Cada fallecido es enterrado por un único enterrador,lógicamente el enterradorpuede enterrar a mas de un fallecido durante su jornada laboral.

• Los nichos tienen capacidad para una sola persona.

• Sin embargo un panteón tiene capacidad para varias personas siendo lo normal 4,siendo por eso de tipo smallint.

• La capacidad de una Fosa Común es superior a la de un panteón, y es de tipo inte-ger. En este caso y en los dos anteriores asumimos la indivisibilidad del fallecido.

Además, los administrativos emiten facturas para los familiares, de tal forma que unadministrativo puede emitir facturas a varios familiares, y un familiar puede recibirvarias facturas

El único tipo de tumba que puede ser propiedad de un familiar es el panteón, siendopropiedad de una única persona, y dicha persona puede poseer varios panteones.

9

Page 14: Ejemplos de Postgre

Capítulo 3. Describiendo el problema

Construyendo el diagrama E-RPara realizar el diagrama de entidad-relación hemos de decidir los conjuntos tanto deentidades como de relaciones, atendiendo al enunciado del problema, la estructuradel diagrama ha quedado como sigue:

• Entidades:

1. Empleado (que constará a su vez de tres tipos: Jardinero, Enterrador y Ad-ministrativo).

2. Sector (en los que está dividido el cementerio).

3. Tumba (puede ser de tres tipos: Nicho, Panteón y Fosa Común).

4. Fallecido (Representa a la persona muerta mediante los atributos detalladosmas tarde).

5. Familiar (Es necesario enviar la factura a los familiares del fallecido).

• Relaciones:

1. JarSec ( Indica la relación de los jardineros con los sectores del cementerio)

2. TumSec (Relación que se da entre las tumbas y los sectores en que están ubi-cadas)

3. EnFa (Es la relación que se establece entre los enterradores y los fallecidos).

4. Factura (Representa la venta de una tumba a la familia del fallecido).

5. NiFa (Indica si el fallecido tiene asignado un Nicho).

6. FoFa (Indica si el fallecido se encuentra en una Fosa Común).

7. PanFa (Indica si el fallecido se encuentra en un Panteón).

8. FamFa (Es la relación establecida entre el fallecido y su familia).

9. PaFam (Relación que indica la posesión de un panteón por parte de una fa-milia).

A continuación hablaremos de los pormenores tanto de las entidades como de lasrelaciones, especificando atributos, tipos de relaciones, cardinalidades y todo aquelloque sea interesante destacar.

Comenzamos pues por los atributos propios de cada entidad:

La entidad Familiar tiene 5 atributos:

• Nombre: Nombre del familiar al que se envía la factura.

• Apellidos: Contiene los apellidos del familiar.

• Telefono: Teléfono de contacto del familiar.

• Direccion: Almacena la dirección (calle, numero, piso, etc).

• ID_Familia: Código identificador de un familiar, es la clave primaria de esta tabla.

La entidad Enterrador tiene 8 atributos:

• Nombre: Representará el nombre del empleado.

• Apellidos: Contienen los apellidos del empleado.

• Dirección: Almacena la dirección (calle, numero, piso, etc).

• Teléfono: Número de teléfono de contacto.

• Telef_Movil: Número de teléfono móvil.10

Page 15: Ejemplos de Postgre

Capítulo 3. Describiendo el problema

• Antigüedad: Años de servicio en la empresa.

• Salario: Sueldo en Euros .

• DNI: Contiene el número del DNI, es la clave primaria de esta entidad.

La entidad Administrativo tiene 8 atributos:

• Nombre: Representará el nombre del empleado.

• Apellidos: Contienen los apellidos del empleado.

• Dirección: Almacena la dirección (calle, numero, piso, etc).

• Teléfono: Número de teléfono de contacto.

• Telef_Movil: Número de teléfono móvil.

• Antigüedad: Años de servicio en la empresa.

• Salario: Sueldo en Euros .

• DNI: Contiene el número del DNI, es la clave primaria de esta entidad.

La entidad Sector tiene 4 atributos:

• Nombre: Nombre de cada sector o zona del cementerio.

• ID_Sector: Código identificador de zona

• Superficie: Extensión en m2

• Capacidad: Número de fallecidos que puede alojar.

La entidad Jardinero tiene 9 atributos:

• Nombre: Representará el nombre del empleado.

• Apellidos: Contienen los apellidos del empleado.

• Dirección: Almacena la dirección (calle, numero, piso, etc).

• Teléfono: Número de teléfono de contacto.

• Antigüedad: Años de servicio en la empresa.

• Salario: Sueldo en Euros

• Sector: El sector del cementerio donde trabaja. Clave ajena tomada de Sector.

• DNI: Contiene el número del DNI, es la clave primaria de esta entidad.

La entidad Tumba tiene 4 atributos:

• ID_Tumba: Código identificadore de tumba.

• Tipo: Puede ser de tres tipos: Nicho, Panteón o Fosa Común.

• Sector: Sector en que se encuentra la tumba. Clave ajena tomada de Sector.

La entidad Nicho tiene 3 atributos:

• Altura: Altura del nicho

• ID_Nicho: Código identificador de nicho. Clave primaria y Clave Ajena tomadade Tumba (ID_Tumba).

• Inscripcion: Texto que figura en el.

La entidad FosaComun tiene 3 atributos:

• ID_Fosa: Código identificador de Fosa Común. Clave primaria y Clave Ajenatomada de Tumba (ID_Tumba).

11

Page 16: Ejemplos de Postgre

Capítulo 3. Describiendo el problema

• Capacidad: Número de fallecidos que puede contener.

La entidad Panteon tiene 4 atributos:

• ID_Panteon: Código identificador de panteon. Clave primaria y Clave Ajenatomada de Tumba (ID_Tumba).

• ID_Familia: Código identificador de familia Clave ajena tomada de Familiar(ID_Familia).

• Inscripcion: Texto que figura en el.

• Capacidad: Número de fallecidos que puede contener.

La entidad Factura tiene 5 atributos:

• Cantidad: Total a pagar por la familia.

• Fecha: Fecha en que se emite la factura.

• Clave_Factura: Clave primaria (Fecha,ID_Familia,ID_Admin).

• ID_Familia: Código identificador de familia. Clave ajena tomada de Familiar.

• ID_Admin:Código identificador de Administrativo. Clave ajena tomada de Ad-ministrativo (DNI).

La entidad Fallecido tiene 7 atributos:

• Nombre: Representará el nombre del fallecido.

• Apellidos: Contienen los apellidos del fallecido.

• FechaNacimiento: Almacena la fecha de nacimiento del fallecido.

• FechaMuerte: Almacena la fecha de la muerte del fallecido.

• Enterrador: Código q identifica al enterrador encargado del entierro. Clave Ajenatomada de Enterrador (DNI).

• ID_Familia: Código q identifica a la familia del fallecido. Clave Ajena tomada deFamiliar (ID_Familia).

• Tumba: Código q identifica la tumba del fallecido. Clave Ajena tomada de Tumba(ID_Tumba).

Para la realización del esquema Entidad-Relación, hemos utilizado una herramientapara el diseño de diagramas muy conocida por los usuarios de Linux como es Dia ,se puede descargar en su versión para Windows 95/98/NT/ME/XP... de este web1

El único inconveniente que hemos observado, es la notación que utiliza para la rep-resentación de los atributos, enmarcándolos en una elipse.Debido a esto, decidimosrepresentar en el diagrama sólo los atributos que son clave primaria (para consultardetalles sobre atributos, ver lista anterior)

12

Page 17: Ejemplos de Postgre

Capítulo 3. Describiendo el problema

Por lo que se refiere a la especialización de la entidad Empleado, podemos decir queconsta de tres tipos: Jardinero, Enterrador y Administrativo. En cuanto a la ligadura,diremos que se trata de conjuntos de entidades disjuntos cuya ligadura de completi-tud es de tipo total, posee además un atributo llamado Tipo que identifica cada unade las tres categorías.

La entidad Tumba también posee una especialización en la que se diferencian trestipos de subclases, a saber: Nicho, Panteón y Fosa Común, se trata de entidades dis-juntas cuya participación es total, al pasarlo a tablas aparecerá un atributo en la tablaTumba q identificará el tipo de Tumba de q se trata.

Construyendo las tablasUna vez obtenido el esquema relacional es sencillo pasarlo a tablas. Nos ayudaresmode PgAccess , una aplicación gráfica que permite gestionar Postgres de un modo sen-cillo. Más adelante comentaremos un poco PgAccess

En la figura no indicamos campos no nulos ni las claves primarias. De cualquiermodo, el resultado es lo bastante claro como para hacernos una idea de la estructuraque tendrá la bbdd.

13

Page 18: Ejemplos de Postgre

Capítulo 3. Describiendo el problema

14

Page 19: Ejemplos de Postgre

Capítulo 3. Describiendo el problema

15

Page 20: Ejemplos de Postgre

Capítulo 3. Describiendo el problema

Una vez conseguido este esquema pasamos a plasmarlo a comandos SQL. El resul-tado se puede observar en este fichero2.

Consultando nuestra Base de DatosEn esta sección mostraremos la manera de realizar consultas en la base de datos ce-menterio mediante unos ejemplos, tomados bien como capturas de Putty para ilus-trar la posibilidad de administración remota, bien como salida de pantalla .

Como primer ejemplo pondremos una captura directamente de Putty de una con-sulta que muestra todos los campos de la tabla Familiar.

A continuación mostramos otra captura tomada también de Putty en la que se rela-cionan nombres y apellidos de Familiares y Fallecidos, como puede observarse, esuna consulta que afecta a dos tablas relacionadas por el campo ID_Familia.

Un ejemplo de lo laborioso que puede resultar hacer una consulta para conocer elDni del enterrador que se ocupó de un fallecido llamado Restituto

cementerio=# select Fallecido.Nombre, Fallecido.Apellidos, Enterrador.Dni

cementerio-# From Fallecido INNER JOIN Enterrador

cementerio-# ON Fallecido.Enterrador = Enterrador.Dni

cementerio-# WHERE Fallecido.Nombre = ’Restituto’;

nombre | apellidos | dni

-----------+----------------+----------

Restituto | Gracia de Dios | 10657493

(1 row)

Ejemplo que muestra la salida de una consulta para listar el nombre de aquellos en-terradores cuyo sueldo sea superior a 1600 Euros

cementerio=# select Nombre, Apellidos, Salario

cementerio-# FROM Enterrador

16

Page 21: Ejemplos de Postgre

Capítulo 3. Describiendo el problema

cementerio-# WHERE Salario > 1600;

nombre | apellidos | salario

---------+-------------------+---------

Marc | Pérez | 1800.00

Gonzalo | González González | 1900.00

Luis | Anté Bajo | 1750.00

Frutos | Rojo del Bosque | 1869.25

(4 rows)

Veamos ahora el uso de Alias para las columnas, mientras que en SQL es sufiente conponerlo a continuacion del campo o con comilla doble, en PostgreSQL es necesarioutilizar as de la siguiente manera:

cementerio=# SELECT Nombre as "Nombre de Pila", Apellidos,Dni as "Código In-dentificador"

cementerio-# FROM Enterrador;

Nombre de Pila | apellidos | Código Indentificador

----------------+-------------------+-----------------------

Juán Felipe | García Sierra | 71659874

Marc | Pérez | 71545545

Jacinto | Rodríguez López | 10657493

Gonzalo | González González | 71234321

Luis | Anté Bajo | 9632236

Frutos | Rojo del Bosque | 10653298

(6 rows)

Consideraciones finalesEn este apartado, trataremos temas como la semántica no reflejada en el diseño, loscontroles que se realizan mediante la aplicación de acceso a la base de datos así comotodos aquellos aspectos y consideraciones que no tienen cabida en otros apartados.

Observaciones

Como puede apreciarse en el esquema, los fallecidos están relacionados tanto conNicho como con Panteón y Fosa Común, esto nos obligó a crear la tabla Tumba conun campo llamado Tipo que indicará si la tumba en cuestión es Nicho, Panteón oFosa Común. Este campo resulta muy útil para realizar consultas que necesiten saberel tipo de enterramiento.

No hemos considerado la posibilidad de que una familia pueda ser la propietaria delnicho de su familiar fallecido, dejando esta relación sólo para los panteones. Obvia-mente no ha sido por comodidad, pues el trabajo añadido sería ínfimo, sino que lo

17

Page 22: Ejemplos de Postgre

Capítulo 3. Describiendo el problema

que nos interesaba era conseguir la mayor variedad posible dentro de unos límitesrazonables.

Además de lo anterior, decidimos que el entierro en fosa común no generase unafactura, siendo este un servicio gratuito.

Aunque quizá fuera más propio decir esto en el apartado de conclusiones finales ya pesar de que se ha mencionado en varias ocasiones,hemos de hacer hincapié en laforma de trabajo conjunta entre las dos máquinas, una con Linux RedHat 8.0 (dondeestá alojada la base de datos y el resto del material del trabajo) y otra con Windows98 desde donde se pueden realizar las tareas necesarias para administrar la base dedatos y trabajar en la documentación (haciendo algún que otro malabarismo).

Semántica no reflejada

Como puede apreciarse viendo tanto el modelo de Entidad-Relación como el dia-grama de tablas, pueden darse casos un tanto extraños como que a dos fallecidos seles asigne el mismo nicho. También se puede exceder la capacidad tanto de Panteonescomo de Fosas Comunes, no obstante estos problemas son controlados mediante soft-ware por la aplicación en Python pycemen, así nos aseguramos de que un nicho sólopueda estar ocupado por un fallecido, que un panteón pueda contener como máximoa 6 (pueden ser menos) personas así como que una fosa común albergue un máximode 200 personas (pueden ser menos).

Asímismo se observa que los fallecidos pueden pasar indistintamente a un Nicho,Fosa Común o Panteón, sin que aparentemente haya una razón para decidir mas alláde las económicas o de cualquier otro tipo.

Notas1. http://dia-installer.sourceforge.net/

2. ../others/cemen_check.sql.html

18

Page 23: Ejemplos de Postgre

Capítulo 4. Pgaccess : La herramienta gráfica de PostgreSQL

Introducción a Pgaccess

Hasta ahora, hemos realizado toda la configuración de Postgres mediante órdenesen una línea de comandos. Esto suele intimidar a algunos usuarios (los no acostum-brados a sistemas Unix). Para ellos se desarrolló una potente herramienta, llamadapgaccess . Está programado utilizando las librerías tcl/tk por lo que puede correren cualquier plataforma a la que haya sido portado tcl/tk (Windows, Unix, Mac...).Pgaccess es libre como todo el software que estamos utilizando. Si quiere más infor-mación puede consultar su página en pgaccess.org1.

Un detalle importante para utilizar pgaccess es que a la hora de poner en marcha elservidor Postgres hemos de habilitar conexiones a dicho servidor por TCP/IP, ya quepgaccess utiliza este tipo de conexión. El modo de hacer esto es añadir el parámetro-i al iniciar el servidor.

Pgaccess permite hacer casi de todo. Desde crear tablas y modificarlas hasta realizaresquemas de la bbdd. Nosotros sólo veremos una pequeña muestra de su potencia.Incluso incluye un diseñador visual para realizar consultas, uno de formularios yotro de informes.

Aquí está la pantalla que muestra las tablas presentes en nuestra bbdd cementerio:

19

Page 24: Ejemplos de Postgre

Capítulo 4. Pgaccess : La herramienta gráfica de PostgreSQL

Utilizando Pgaccess

Veamos ahora de lo que es capaz pgaccess . Vamos a realizar una sencilla consultapara averiguar qué enterradores han enterrado a qué muertos. Según nuestro es-quema, esto implica una consulta sobre dos tablas, la de fallecidos y la de muertos.Arrancamos el generador visual de consultas y arrastramos los campos que necesita-mos al formulario:

20

Page 25: Ejemplos de Postgre

Capítulo 4. Pgaccess : La herramienta gráfica de PostgreSQL

Una vez configurada nuestra consulta, podemos ver la sentencia SQL resultante oejecutarla directamente. Los resultados se presentan del siguiente modo:

21

Page 26: Ejemplos de Postgre

Capítulo 4. Pgaccess : La herramienta gráfica de PostgreSQL

Esta era una consulta sencilla. Supongamos ahora que algún familiar visita el ce-menterio. Querrá saber dónde está enterrado su pariente. Realizaremos ahora unavista ya que esta parece una situación habitual. Éste será el esquema que diseñemospara implementar esta consulta:

22

Page 27: Ejemplos de Postgre

Capítulo 4. Pgaccess : La herramienta gráfica de PostgreSQL

El código SQL resultante de esta consulta sería:

select t0."nombre", t0."apellidos", t1."nombre", t1."apellidos",t2."id_tumba", t2."tipo", t3."nombre"from "fallecido" t0,"familiar" t1,"tumba" t2,"sector" t3where (t2."id_tumba"=t0."tumba") and (t3."id_sector"=t2."sector") and(t1."id_familia"=t0."id_familia")

Los resultados de esta consulta serán:

23

Page 28: Ejemplos de Postgre

Capítulo 4. Pgaccess : La herramienta gráfica de PostgreSQL

Esto es sólo una pequeña muestra de lo que pgaccess puede hacer. No comentare-mos aquí el editor de formularios, el de "Reportes" (más bien informes), el de gráficasetc.

Notas1. http://www.pgaccess.org

24

Page 29: Ejemplos de Postgre

Capítulo 5. Accediendo mediante software: Pycemen

¿Por qué Python?Python 1 es un lenguaje interpretado, orientado a objetos de propósito general. Pythonpermite mantener de forma sencilla interacción con el sistema operativo, y resultamuy adecuado para manipular archivos de texto. Está disponible en MS-Windows,GNU/Linux, Mac y cualquier entorno *IX.

Python es un lenguaje de scripts, sencillo pero potente. Hablamos de scriptspero...¿qué es un script? Un script es un conjunto de instrucciones que se ejecutanpaso a paso, instrucción a instrucción. Esto significa que Python no generaejecutables, si no que es Python el encargado de ejecutar nuestro código. Es portanto un lenguaje interpretado, no compilado. Esto le dota de ventajas, pero tambiénde algunos inconvenientes:

Ventajas

• Desarrollo más rápido : Puedes escribir un programa, salvarlo y ejecutarlo. En unlenguaje compilado tienes que pasar por los pasos de compilar y ligar el software,lo cual puede ser un proceso lento.

• Multiplataforma : El mismo código funciona en cualquier arquitectura, la únicacondición es que disponga del intérprete del lenguaje. No es necesario compilar elcódigo una vez para cada arquitectura.

Inconvenientes

• Lentitud : Los programas interpretados son más lentos que los compilados. Sinembargo los programas interpretados suelen ser cortos, en los que la diferencia esinapreciable.

Si desea saber más sobre Python puede consultar Introducción a Python2

Comentando el programa

Funcionalidades de Pycemen

Lo primero, puede verse el código del programa en este link3.

La única funcionalidad de Pycemen es añadir datos a la bbdd. Lo que no es poco.Por ejemplo. Algo sencillo como la adición de un panteón a la base de datos. El pro-grama averigua un código ID_Tumba válido. ¿Cómo? Realizando una consulta a labbdd, interpretando los resultados y calculando un número que sirva (en este casono es más que sumarle 1 al último ID_Tumba que exista). Una vez tengamos nuestroID_Tumba, es necesario saber en qué sector va a ser emplazado. Para ello se realiza

25

Page 30: Ejemplos de Postgre

Capítulo 5. Accediendo mediante software: Pycemen

una consulta en la tabla de sectores y se muestran por pantalla dejando al usuarioque decida uno válido. Además es necesario conocer a qué familiar se le va a asociardicho panteón. Y muchos detalles más.

Otro detalle importante es que Pycemen no sólo añade datos en la bbdd, sino quetambién guarda todas las sentecias SQL de adición de datos que ejecuta. Esto eraespecialmente importante para nosotros, ya que al ser poco expertos tanto en Post-greSQL como en SQL en ocasiones cometíamos errores que no sabíamos corregir.Como guardábamos un log con todas las sentencias introducidas, nunca tuvimos quelamentar pérdidas de datos (que aunque ficticios, importantes por lo aburrido queresulta añadirlos). Como ejemplo más claro de esto mostramos el siguiente4 ficherogenerado enteramente por Pycemen.

Pycemen en acción

Vamos a echar un vistazo al funcionamiento al programa. Aunque la versión finalpuede cambiar (al menos la interfaz) las rutinas que subyacen ya están programadasy funcionan bastante bien (o eso creemos).

Veamos cómo es el proceso de añadir un nuevo nicho a nuestra bbdd. Lo primero esacceder al menú de adición de datos, tras lo cual seleccionamos la opción de añadiruna nueva tumba.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

1.- Añadir Enterradores2.- Añadir Administrativos

3.- Añadir Jardineros4.- Añadir Tumbas

5.- Añadir Sectores6.- Añadir Familiar7.- Añadir Facturas

8.- Añadir Fallecidos

0.- Salir

Seleccione una opción >>> 4

Al seleccionar añadir tumba, el programa calcula un nuevo ID_Tumba que sea co-herente con los ya presentes anteriormente y lo muestra en pantalla. A continuaciónaverigua los sectores del cementerio y nos pide que seleccionemos aquel en el que vaa ser emplazado el nuevo nicho:

ID_Tumba ---> 351 Patio de la redención2 Olvidados del Señor3 Patio de San Froilán4 Patio Real5 La Asunción6 Los Inocentes7 Patio de San Isidoro8 San Judas Tadeo9 Virgen del Camino10 El Expolio11 La CrucifixiónSector ---> 8

26

Page 31: Ejemplos de Postgre

Capítulo 5. Accediendo mediante software: Pycemen

Ahora se nos preguntará el tipo de tumba que queremos añadir (nicho, pateón o fosacomún, nicho en este caso), la inscripción visible en el nicho y la altura de éste.

Tipo ---> NichoInscripción ---> Eternamente VivoAltura ---> 3Presione INTRO para continuar

Y ya hemos añadido el nicho. Si observamos el fichero de log donde guardamos todaslas sentencias SQL de adición de datos, podemos ver:

insert into Tumba Values (35, ’Nicho’ ,8);insert into Nicho Values (3,35,’Eternamente Vivo’);

Y haciendo una consulta a la bbdd:

cementerio=# select id_nicho, altura, inscripcioncementerio-# from nichocementerio-# order by id_nicho;

id_nicho | altura | inscripcion----------+--------+------------------

1 | 1 |4 | 2 | Salud

27 | 3 | Adiós Camaradas30 | 2 | er32 | 2 |34 | 2 |35 | 3 | Eternamente Vivo

(7 rows)

Este es uno de los ejemplo más sencillos. Se pueden dar situaciones más complicadascomo la adición de un fallecido que vaya a ser enterrado en un nicho. En este caso ten-dremos que cumplimentar además una factura entre otros detalles. Sería algo comoesto:

Añadiendo FallecidoNombre ---> MarcosApellidos ---> Robles de la HuertaFecha Nacimiento ---> 4/5/56Fecha Defunción ---> 9/9/02DNI ---> 9888888Seleccione Identificador de Enterrador715451632 Sergio Diez García - Olalla9248635 Luis Fernández Pérez71659874 Juan Felipe Garcia Sierra71632587 Raúl Gómez de la Huerta71585696 Óscar González Prado9875651 Pedro Márquez Ruiz09823456 Segundo Toro de la TardeEnterrador ---> 715451632Tipo de Tumba ---> nicho

Hasta aquí todo sencillo. Tan sólo una sencilla consulta para ver los enterradores quetenemos en nómina. Ahora y dado que el fallecido irá a parar a un nicho, hemos decumplimentar los datos de los familiares. Pude darse el caso de que el familiar quepague la factura sea diferente al que aparezca ligado al fallecido(por ejemplo, en casode accidente de tráfico, en la factura aparecerá la compañía de seguros). Puede serque el familiar ya esté en nuestra bbdd o puede ser que no. El programa presenta losposibles familiares y pregunta si se desea añadir una nueva entrada en la tabla defamiliares:

Seleccione Identificador de Familia3 Rubén Blanco Gómez5 Pipo Calceda

27

Page 32: Ejemplos de Postgre

Capítulo 5. Accediendo mediante software: Pycemen

1 Josu Cordera Láez4 María de los Dolores Fuertes de Cabeza2 Nuria González¿Desea añadir nueva familia? (S/N) nFamilia ---> 5

Ahora es el momento de cumplimentar la factura. Se observa el caso que comentamosanteriormente, que en los datos de la factura aparezca un familiar diferente:

Añadiendo FacturaCantidad ---> 2000.99Fecha ---> 9/9/02Seleccione Identificador familiar3 Rubén Blanco Gómez5 Pipo Calceda1 Josu Cordera Láez4 María de los Dolores Fuertes de Cabeza2 Nuria González¿Desea añadir nueva familia? (S/N) nFamilia ---> 5Seleccione Identificador de Administrativo9444555 Javier Alto del Cerro71654321 Joselito de Pequeños Ruiseñores9636525 Ángeles de todos los Santos Ruiz71440439 Lucas Feo Gutierrez71569874 Juaz González MárquezAdministrativo ---> 9636525Presione INTRO para continuar

Ahora que ya hemos cumplimentado e introducido la factura, es hora de elegir unnicho para el difunto. Para ello el programa selecciona de los nichos existentes, losque están libres:

Nicho 27 libre. Inscripción: Adiós CamaradasNicho 32 libre. Inscripción: NingunaNicho 34 libre. Inscripción: NingunaNicho 35 libre. Inscripción: Eternamente VivoNicho ---> 34Presione INTRO para continuar

Fácil, ¿no?

¿Por qué una interfaz basada en texto?

Se nos ocurren diversas respuestas a esta pregunta, pero sólo comentaremos las dosmás importantes:

• Sólo permitimos accesos locales a la bbdd (precisamente por esto hemos venidousando OpenSSH, para permitir accesos locales desde máquinas remotas. Esta de-cisión responde a diversas razones, principalmente la seguridad (no somos expertosen PostgreSQL como para permitir a cualquiera el acceso a la bbdd). Bien, ya quetodo lo que hagamos se ejecutar en la máquina remota, pensemos que ocurriría situviésemos un programa que se ejecutase gráficamente. Nosotros en la máquina re-mota tendríamos que recibir toda la información gráfica de la aplicación (ventanas,botones, imágenes...) a través de la red. Esto es factible y perfectamente posible enredes LAN con velocidades de 10 Mbps. 5 . Sin embargo a través de una WAN (in-ternet), siendo la velocidad de subida de la máquina que ejecuta el programa de128Kbps esto no es posible.

• Velocidad de desarrollo: Hemos preferido añadir funcionalidades a la aplicaciónque diseñar una interfaz gráfica de usuario (que al fin y al cabo nadie iba a usar).Esta decisión nos ha permitido utilizar el programa aún en fase muy primitiva de

28

Page 33: Ejemplos de Postgre

Capítulo 5. Accediendo mediante software: Pycemen

desarrollo para añadir datos a la bbdd. Siempre es más cómodo que las sentenciasSQL.

Notas1. http://www.python.org

2. http://users.servicios.retecal.es/tjavier/python/intpython/index.html

3. ../others/cemen.py.html

4. ../others/pycem.dat.html

5. Una muestra se puede ver en

6. http://bulmalug.net/body.phtml?nIdNoticia=1588.

6. http://bulmalug.net/body.phtml?nIdNoticia=1588

29

Page 34: Ejemplos de Postgre

Capítulo 5. Accediendo mediante software: Pycemen

30

Page 35: Ejemplos de Postgre

Capítulo 6. Conclusiones finales

Después de haber trabajado algo más de un mes con PostgreSQL nos damos cuentade que es una herramienta mucho más potente y completa de lo que se pudiera pen-sar en un principio. Hemos empezado de cero, sin apenas haber oido hablar de estegestor (la publicidad la tienen Oracle y MySQL). Rápidamente buscamos en su webinstrucciones de cómo instalarlo. Al poco nos dimos cuenta que en los cds de casicualquier distribución de Linux venía incluido.

Una vez instalado, empezamos a trabajar con él. Entonces nos surgió el problemade que una base de datos no es algo tan portable como el código fuente de un pro-grama o un documento, no podíamos meterlo en un disquete o zipearla y enviarlapara ver los progresos se cada uno. Teníamos que encontrar el modo de trabajar con-currentemente sobre una base de datos (que al fin y al cabo es uno de los objetivo delos gestores de bases de datos). En tonces se nos ocurrió utlizar conexiones mediantessh. Así podíamos trabajar sobre la misma base de datos alojada en el ordenador deuno de nosotros.

Una vez resueltas con éxito estas cuestiones, empezamos a trabajar en el problemaque nos habíamos propuesto. Tras realizar el diagrama Entidad-Realación y pasarloa tablas, comenzamos a codificarlo en SQL. Aquí se nos presentó otro problema.Aún no sabíamos nada de SQL (sólo habíamos creado bbdd con asistentes visualesde MS-SQLSever™). Entonces con paciencia, manuales y tirando de google hicimosun pequeño boceto. Especialmente traumático fue comprender el uso de los CON-STRAINS para las claves ajenas 1 . Una vez comprendimos esto, hicimos un primerboceto en SQL de nuestra bbdd, que ya incluía tipos de datos y claves primarias yajenas. Esto nos daría pie a poder empezar a desarrollar el programa que accedieraella.

Tras añadir muuuuchos datos (siempre a través de sentencias SQL) empezamos el de-sarrollo del programa. Elegimos el lenguaje de programación Python, por conocerlopreviamente y por lo que necesitábamos en este momento: velocidad de desarrolloy una gran interconectividad con Postgres 2 . El programa avanzaba rápidamente.Decidimos que su única funcionalidad sería la de añadir datos. Que no era una tareasencilla, debido sobre todo al gran número de relaciones entre las tablas. Por no mul-tiplicar líneas de código, decidimos no realizar demasiadas comprobaciones de erroren los datos introducidos. Ya se encargaría de protestar Postgres.

A medida que avazábamos nuestros conocimientos en SQL crecían. Realizábamosconsultas complejas y empezamos a mejorar el diseño inicial de la bbdd. Afinamosun poco los tipos de datos obtenidos e introdujimos CHECK en muchos atributos yotros detalles. Luego descubrimos que pgaccess podría habernos ahorrado el trabajode aprender tanto SQL pero siempre es más importante conocer lo que hay que hacer,que dejar a una aplicación que lo haga (sobre todo si no sabemos exactamente lo queesta aplicación hace). Sin embargo hubiera estado bien haber prestado más atencióna pgaccess al principio.

¿Qué hemos aprendido? Pues entre otras muchas cosas hemos aprendido a:

• Instalar y configurar un servidor PostgreSQL en un entorno Linux

• Preparar una máquina Linux para permitir accesos remotos de modo seguro

• Programar una aplicación que se conecta y utiliza una base de datos

• Un montón de SQL

• Utilizar una aplicación gráfica como pgaccess para manipular una bbdd

• Escribir y compilar documentacion en DocBook/SGML

No queremos olvidarnos de comentar un último detalle muy importante. Todas lasaplicaciones que hemos utilizado son software libre (puedes redistribuirlo y modifi-carlo según sus respectivas licencias) y está disponible de manera gratuita. El coste

31

Page 36: Ejemplos de Postgre

Capítulo 6. Conclusiones finales

por software del problema que hemos descrito e implementado asciende a 0 euros.Eso sí, la mano de obra ha de estar bien remunerada :-)

Notas1. Es increíble la cantidad de nombres que se les da a las claves ajenas: ajenas, extra-

jeras, foráneas, externas, exteriores...

2. No sólo de Python vive Postgres evidentemente. Existen módulos de conexión aPostgres para C, Java, Perl, Pascal y un largo etcétera.

32

Page 37: Ejemplos de Postgre

Capítulo 7. ¿Por dónde sigo?

Toda la documentación que hemos utilizado se encuentra en la web. Existen ademáslibros editados de PostgreSQL pero no hemos tenido tiempo de consultarlos (no es-tán en ninguna biblioteca ni librería, una pena). De todos modos, agradecemos a lagente de TLDP-ES/LuCAS1 la recopilación del material referente a Postgres en castel-lano, así como el el Curso de Bases de Datos y PostgreSQL2.

Bibliografía

Notas1. http://lucas.hispalinux.es/Postgresql-es/web/

2. http://lucas.hispalinux.es/Tutoriales/NOTAS-CURSO-BBDD/notas-curso-BD/

1. http://lucas.hispalinux.es/Tutoriales/NOTAS-CURSO-BBDD/notas-curso-BD/

2. http://www.sindominio.net/ayuda/postgresql/tutorial-postgresql-1.html

3. http://lucas.hispalinux.es/Postgresql-es/web/navegable/tutorial/tutorial.html

4. http://www.asptutor.com/sql/

5. http://www.dcc.uchile.cl/~raparede/cc42a/auxSQL/auxSQL.html

6. http://coqui.lce.org/mdejesus/?N=D

7. http://www.commandprompt.com/ppbook/index.lxp

8. http://www.postgresql.org/idocs/index.php?pygresql.html

9. http://www.python.org/doc/current/tut/tut.html

10. http://users.servicios.retecal.es/tjavier/python/intpython/index.html

33

Page 38: Ejemplos de Postgre

Capítulo 7. ¿Por dónde sigo?

34

Page 39: Ejemplos de Postgre

Índice

Apache, 1BSD, 1createdb, 4Formularios, 24Generador Visual de Consultas, 24GPL, 1initdb, 3Interbase, 1intérprete, 25MySQL, 1Oracle, 1pgaccess, 20php, 1PostgreSQL, 1PuTTY, 5Pycemen, 26Python, 25RPM, 3scripts, 25SQL Server, 1ssh, 5Vistas, 24WinSCP, 6

Notas1. #INTRODUCCION

2. #INTRODUCCION

3. #AEN118

4. #AEN641

5. #AEN641

6. #INTRODUCCION

7. #AEN118

8. #INTRODUCCION

9. #AEN686

10. #INTRODUCCION

11. #INTRODUCCION

12. #AEN615

13. #INTRODUCCION

14. #INTRODUCCION

15. #AEN172

16. #AEN720

17. #AEN686

18. #AEN77

19. #AEN686

20. #INTRODUCCION

21. #AEN172

22. #AEN641

23. #AEN172

35

Page 40: Ejemplos de Postgre