Вы находитесь на странице: 1из 22

INTRODUCCIN A LAS BASES DE DATOS 3

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.

EJEMPLO SOBRE BASES DE DATOS RELACIONALES Y ESTABLECIMIENTO DE CRITERIOS

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

Luego nos conectamos a la nueva base de datos creada:


postgres=# \c contacto You are now connected to database "contacto" as user "postgres".

Los atributos de la tabla persona son los siguientes: nombre: Nombre de la persona. Tipo VarChar. direccin: Direccin de la persona. Tipo Varchar.

La clave primaria que se utilizar ser el nombre de la persona:


contacto=# create table persona ( contacto(# nombre varchar(30), contacto(# direccion varchar(30), contacto(# primary key(nombre) contacto(# ); NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "persona_pkey" for table "persona" CREATE TABLE

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

Podemos ver las tablas y sus caractersticas a continuacin:


contacto=# \d List of relations Schema | Name | Type | Owner --------+----------+-------+---------public | persona (2 rows) | table | postgres public | telefono | table | postgres

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

Ahora introducimos valores en la tabla telefono:


contacto=# insert into telefono values ('Casa','(1)5467847','Camilo'); INSERT 0 1 contacto=# insert into telefono values ('Mvil','(310)9167837','Maria'); INSERT 0 1 contacto=# insert into telefono values ('Casa','(4)5787227','Jos'); INSERT 0 1 contacto=# insert into telefono values ('Casa','(1)8873645','Alfredo'); ERROR: DETAIL: insert or update on table "telefono" violates foreign key Key (propietario)=(Alfredo) is not present in table constraint "telefono_propietario_fkey" "persona".

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)

Y el contenido de la tabla telfono es como sigue:


contacto=# select * from telefono; tipo Casa Mvil Casa (3 rows) | numero | propietario | Camilo | Jos ------------+--------------+------------| (1)5467847 | (4)5787227 | (310)9167837 | Maria

Se puede incluso mostrar los contenidos cumplan ciertos criterios:

de las dos tablas que

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

| Lalinde, Medellin | Casa

(3 rows)

Con

instrucciones simples como esta ltima se puede entrever la

gigantesca capacidad de las bases de datos relacionales para cruzar informacin de manera muy simple y sencilla.

CRITERIOS.

a)

Los nombres de los renglones tienen relacin la entidad.

CUMPLE

b)

Si las columnas contienen datos congruentes a los atributos de la

entidad. CUMPLE c) Si cada una de las celdas tiene un solo valor.

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 f) Si no existen dos renglones idnticos.

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

Una vez creada la base de datos, debemos conectar con ella:


postgres=# \c almacen You are now connected to database "almacen" as user "postgres".

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,

almacen=# primary key (empresa)

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

Podemos observar las tablas y sus atributos a continuacin:


almacen=# \d List of relations Schema | public | precios public | productos public | proveedores (4 rows) Name | Type | Owner --------+---------------------+----------+---------| table | table | table | postgres | postgres | postgres

public | productos_clave_seq | sequence | postgres

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

Ahora introducimos datos en la tabla proveedores:


almacen=# insert into proveedores (empresa,efectivo) values ('Tecno-k', true ); INSERT 0 1 almacen=# insert into proveedores (empresa,credito) values ('Patito', true ); INSERT 0 1 almacen=# insert into proveedores (empresa,credito,efectivo) values almacen-# ('Nacio-nal', true, true ); INSERT 0 1

14

Y por ltimo introducimos algunos valores en la tabla de precios:


almacen=# insert into precios values ('Nacio-nal',003,202.25); INSERT 0 1 almacen=# insert into precios values ('Nacio-nal',005,9.76); INSERT 0 1 almacen=# insert into precios values ('Nacio-nal',006,31.52); INSERT 0 1 almacen=# insert into precios values ('Nacio-nal',007,58.41); ERROR: DETAIL: ERROR: DETAIL: 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 Key (clave)=(10) is not present in table "productos". constraint "precios_clave_fkey" almacen=# insert into precios values ('Nacio-nal',010,64.38); constraint "precios_clave_fkey" almacen=# insert into precios values ('Patito',001,30.40); INSERT 0 1 almacen=# insert into precios values ('Patito',002,33.63); INSERT 0 1 almacen=# insert into precios values ('Patito',005,9.78); INSERT 0 1

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

constraint "precios_clave_fkey" DETAIL: Key (clave)=(10) is not present in table "productos".

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

Contenido tabla proveedores:


almacen=# select * from proveedores; empresa Tecno-k Patito | credito | efectivo | | t | t | | t -----------+---------+----------

Nacio-nal | t

16

(3 rows)

Contenido tabla precios:


almacen=# select * from precios; empresa Patito Patito | clave | precio | | 3 | 195.59 5 | 5 | 6 | 1 | 2 | 5 | 9.78 9.76 31.52 30.4 33.63 9.78 3 | 202.25 -----------+-------+--------

Nacio-nal | Nacio-nal | Nacio-nal | Patito Patito Patito (8 rows) | | |

CRITERIOS.

a)

Los nombres de los renglones tienen relacin la entidad.

CUMPLE

b)

Si las columnas contienen datos congruentes a los atributos de la

entidad. CUMPLE c) Si cada una de las celdas tiene un solo valor.

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 f) Si no existen dos renglones idnticos.

CUMPLE

3. Revisar el siguiente ejemplo de Modelo Relacional:


No Empleado 100 Nombre Luisa A. Paterno Lane Departamento Finanzas E-mail ll@alguno.com Telfono 260 6900

Doscientos 300

Clark Julio

Kent Garca

Publicidad Tecnologa

ck@alguno.com jg@alguno.com

900 9089 888 4560 900 4589 567 8709

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

Telfono 260 6900

200 300

Clark Julio

Kent Garca

Publicidad Tecnologa

ck@alguno.com jg@alguno.com

900 9089 888 4560 900 4589 567 8709

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

Telfono 260 6900

200 300 300 300

Clark Julio Julio Julio

Kent Garca Garca Garca

Publicidad Tecnologa Tecnologa Tecnologa

ck@alguno.com jg@alguno.com jg@alguno.com jg@alguno.com

900 9089 888 4560 900 4589 567 8709

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

Telfono 260 6900

2 3 3 5

Clark Julio Julio Julio

Kent Garca Garca Garca

900 9089 888 4560 900 4589 567 8709

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

Вам также может понравиться