Академический Документы
Профессиональный Документы
Культура Документы
CAMILO BERNAL
INTRODUCCIN
La
concepcin para
de
bases
de los
datos
relacionales de
implican
una y
comprensin clara del diseo conceptual inicial que se tenga como referente construir sistemas almacenamiento administracin de la informacin. Algunas de las habilidades bsicas en la construccin de bases de datos relacionales estn relacionadas con el reconocimientos de las diferentes relaciones entre las entidades y la bsqueda de una manera de plasmar estas relaciones en forma de tablas que cumplan con todas las condiciones esenciales que estn obligadas a cumplir. En el siguiente taller se muestran algunos ejemplos de la prctica habitual en la construccin de bases de datos. Se trabajan dos pequeos ejemplos de bases de datos relacionales usando el gestor PostgreSQL sobre la plataforma Linux, adems se analiza el caso de una tabla que hace parte de una base de datos relacional y se busca proponer cambios haciendo algunos supuestos.
Se desarrollarn dos ejemplos completos en PostgreSQL. La mecnica en cualquier distribucin Linux es similar, para este caso se trabajarn en la distribucin Linux Mint V12 con PostgreSQL V9.1.3 Se colocarn las entradas/salidas de consola para ir ilustrando todo el proceso que se ir acompaando de explicaciones.
EJEMPLO 1
Este ejemplo es muy sencillo. Simplemente se trata de una base de datos que consta de dos tablas. Una tabla llamada persona y otra tabla llamada telefono. Empezamos creando la base de datos, que llamaremos contacto:
postgres=# create database contacto; CREATE DATABASE
Los atributos de la tabla persona son los siguientes: nombre: Nombre de la persona. Tipo VarChar. direccin: Direccin de la persona. Tipo Varchar.
Los atributos de la tabla telefono son los siguientes: tipo: Nmero de telfono de que se trata, ejemplo: casa, oficina, mvil,... Tipo: Char. Numero: Nmero telefnico del contacto: Tipo: Varchar. Propietario: Persona a la que pertenece el nmero telefnico. Tipo: VarChar. Para esta tabla existir una llave externa vinculada que vincule propietario con la llave primaria de la tabla persona (es decir, nombre):
contacto=# create table telefono ( contacto(# tipo char(10), contacto(# numero varchar(20), contacto(# propietario varchar(20), contacto(# contacto(# foreign key (propietario) references persona contacto(# ); CREATE TABLE
Y listo. Ya se tiene la primera base de datos ejemplo. Ahora se introducirn agunos valores. Se empezar introduciendo valores a la tabla persona:
contacto=# insert into persona values ('Camilo','Palermo, Bogot'); INSERT 0 1 contacto=# insert into persona values ('Maria','Galerias, Bogot'); INSERT 0 1 contacto=# insert into persona values ('Jos','Lalinde, Medellin'); INSERT 0 1
Ntese que el ltimo registro es rechazado debido a que el Nombre 'Alfredo ' no se encuentra en la tabla persona, con lo cual se puede notar que la base de datos garantiza la integridad referencial.
Para concluir se va a mostrar el contenido de las tablas creadas. Para empezar, el contenido de la tabla persona:
contacto=# select * from persona; nombre | direccion --------+------------------Camilo | Palermo, Bogot Maria Jos | Galerias, Bogot | Lalinde, Medellin
(3 rows)
contacto=# select nombre,direccion,tipo,numero from persona join telefono on (persona.nombre = telefono.propietario); nombre | direccion | tipo | numero
--------+-------------------+------------+-------------Camilo | Palermo, Bogot Maria Jos | Galerias, Bogot | Casa | Mvil | (1)5467847 | (310)9167837 | (4)5787227
(3 rows)
Con
gigantesca capacidad de las bases de datos relacionales para cruzar informacin de manera muy simple y sencilla.
CRITERIOS.
a)
CUMPLE
b)
NO CUMPLE; EN REALIDAD, ES FCIL NOTAR QUE EL ATRIBUTO DIRECCIN DE LA TABLA PERSONA PUEDE DIVIDIRSE EN DOS ATRIBUTOS, UNO LA DIRECCIN PROPIAMENTE DICHA Y OTRO LA CIUDAD DE DOMICILIO. d) repite. CUMPLE e) El orden de los renglones y columnas es poco importante. Si todas las columnas tienen un nombre nico es decir no se
CUMPLE
EJEMPLO 2
Vamos a crear la base de datos de un almacen pequeo que vende partes de equipos informticos. La segunda base de datos la vamos a llamar almacen:
postgres=# Create Database almacen; CREATE DATABASE
El primer ejemplo ser sencillo, de manera que slo crearemos tres tablas, una para listar los productos, otra para listar proveedores y la otra para listar los precios de los productos. La primera tabla se llamar productos y contiene los siguientes atributos: parte: Hace referencia a la parte del equipo informtico. Ser una variable tipo VarChar, con el fin de que nos permita economizar memoria. tipo: Qu tipo de producto se vende, es decir, sus prestaciones. Tipo Varchar. especificacion: La especificacin de funcionamiento del producto. Tipo VarChar. psugerido: El precio sugerido del producto. Tipo Float.
10
clave: Vamos a utilizar este atributo para identificar con un cdigo cada parte. Ser de tipo Serial.
Adcional a esto debemos definir una llave primaria. En este caso vamos a elegir clave como la clave primaria que necesitamos para la tabla de productos.
almacen=# create table productos ( almacen=# parte varchar(20), almacen=# tipo varchar(20), almacen=# especificacin varchar(20), almacen=# psugerido float(6), almacen=# clave serial, almacen=# primary key(clave) almacen=# ); NOTICE: NOTICE: CREATE TABLE will create implicit sequence CREATE TABLE / PRIMARY KEY will create implicit index "productos_clave_seq" for serial column "productos.clave" "productos_pkey" for table "productos" CREATE TABLE
La segunda tabla se llama proveedores y es una lista de los proveedores para el almacen. Tiene los siguientes atributos: empresa: Nombre de la empresa que provee. Tipo Varchar. Credito: Indica si esta empresa nos vende a crdito. Tipo: Bool. Efectivo: Indica si esta empresa nos vende y pagamos con efectivo. Tipo: Bool. La clave primaria para la lista de proveedores ser el atributo empresa. Introducimos las instrucciones para crear la tabla con estas caractersticas:
11
almacen=# create table proveedores ( almacen=# empresa almacen=# credito almacen=# efectivo almacen=# ); NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "proveedores_pkey" for table "proveedores" CREATE TABLE varchar(20) not null, bool, bool,
La tercera tabla ser la lista de precios y la vamos a llamar precios. Esta tabla tiene los siguientes atributos: empresa: Nombre de la empresa que ser el cliente final de nuestro producto. Tipo VarChar NotNull, porque necesitamos tener un proveedor para el producto. En este caso ser la primera llave externa que se vincular con la tabla proveedores, concretamente con la clave primaria de sta tabla, que es el atributo empresa. clave: Ser la llave externa que nos permita conocer la conocer la clave del producto cuyo precio se pretende mostrar. Estar vinculada con la llave primaria de la tabla productos. precio: El precio del producto en cuestin. Tipo Float.
Entonces en este caso tenemos un atributo propio de la tabla que es el precio del producto, y dos llaves externas, una de estas llaves nos permite conocer el nombre de la empresa proveedora y la otra la clave del producto:
almacen=# create table precios ( almacen(# empresa varchar(20) not null,
12
almacen(# clave int not null, almacen(# precio float(6), almacen(# foreign key (empresa) references proveedores, almacen(# foreign key (clave) references productos almacen(# ); CREATE TABLE
Ahora que ya tenemos las tablas creadas, el siguiente paso es introducri algunos valores, aunque realmente no tiene mucha relevancia, pues lo verdaderamente interesante es la creacin de tablas y la definicin de sus relaciones. Slo como complemento del ejemplo vamos a introducir algunos valores en las tablas. Empezamos con la tabla de los productos:
almacen=# insert into productos (parte,tipo,especificacin,psugerido) values almacen-# ('Procesador','2 GHz','32 bits',null); INSERT 0 1 almacen=# insert into productos
13
(parte,tipo,especificacin,psugerido) values almacen-# ('Procesador','2.4 GHz','32 bits',35); INSERT 0 1 almacen=# insert into productos (parte,tipo,especificacin,psugerido) values almacen-# ('Procesador','1.7 GHz','64 bits',205); INSERT 0 1 almacen=# insert into productos (parte,tipo,especificacin,psugerido) values almacen-# ('Procesador','3 GHz','64 bits',560); INSERT 0 1 almacen=# insert into productos (parte,tipo,especificacin,psugerido) values almacen-# ('RAM','128MB','333 MHz',10); INSERT 0 1 almacen=# insert into productos (parte,tipo,especificacin,psugerido) values almacen-# ('RAM','256MB','400 MHz',35); INSERT 0 1
14
Resulta muy interesante que la introduccin de valores en esta ltima tabla da algunos errores. Los errores se muestran a continuacin:
almacen=# insert into precios values ('Nacio-nal',007,58.41); ERROR: DETAIL: ERROR: insert or update on table "precios" violates foreign key Key (clave)=(7) is not present in table "productos". insert or update on table "precios" violates foreign key constraint "precios_clave_fkey" almacen=# insert into precios values ('Nacio-nal',010,64.38);
15
La explicacin simple de esto es que se introdujeron nicamente 6 productos, y la clave es un serial que empieza a contar desde uno, as que no habr existencia de claves de productos mayores a 6. Este error en la introduccin de datos confirma que la definicin de relaciones es correcta. Para dar punto final al primer ejemplo, vamos a pedir que se nos muestre el contenido de las tablas: Contenido tabla productos:
almacen=# select * from productos; parte | tipo | especificacin | psugerido | clave | 32 bits | | | | | | | 35 | 205 | 560 | 10 | 35 | 1 2 3 4 5 6 ------------+---------+----------------+-----------+------Procesador | 2 GHz Procesador | 2.4 GHz | 32 bits Procesador | 1.7 GHz | 64 bits Procesador | 3 GHz RAM RAM (6 rows) | 128MB | 256MB | 64 bits | 333 MHz | 400 MHz
Nacio-nal | t
16
(3 rows)
CRITERIOS.
a)
CUMPLE
b)
17
CUMPLE d) repite. CUMPLE e) El orden de los renglones y columnas es poco importante. Si todas las columnas tienen un nombre nico es decir no se
CUMPLE
Doscientos 300
Clark Julio
Kent Garca
Publicidad Tecnologa
ck@alguno.com jg@alguno.com
4. Contestar con Cul o (cules) de las caractersticas de una relacin NO esta cumpliendo la tabla presentada en el punto anterior? Todos los valores almacenados en una columna son del mismo tipo, es decir, estn definidos sobre el mismo dominio. Cada posicin en la tabla almacena un valor simple, atmico, de un atributo.
18
5. Una vez de identificar con que caractersticas NO cumple el ejemplo, realiza las modificaciones que consideres correspondientes para que este ejemplo SI cumpla con las caractersticas de una relacin. El proceso de correccin de inconvenientes puede ser iterativo. El primer inconveniente a arregla consiste en colocar atributos de un mismo tipo, en este caso para el atributo 'No empleado'. Una vez arreglado puede quedar as:
No Empleado 100
Nombre Luisa
A. Paterno Lane
Departamento Finanzas
E-mail ll@alguno.com
200 300
Clark Julio
Kent Garca
Publicidad Tecnologa
ck@alguno.com jg@alguno.com
Una vez solucionado esto, se procede a arreglar el inconveniente relacionado con la necesidad de atomicidad de los registros, para lo cual se asigna un valor en cada caso para el atributo 'Telfono':
No Empleado 100
Nombre Luisa
A. Paterno Lane
Departamento Finanzas
E-mail ll@alguno.com
19
Cons estas acciones es posible eliminar los problemas encontrados en la tabla para que cumpla con las condiciones de las bases de datos relacionales. Un detalle adicional a tener en cuenta se relacionan con las llaves que usar la tabla. Si la tabla usar llaves externas de otras tablas pues no hay mucho problema. Si la tabla usar su propia llave maestra ser necesario definir algn tipo de cdigo adicional si se quiere dejar la tabla tal como est. Si se quiere usar como llave primaria algn atributo inicial, es posible derivar una segunda tabla de la primera donde se relacione le nmero telefnico con el nombre y apellido, con clave primaria independiente. La propuesta quedara as:
No Empleado 100
Nombre Luisa
A. Paterno Lane
Departamento Finanzas
E-mail ll@alguno.com
200 300
Clark Julio
Kent Garca
Publicidad Tecnologa
ck@alguno.com jg@alguno.com
Registro Telefono 1
Nombre Luisa
A. Paterno Lane
2 3 3 5
Esta propuesta slo tendra sentido en caso de que se quiera usar 'No empleado' como llave primaria, de otro modo se puede ignorar esta ltima propuesta. Una propuesta ms acertada implicara conocer toda la concepcin de la base de datos, pues se ignora si hay ms tablas o no.
20
CONCLUSIN
Las reglas utilizadas para construir bases de datos relacionales tienen como propsito fundamental garantizar la coherencia de la informacin almacenada. Se busca que la informacin realmente se corresponda con los plantemientos conceptuales de diseo de soporte de la informacin ms bsicos. En este caso se pudo comprobar que el gestor PostgreSQL garantiza la integridad referencial de la informacin impidiendo el ingreso de cualquier dato que no cumpla con las reglas internas que permiten relacionar entidades.
21
BIBLIOGRAFA
CAMPS, Rafael y Otros. Software libre: bases de datos. Universitat Oberta de Catalunya . Barcelona, Espaa. Mayo de 2005. SANCHEZ, Jorge. Principios sobre bases de datos relacionales. 2004. Disponible en: www.jorgesanchez.net
RECURSOS ELECTRNICOS
Wikipedia http://es.wikipedia.org/wiki/Wikipedia:Portada
22