Documente Academic
Documente Profesional
Documente Cultură
Introduccin
En este captulo, estudiaremos un ejemplo, para recopilar los conocimientos aprendidos a lo largo del curso. El problema en s es mantener una base de datos de ornitologa (ciencia que estudia las aves). Se desea almacenar la informacin de cada una de las especies del pas. De cada especie se quiere conocer el nombre de la misma, el nombre cientfico, la clase a la que pertenece y el tipo de rbol en el que anida, as como si es un ave migratoria o no. De cada clase de rbol, se desea conocer su nombre, el tipo de hoja, y la regin de la cual es autctono. Por consiguiente, tenemos las siguientes entidades: ave: cod_ave, nombre, nom_cientifico, clase, migratoria, observaciones rbol: cod_arbol, nombre, tipo_hoja regin: cod_region, desc_region
Las relaciones que tenemos son las siguientes: ave-rbol: un ave puede anidar en varios tipos de rboles, y en un rbol pueden anidar varias especies (N-M). rbol-regin: un rbol puede ser autctono de varias regiones, y en una regin puede haber distintas clases de rboles (N-M).
Grupo EIDOS
Con la anterior informacin, podemos obtener el diagrama entidad-relacin que vemos en la Figura 94.
Figura 94
Una vez realizado el diseo conceptual, el siguiente paso es realizar el diseo lgico, cuya primera etapa es el paso a tablas. Cada entidad genera una tabla, con sus atributos, y las relaciones N-M generan tambin tabla, con las claves de ambas entidades como atributos. Con esto, nos queda el esquema lgico que muestra la Figura 95.
Figura 95
El siguiente paso en el diseo es realizar el diseo fsico, ya que en nuestro caso no se aplicarn mtodos de normalizacin o particionamiento. Lo que realizaremos es codificar las instrucciones necesarias en Transact SQL, para obtener el esquema fsico. Destacar que lo que aqu entendemos por diseo fsico, tambin engloba al diseo lgico especfico, al usar un SGBD concreto para la implementacin. Para implementar el esquema en Transact SQL, utilizaremos el Query Analizer de SQL Server.
Una vez creada la base de datos, nos conectamos a ella, seleccionndola de la lista desplegable que aparece en la parte superior derecha del Query Analizer.
196
Grupo EIDOS
A continuacin crearemos las tablas obtenidas en el esquema lgico. Empezaremos por crear la tabla ave.
CREATE TABLE ave ( cod_ave smallint NOT NULL, nombre varchar(30) NOT NULL, nom_cientifico varchar(30), clase varchar(10), migratoria bit) Cdigo fuente 196
En la anterior sentencia cabe destacar que los atributos cod_ave y nombre han sido declarados como no nulos, es decir, no se podr insertar filas que no tengan valores nulos para dichos atributos. Para especificar si un ave es migratoria o no, se utilizar un campo bit, es decir, un 0 para indicar que el ave no es migratoria, y un 1 si lo es. Anlogamente, creamos la tabla arbol.
CREATE TABLE arbol ( cod_arbol smallint NOT NULL, nombre varchar(30) NOT NULL, tipo_hoja varchar(10)) Cdigo fuente 197
Y por ltimo las tablas que las relacionan, que son ave_arbol, y arbol_region:
CREATE TABLE ave_arbol ( cod_ave smallint NOT NULL, cod_arbol smallint NOT NULL) CREATE TABLE arbol_region ( cod_arbol smallint NOT NULL, cod_region smallint NOT NULL) Cdigo fuente 199
Una vez creadas las tablas, el siguiente paso es crear los ndices para ellas. Empezaremos por crear un ndice nico que ser la clave de la tabla ave, al que llamaremos clave, y que utilizar el campo cod_ave.
197
Grupo EIDOS
ALTER TABLE ave ADD CONSTRAINT clave_av PRIMARY KEY (cod_ave) Cdigo fuente 200
Anlogamente hacemos con las dems tablas, donde los ndices de clave nica sern por cod_arbol para la tabla arbol, por cod_regin para la tabla regin, por cod_arbol y cod_region para la tabla.arbol_region, y por cod_ave y cod_arbol para la tabla ave_arbol:
arbol ADD CONSTRAINT clave_ab PRIMARY KEY (cod_arbol) region ADD CONSTRAINT clave_re PRIMARY KEY (cod_region) ave_arbol ADD CONSTRAINT clave_aa PRIMARY KEY (cod_ave,cod_arbol) arbol_region ADD CONSTRAINT clave_ar PRIMARY KEY (cod_arbol,cod_region) Cdigo fuente 201
Oh, !vaya!, nos hemos olvidado de definir un atributo para la tabla ave. Pero eso no es problema, ya que podemos modificar cmodamente el esquema de dicha tabla, mediante la sentencia ALTER, para introducir un nuevo campo.
ALTER TABLE ave ADD observaciones text NULL Cdigo fuente 202
Por ltimo, es labor del administrador el decidir a quien y sobre que objetos otorga qu permisos. Nosotros, de momento, crearemos una vista para consultar todas las aves que son migratorias
CREATE VIEW migratorias AS SELECT nombre FROM ave WHERE migratoria = 1 Cdigo fuente 203
Palmpedo No
198
Grupo EIDOS
3 4
Si Si
INSERT INTO ave (cod_ave, nombre, clase, migratoria, observaciones) VALUES (1, 'Flamenco', 'Zancuda', 1, 'Migran en grupo hacia lugares clidos') INSERT INTO ave (cod_ave, nombre, clase, migratoria) VALUES (2, 'Pato salvaje', 'Palmipedo', 0) INSERT INTO ave (cod_ave, nombre, migratoria, observaciones) VALUES (3, 'Mirlo Blanco', 1, 'Emite un sonido muy peculiar') INSERT INTO ave (cod_ave, nombre, nom_cientifico, migratoria, observaciones) VALUES (4, 'Golondrina', 'Golondrina comn', 1, 'Famosas por los versos de Becquer') Cdigo fuente 204
Tabla rbol Cod_arbol Nombre Tipo_hoja 1 2 3 4 Encina Roble Naranjo Pino Caduca Perenne Caduca Perenne
Tabla 34
INTO arbol (cod_arbol, nombre, (1, 'Encina', 'Caduca') INTO arbol (cod_arbol, nombre, (2, 'Roble', 'Perenne') INTO arbol (cod_arbol, nombre, (3, 'Naranjo', 'Caduca') INTO arbol (cod_arbol, nombre, (4, 'Pino', 'Perenne')
199
Grupo EIDOS
INSERT VALUES INSERT VALUES INSERT VALUES INSERT VALUES INSERT VALUES
INTO region (cod_region, (1, 'Centro') INTO region (cod_region, (2, 'Sur') INTO region (cod_region, (3, 'Nor-noroeste') INTO region (cod_region, (4, 'Pirineos') INTO region (cod_region, (5, 'Levante')
Supongamos ahora que nos dicen que puede haber pinos en las regiones centro, nor-noroeste y Pirineos, naranjos en la regin Levante, encinas en las regiones centro, sur y nor-noroeste y robles en la regin centro. Lo que tenemos que hacer es dar de alta estas filas en la tabla arbol_region, con los valores correspondientes a cada cdigo de arbol y regin.
INSERT VALUES INSERT VALUES INSERT VALUES INSERT VALUES INSERT VALUES INSERT VALUES INSERT VALUES INSERT VALUES
INTO arbol_region (4, 1) INTO arbol_region (4, 3) INTO arbol_region (4, 4) INTO arbol_region (3, 5) INTO arbol_region (1, 1) INTO arbol_region (1, 2) INTO arbol_region (1, 3) INTO arbol_region (2, 1)
(cod_arbol, cod_region) (cod_arbol, cod_region) (cod_arbol, cod_region) (cod_arbol, cod_region) (cod_arbol, cod_region) (cod_arbol, cod_region) (cod_arbol, cod_region) (cod_arbol, cod_region)
200
Grupo EIDOS
Supongamos ahora que nos dicen que el mirlo blanco anida en los naranjos y en los pinos, y que los patos salvajes anidan en los estanques donde preferentemente haya encinas. Lo que hay que hacer es crear las filas correspondientes a cada uno de los cdigos en la tabla ave_arbol.
INTO ave_arbol (cod_ave, cod_arbol) (3, 3) INTO ave_arbol (cod_ave, cod_arbol) (3, 4)
INSERT INTO ave_arbol (cod_ave, cod_arbol) VALUES (2, 1) Cdigo fuente 208
Puesto que de momento no hemos encontrado ningn mirlo blanco, cambiaremos este ave por el mirlo comn. Para ello debemos actualizar la fila correspondiente, con la sentencia que aparece en el Cdigo fuente 209.
UPDATE ave SET nombre = 'Mirlo comn' WHERE nombre = 'Mirlo blanco' Cdigo fuente 209
Supongamos ahora que queremos realizar las siguientes consultas, cuyas sentencias se especifican a continuacin: Todos los rboles de la regin centro:
SELECT nombre FROM arbol, arbol_region, region WHERE region.desc_region = 'centro' AND region.cod_region = arbol_region.cod_region AND arbol_region.cod_arbol = arbol.cod_arbol Cdigo fuente 210
Lo que hace la anterior sentencia es obtener el atributo desc_arbol de la tabla arbol. Para ello, primero se pone la condicin de que la regin debe ser centro. Con las filas obtenidas, hacemos un join contra la tabla arbol_region, para obtener el cdigo de los rboles cuya regin es centro. Si ahora queremos obtener la descripcin del rbol, deberemos realizar otro join contra la tabla rbol. El resultado obtenido son los rboles pino, encina y roble. El nmero de aves que son migratorias. Para ello deberemos contar todas las filas de la tabla ave, cuyo atributo migratoria tenga el valor true.
201
Grupo EIDOS
El resultado obtenido es el de 3 aves. El nombre de las aves que anidan en rboles de hoja caduca ordenados alfabticamente. Lo que debemos hacer es seleccionar primero todas las filas cuyo atributo tipo_hoja para luego hacer el join de estas filas con la tabla ave_arbol por el campo cod_arbol, para obtener as el cdigo de las aves que anidan en dichos rboles. Acto seguido, si queremos obtener el nombre de las aves, deberemos realizar un join de las filas obtenidas, con la tabla ave, por el atributo cod_ave y proyectar sobre nombre. La anterior explicacin se resume en la sentencia mostrada en el Cdigo fuente 212.
SELECT ave.nombre FROM arbol, ave_arbol, ave WHERE arbol.tipo_hoja = 'caduca' AND arbol.cod_arbol = ave_arbol.cod_arbol AND ave_arbol.cod_ave = ave.cod_ave ORDER BY ave.nombre Cdigo fuente 212
Como resultado del Cdigo fuente 212, obtenemos que dichas aves corresponden al mirlo blanco y al pato salvaje Si ahora queremos consultar todas las aves que son migratorias, podemos aprovechar la vista anterior, para hacerlo ejecutamos el Cdigo fuente 213.
202