Informática
Modelo relacional
MODELO RELACIONAL
MODELO RELACIONAL
Definido en 1970 por E.F. Codd.
Este modelo utiliza tablas para representar las entidades y relaciones existentes entre ellas.
Estructura del Modelo
La organización de las tablas se realiza de la siguiente manera
Columnas | |||
Filas | |||
Para que una tabla cumpla con los requisitos de la estructura relacional debe cumplir las siguientes condiciones:
-
Debe tener un solo tipo de filas dándole un formato que debe mantenerse durante todo su trabajo y con la misma cantidad de filas.
-
Cada fila debe ser única y no pueden existir filas duplicadas.
-
Cada columna debe ser única y no deben existir columnas duplicadas.
-
Cada columna debe ser definida con un nombre específico.
-
El valor de una columna para una fila debe ser único, no pueden existir múltiples valores en una posición de la columna.
-
Los valores de cada columna deben pertenecer al dominio que representan y este dominio puede utilizarce en varias columnas.
Las tablas que cumplan con esta condición se denominan Tablas Relacionales y este concepto se utiliza para definir que este tipo de tablas puede asociarse a otras que cumplan con la misma condición, además se le asocian las siguientes propiedades:
-
Las filas pueden estar en cualquier orden.
-
A una fila se la hace referencia mediante todos los valores que la forman.
-
Las columnas pueden estar en cualquier orden.
-
Se hace referencia a una columna mediante el nombre que la identifica.
Pero se utilizan otros términos para referirnos a las filas y columnas. Se conocerá como tuplas a cada una de las filas y atributos a cada una de las columnas.
Atributos | |||
CODFRUTA | NOMFRUTA | PRECIO | |
Tuplas | 123 | Manzana | 300 |
236 | Peras | 250 |
Se denomina Grado de una tabla relacional al número de atributos que la componen, G(frutas) = 3.
Se denomina Cardinalidad de una tabla relacional al número de tuplas que la conforman, C(frutas) = 2.
Dominios
Es el conjunto de los posibles valores para una o más columnas de la tabla relacional, luego los valores contenidos en una columna pertenecen a un dominio que previamente se define y para ello se distinguen dos tipos de dominios:
-
Dominios generales o continuos: Aquellos que contienen todos los posibles valores entre un máximo y un mínimo predefinido:
Peso de un material : números reales y positivos
Saldo de cuantas : números reales negativos y positivos.
Fechas de nacimiento : todas aquellas desde que se tiene noción hasta hoy.
-
Dominios restringidos o discretos: Aquellos que contiene ciertos valores entre un máximo y un mínimo predefinido:
Estado civil : Casado, soltero, viudo, anulado.
Regiones de Chile : 13 regiones.
Sexo : Femenino , masculino.
Claves
Para accesar la información en las tablas relacionales se debe elegir una clave que distinga a una tupla en particular.
La clave se forma tomando un atributo o un conjunto de ellos.
Como condición de que exista una tabla relacional no pueden existir filas duplicadas lo que implica que siempre debe existir al menos una clave (en el peor de los casos estará formada por varios atributos).
Para encontrar la clave adecuada se deben buscar en los dominios de los atributos junto con los enlaces conceptuales que existen entre ellos de manera tal de encontrar valores determinados que identifiquen la tupla de la tabla.
No se debe buscar la clave en los valores concretos de las tuplas sino que en todos los posibles valores de los atributos, es decir su dominio.
Ejemplo:
Sea la siguiente tabla para el personal de una empresa
“PERSONAL” | ||||
IDENTIFI | NOMBRE | DIRECCION | TELEFONO | |
493 | Pedro | Gomez Carreño 1380 | 441327 | |
181 | Luis | Pedro Prado 2903 | 441850 | |
830 | María | Amunátegui 3020 | 410029 | |
341 | Ana | Manuel Rodríguez 1727 | 415674 | |
679 | Juan | Sargento Aldea 1584 | 384566 | |
911 | Pilar | Vivar 1211 | 412369 |
Se observa que el atributo IDENTIFI es el que engloba de mejor manera a la tabla “PERSONAL” ya que cualquier valor del dominio de dicho atributo identifica a una única tupla, luego no puede aparecer un mismo valor de IDENTIFI en dos tuplas diferentes, por lo tanto IDENTIFI pasa a ser la clave de esta tabla.
Supongamos que el personal puede utilizar automóviles que pertenecen a la empresa y los datos de dichos automóviles se encuentran en la tabla denominada “AUTOS-PERSONAL”.
“AUTOS-PERSONAL” | |||||
IDENTIFI | MATRICULA | MARCA | MODELO | COLOR | KM |
723 | KZ-1264 | Ford | Fiesta | Blanco | 579 |
181 | LS-3490 | Opel | Corsa | Blanco | 3991 |
524 | AA-2020 | Opel | Corsa | Negro | 86754 |
524 | CD-2478 | BMW | 318 | Azul | 38805 |
181 | AA-1635 | Renault | R-21 | Negro | 64483 |
911 | AA-2411 | Opel | Corsa | Negro | 48805 |
308 | AA-2020 | Opel | Corsa | Negro | 86754 |
En esta tabla se representan los diferentes autos que puede utilizar un empleado determinado, el auto se identifica por el número de matrícula, que podría ser la clave para esta tabla, pero el auto puede ser utilizado por distintos empleados en distintos momentos, por lo tanto el número de matrícula no podría ser una clave única (debe existir una clave tal que se relacionen ambas tablas).
Tampoco sirve la MARCA, el MODELO o el COLOR del automóvil, tampoco los KM pues estos varían siempre.
Luego la clave no tiene más remedio que ser compuesta, es decir una combinación entre MATRICULA e IDENTIFI. Se sabe que en la tabla “PERSONAL” los valores de las tuplas no se repiten, es decir no existen dos personas con los mismos atributos
(Recordar claves candidatas, clave primaria o principal, clave ajena).
Para elegir la clave principal nos debemos basar en el dominio, ya que luego la B.D. utilizará las claves principales para acceder y relacionar a todas las tablas. Se deben tener en cuenta las siguientes consideraciones para saber si la clave escogida es la correcta:
-
Sus valores deben ser diferentes de nulos.
-
La cantidad de memoria que ocupen debe ser mínima.
-
Debe de ser fácil su codificación.
-
El contenido de sus valores no debe variar.
-
Se pueden utilizar como claves ajenas en otras tablas para permitir la interrelación.
Las claves se utilizan para más adelante definir índices sobre ellas (formas de acceso, donde los índices primarios están formados por las claves principales y los índices secundarios formados por las claves secundarias).
Se da el caso que en algún momento se necesita acceder a la información o tenerla agrupada mediante atributos que no son claves se generan índices secundarios múltiples ya que los atributos que lo forman no son claves y sus valores se repiten dentro de la tabla índice.
Las claves ajenas son muy importantes ya que la integridad da la B.D. se mantiene en gran parte mediante las transacciones que se realizan con dichas claves
ALGEBRA Y CÁLCULO RELACIONAL
Las operaciones definidas sobre las tablas están basadas en el álgebra relacional. Cada operación tomará como operandos una o varias tablas y como resultado se genera otra tabla la que puede volverse a utilizar para otras operaciones.
Se distinguirán dos tipos de operaciones: “básicas”, independientes del resto de las operaciones y “derivadas”, realizan en un proceso llamadas a las operaciones básicas.
Entre las operaciones básicas se distinguen las que las que utilizan una sola tabla de entrada para obtener resultados, operaciones unarias; existen también las que utilizan dos tablas como entradas, operaciones binarias.
Operaciones Básicas:
Operaciones Unarias:
-
Selección
-
Proyección
Operaciones Binarias:
-
Unión
-
Producto cartesiano
-
Diferencia
Operaciones Derivadas:
-
Intersección
-
Cociente (división)
-
Join
Selección: Extrae las tuplas especificadas de una relación dada (es decir restringe la relación solo a las tuplas que satisfagan una condición dada). Utiliza el símbolo S.
Proyección: Extrae los atributos especificados de una relación dada (las columnas). Utiliza el símbolo P.
Unión: Construye una relación formada por todas las tuplas que aparecen en cualquiera de las dos relaciones especificadas. Utiliza el símbolo U.
Producto: O producto cartesiano, construye a partir de dos relaciones dadas una relación que contenga todas las combinaciones posibles de tuplas, una de cada una de las dos relaciones. Utiliza el símbolo x.
A | X | A | X | |||
B | x | Y | A | Y | ||
C | = | B | X | |||
B | Y | |||||
C | X | |||||
C | y |
Diferencia: Construye una relación con las tuplas de la primera relación que no aparezcan en la segunda relación. Utiliza el símbolo --.
Intersección: Construye una relación con aquellas tuplas que aparezcan en las dos relaciones especificadas. Utiliza el símbolo ".
Cociente: (División) Toma dos relaciones, una binaria una unaria y construye una relación formada por todos los valores de un atributo de la relación binaria que concuerdan (en el otro atributo) con todos los valores en una relación unaria. Utiliza el símbolo /.
A | X | X | A | |||
A | Y | / | Y | |||
A | Z | Z | = | |||
B | X | |||||
C | Y | |||||
Join: (Reunión, Unión natural, Yunción) Construye a partir de dos relaciones especificadas una relación que contiene todas las posibles combinaciones de tuplas, una de cada una de las dos relaciones tales que las dos tuplas participantes en una combinación dada satisfagan alguna condición especificada. Utiliza el símbolo *.
A1 | B1 | B1 | C1 | A1 | B1 | C1 | ||
A2 | B2 | * | B2 | C2 | = | A2 | B2 | C2 |
A3 | B3 | B3 | C3 | A3 | B3 | C3 |
LENGUAJE DE CONSULTAS COMERCIALES
En 1981 IBM comercializó el SQL (Structured Query Language, Lenguaje de Consulta Estructurado) el que actualmente es ocupado en la mayoría de las bases de datos relacionales.
SQL es un lenguaje que utiliza el usuario para el manejo de las B.Ds. y puede darse de dos formas:
1.- Usando un lenguaje de programación (lenguaje anfitrión) como Fortran, C, C++, Visual, etc., donde las sentencias SQL están formando parte de las sentencias propias del programa anfitrión (embebida).
2.- Usando directamente el SQL través de programas de consultas como QMF, QBF, QMF, SPUFI.
Además se puede decir que SQL está formado por dos sublenguajes:
-
El DDL encargado de permitir la descripción de los objetos que conforman la B.D.
-
El DML capaz de suministrar las operaciones necesarias para manejar los datos (modificaciones, consultas, eliminación, inserción).
El formato de las sentencias SQL es libre, no sigue ninguna regla de tabulación y se puede escribir en cualquier número de líneas y en cualquier parte de ellas. Para separar una sentencia SQL de otra se utiliza, comúnmente, el carácter “ ; ” (su utilización no es obligatoria en el caso de ejecutar una única sentencia).
Para trabajar con las sentencias SQL se tendrán en cuenta ejemplos que se basarán en las tablas VUELOS, AVIONES y RESERVAS.
VUELOS
NUM_VUELO | ORIGEN | DESTINO | HORA_SALIDA | TIPO_AVION |
IB600 | MADRID | LONDRES | 10.30.00 | 320 |
BA467 | MADRID | LONDRES | 20.40.00 | 73S |
IB0640 | MADRID | BARCELONA | 06.45.00 | 320 |
IB3742 | MADRID | BARCELONA | 09.15.00 | 72S |
LH1349 | COPENHAGUE | FRANCFORT | 10.20.00 | 320 |
AF577 | BILBAO | PARIS | 10.10.00 | 737 |
IB3709 | DUBLIN | BARCELONA | 14.35.00 | D9S |
IB778 | BARCELONA | ROMA | 09.45.00 | 72S |
IB721 | BARCELONA | SEVILLA | 16.40.00 | 72S |
IB327 | MADRID | SEVILLA | 18.05.00 | 72S |
IB023 | MADRID | TENERIFE | 21.20.00 | 72S |
IB368 | MALAGA | BARCELONA | 22.25.00 | D9S |
IB610 | MALAGA | LONDRES | 15.05.00 | 73S |
IB510 | SEVILLA | MADRID | 07.45.00 | 72S |
IB318 | SEVILLA | MADRID | 10.45.00 | 72S |
RESERVAS
NUM_VUELO | FECHA_SALIDA | PLAZAS_LIBRES |
IB600I | 2000-06-20 | 46 |
IB600I | 2000-06-21 | 80 |
IB600I | 2000-06-22 | 91 |
BA467 | 2000-06-20 | 32 |
BA467 | 2000-06-21 | 49 |
BA467 | 2000-06-22 | 79 |
IB0640 | 2000-06-20 | 15 |
IB0640 | 2000-06-21 | 21 |
IB0640 | 2000-06-22 | 39 |
IB3709 | 2000-06-20 | 60 |
IB3709 | 2000-06-21 | 72 |
IB3709 | 2000-06-22 | 85 |
IB510 | 2000-06-20 | 19 |
IB510 | 2000-06-21 | 31 |
IB510 | 2000-06-22 | 40 |
AVIONES
TIPO | CAPACIDAD | LONGITUD | ENVERGADURA | VELOCIDAD CRUCERO |
D9S | 110 | 38,80 | 28,50 | 815,0 |
320 | 187 | 42,15 | 32,60 | 853,0 |
72S | 160 | 36,20 | 25,20 | 820,0 |
73S | 185 | 44,10 | 30,35 | 815,0 |
737 | 172 | 38,90 | 29,00 | 793,0 |
LENGUAJE DE DEFINICIÓN DE DATOS (DDL)
-
Creación de base de datos (también la abre):
CREATE DATABASE [Nombre B.D]
Ejemplo:
CREATE DATABASE AEROPUERTO
-
Creación de tablas:
CREATE TABLE | DBF [Nombre tabla]
(NombreCampo TipoCampo…. )
[NULL | NOT NULL]
[CHECK | ERROR]
[DEFAULT]
[PRIMARY KEY | UNIQUE]
.
.
Ejemplo:
CREATE TABLE VUELOS
(NUM_VUELO CHAR(6) NOT NULL
ORIGEN CHAR(15) NOT NULL
DESTINO CHAR(15) NOT NULL
HORA_SALIDA TIME NOT NULL
TIPO_AVION CHAR(3) );
LENGUAJE DE MANIPULACIÓN DE DATOS (DML)
Sintaxis genérica
SELECT …..
FROM …..
[WHERE …..]
[GROUP BY ……]
[HAVING …….]
[ORDER BY …..]
……..
-
Selección de todas las columnas:
SELECT *
FROM AVIONES;
Ejemplo
AVIONES
TIPO | CAPACIDAD | LONGITUD | ENVERGADURA | VELOCIDAD CRUCERO |
D9S | 110 | 38,80 | 28,50 | 815,0 |
320 | 187 | 42,15 | 32,60 | 853,0 |
72S | 160 | 36,20 | 25,20 | 820,0 |
73S | 185 | 44,10 | 30,35 | 815,0 |
737 | 172 | 38,90 | 29,00 | 793,0 |
-
Selección de una columna específica:
SELECT FECHA_SALIDA
FROM RESERVAS;
Ejemplo
FECHA_SALIDA |
2000-06-20 |
2000-06-21 |
2000-06-22 |
2000-06-20 |
2000-06-21 |
2000-06-22 |
2000-06-20 |
2000-06-21 |
2000-06-22 |
2000-06-20 |
2000-06-21 |
2000-06-22 |
2000-06-20 |
2000-06-21 |
2000-06-22 |
-
Selección de múltiples columnas:
SELECT NUM_VUELO, ORIGEN, DESTINO
FROM VUELOS;
Ejemplo
NUM_VUELO | ORIGEN | DESTINO |
IB600 | MADRID | LONDRES |
BA467 | MADRID | LONDRES |
IB0640 | MADRID | BARCELONA |
IB3742 | MADRID | BARCELONA |
LH1349 | COPENHAGUE | FRANCFORT |
AF577 | BILBAO | PARIS |
IB3709 | DUBLIN | BARCELONA |
IB778 | BARCELONA | ROMA |
IB721 | BARCELONA | SEVILLA |
IB327 | MADRID | SEVILLA |
IB023 | MADRID | TENERIFE |
IB368 | MALAGA | BARCELONA |
IB610 | MALAGA | LONDRES |
IB510 | SEVILLA | MADRID |
IB318 | SEVILLA | MADRID |
-
Reordenamiento de las columnas durante la selección:
SELECT TIPO, ENVERGADURA, LONGITUD
FROM AVIONES;
Ejemplo
TIPO | ENVERGADURA | LONGITUD |
D9S | 28,50 | 38,80 |
320 | 32,60 | 42,15 |
72S | 25,20 | 36,20 |
73S | 30,35 | 44,10 |
737 | 29,00 | 38,90 |
SELECT LONGITUD, TIPO, ENVERGADURA
FROM AVIONES;
Ejemplo
LONGITUD | TIPO | ENVERGADURA |
38,80 | D9S | 28,50 |
42,15 | 320 | 32,60 |
36,20 | 72S | 25,20 |
44,10 | 73S | 30,35 |
38,90 | 737 | 29,00 |
Luego, el orden de selección determina el orden del despliegue.
-
Selección de filas:
Si no se especifica la cláusula WHERE se mostrarán todas las filas.
SELECT DESTINO
FROM VUELOS;
Ejemplo
DESTINO |
LONDRES |
LONDRES |
BARCELONA |
BARCELONA |
FRANCFORT |
PARIS |
BARCELONA |
ROMA |
SEVILLA |
SEVILLA |
TENERIFE |
BARCELONA |
LONDRES |
MADRID |
MADRID |
Si se especifica la cláusula WHERE sólo se mostrarán las filas indicadas
SELECT DESTINO
FROM VUELOS
WHERE ORIGEN = “MADRID”;
Ejemplo
DESTINO |
LONDRES |
LONDRES |
BARCELONA |
BARCELONA |
SEVILLA |
TENERIFE |
SELECT ORIGEN,DESTINO,HORA_SALIDA
FROM VUELOS
WHERE NUM_VUELO = IB721;
Ejemplo
BARCELONA, SEVILLA, 16.40.00
-
Ordenamiento de filas:
Como se explicó anteriormente las filas en el modelo relacional no tienen un orden particular.
Un orden predeterminado en SQL es ascendente (A a Z, 0 a 9), entonces si se desea otro orden se debe utilizar el comando ORDER BY el cual es el único que asegura que las filas serán desplegadas de acuerdo a especificaciones dadas por el usuario.
SELECT NUM_VUELO
FROM VUELOS
ORDER BY NUM_VUELO;
Ejemplo
Atributos de NUM_VUELO antes del orden
NUM_VUELO |
IB600 |
BA467 |
IB0640 |
IB3742 |
LH1349 |
AF577 |
IB3709 |
IB778 |
IB721 |
IB327 |
IB023 |
IB368 |
IB610 |
IB510 |
IB318 |
Atributos de NUM_VUELO después del orden
NUM_VUELO |
AF577 |
BA467 |
IB023 |
IB0640 |
IB318 |
IB327 |
IB368 |
IB3709 |
IB3742 |
IB510 |
IB600 |
IB610 |
IB721 |
IB778 |
LH1349 |
Para ordenar en sentido descendente (de Z a A y de 9 a 0), se debe agregar la palabra reservada DESC al final de cada campo por el que se desea ordenar en sentido descendente.
SELECT NUM_VUELO
FROM VUELO
ORDER BY NUM_VUELO DESC;
Ejemplo
Atributos de NUM_VUELO antes del orden descendente
NUM_VUELO |
IB600 |
BA467 |
IB0640 |
IB3742 |
LH1349 |
AF577 |
IB3709 |
IB778 |
IB721 |
IB327 |
IB023 |
IB368 |
IB610 |
IB510 |
IB318 |
Atributos de NUM_VUELO después del orden descendente
NUM_VUELO |
LH1349 |
IB778 |
IB721 |
IB610 |
IB600 |
IB510 |
IB3742 |
IB3709 |
IB368 |
IB327 |
IB318 |
IB0640 |
IB023 |
BA467 |
AF577 |
-
Ordenamiento de filas para criterios múltiples:
Cuando se ordena utilizando criterios múltiples se siguen ciertos criterios para llevar un orden adecuado y sin enredarse al momento de utilizar los comandos de SQL.
Se denomina orden primar al elemento colocado en primer lugar, luego de la sentencia ORDER BY el cual puede llevar o no las sentencias DESC o ASC según se requiera. Luego viene el elemento de orden secundario, terciario, etc.
SELECT *
FROM VUELOS
ORDER BY NUM_VUELO DESC, ORIGEN;
NUM_VUELO | ORIGEN | DESTINO | HORA_SALIDA | TIPO_AVION |
LH1349 | COPENHAGUE | FRANCFORT | 10.20.00 | 320 |
IB778 | BARCELONA | ROMA | 09.45.00 | 72S |
IB721 | BARCELONA | SEVILLA | 16.40.00 | 72S |
IB610 | MALAGA | LONDRES | 15.05.00 | 73S |
IB600 | MADRID | LONDRES | 10.30.00 | 320 |
IB510 | SEVILLA | MADRID | 07.45.00 | 72S |
IB3742 | MADRID | BARCELONA | 09.15.00 | 72S |
IB3709 | DUBLIN | BARCELONA | 14.35.00 | D9S |
IB368 | MALAGA | BARCELONA | 22.25.00 | D9S |
IB327 | MADRID | SEVILLA | 18.05.00 | 72S |
IB318 | SEVILLA | MADRID | 10.45.00 | 72S |
IB0640 | MADRID | BARCELONA | 06.45.00 | 320 |
IB023 | MADRID | TENERIFE | 21.20.00 | 72S |
BA467 | MADRID | LONDRES | 20.40.00 | 73S |
AF577 | BILBAO | PARIS | 10.10.00 | 737 |
OPERADORES LÓGICOS EN LA SELECCIÓN DE REGISTROS
-
Igual a, = :
SELECT ORIGEN,DESTINO,HORA_SALIDA
FROM VUELOS
WHERE NUM_VUELO = “IB721”;
Ejemplo
BARCELONA, SEVILLA, 16.40.00
-
Distinto a, != (<>) :
SELECT NUM_VUELO, DESTINO,HORA_SALIDA
FROM VUELOS
WHERE ORIGEN != “MADRID”;
Ejemplo
NUM_VUELO | DESTINO | HORA_SALIDA |
LH1349 | FRANCFORT | 10.20.00 |
AF577 | PARIS | 10.10.00 |
IB3709 | BARCELONA | 14.35.00 |
IB778 | ROMA | 09.45.00 |
IB721 | SEVILLA | 16.40.00 |
IB368 | BARCELONA | 22.25.00 |
IB610 | LONDRES | 15.05.00 |
IB510 | MADRID | 07.45.00 |
IB318 | MADRID | 10.45.00 |
-
Mayor que, > :
SELECT TIPO, CAPACIDAD
FROM AVIONES
WHERE VELOCIDAD CRUCERO > 820;
Ejemplo
TIPO | CAPACIDAD |
320 | 187 |
737 | 172 |
-
Mayor e igual que, >= :
SELECT TIPO, CAPACIDAD
FROM AVIONES
WHERE VELOCIDAD CRUCERO > 820;
TIPO | CAPACIDAD |
320 | 187 |
72S | 160 |
737 | 172 |
-
Menor que (<) y Menor e igual que (<=) se ocupan de la misma manera.
-
Igual a cualquier miembro de la lista, IN :
El operador IN permite seleccionar las filas cuyos valores corresponden a los de una lista (utiliza el conectivo “or”).
SELECT *
FROM RESERVAS
WHERE NUM_VUELO IN (“IB600I”, “IB510”);
Ejemplo
NUM_VUELO | FECHA_SALIDA | PLAZAS_LIBRES |
IB600I | 2000-06-20 | 46 |
IB600I | 2000-06-21 | 80 |
IB600I | 2000-06-22 | 91 |
IB510 | 2000-06-20 | 19 |
IB510 | 2000-06-21 | 31 |
IB510 | 2000-06-22 | 40 |
-
Rango de valores, BETWEEN….AND :
Permite seleccionar filas cuyos valores o atributos se encuentran en un rango determinado
SELECT *
FROM RESERVAS
WHERE PLAZAS_LIBRES BETWEEN 60 AND 86;
Ejemplo
NUM_VUELO | FECHA_SALIDA | PLAZAS_LIBRES |
IB600I | 2000-06-21 | 80 |
BA467 | 2000-06-22 | 79 |
IB3709 | 2000-06-20 | 60 |
IB3709 | 2000-06-21 | 72 |
IB3709 | 2000-06-22 | 85 |
SELECT *
FROM RESERVAS
WHERE PLAZAS_LIBRES NOT BETWEEN 60 AND 86;
Ejemplo
NUM_VUELO | FECHA_SALIDA | PLAZAS_LIBRES |
IB600I | 2000-06-20 | 46 |
IB600I | 2000-06-22 | 91 |
BA467 | 2000-06-20 | 32 |
BA467 | 2000-06-21 | 49 |
IB0640 | 2000-06-20 | 15 |
IB0640 | 2000-06-21 | 21 |
IB0640 | 2000-06-22 | 39 |
IB510 | 2000-06-20 | 19 |
IB510 | 2000-06-21 | 31 |
IB510 | 2000-06-22 | 40 |
-
Uso de patrones de búsqueda, LIKE :
Se utiliza para buscar cadenas de caracteres.
Para utilizar este operador se necesitan otros que ayudan a realizar las operaciones:
% se utiliza para cadenas de caracteres (cero o más), _ se utiliza para cadenas de un carácter (guión bajo).
SELECT NUM_VUELO, ORIGEN, DESTINO
FROM VUELOS
WHERE ORIGEN LIKE “C%”;
Ejemplo
NUM_VUELO | ORIGEN | DESTINO |
LH1349 | COPENHAGUE | FRANCFORT |
SELECT NUM_VUELO, ORIGEN, DESTINO
FROM VUELOS
WHERE DESTINO LIKE “P____”;
Ejemplo
NUM_VUELO | ORIGEN | DESTINO |
AF577 | BILBAO | PARIS |
SELECT NUM_VUELO, ORIGEN, DESTINO
FROM VUELOS
WHERE ORIGEN NOT LIKE “MA%”;
Ejemplo
NUM_VUELO | ORIGEN | DESTINO |
LH1349 | COPENHAGUE | FRANCFORT |
AF577 | BILBAO | PARIS |
IB3709 | DUBLIN | BARCELONA |
IB778 | BARCELONA | ROMA |
IB721 | BARCELONA | SEVILLA |
IB510 | SEVILLA | MADRID |
IB318 | SEVILLA | MADRID |
-
Valores nulos, IS NULL :
Se debe tener en cuenta que un valor NULL es distinto de cero o blanco.
SELECT *
FROM VUELOS
WHERE NUM_VUELO IS NULL;
Ejemplo
NUM_VUELO | ORIGEN | DESTINO | HORA_SALIDA | TIPO_AVION |
SELECT *
FROM VUELOS
WHERE NUM_VUELO IS NOT NULL;
Ejemplo
NUM_VUELO | ORIGEN | DESTINO | HORA_SALIDA | TIPO_AVION |
IB600 | MADRID | LONDRES | 10.30.00 | 320 |
BA467 | MADRID | LONDRES | 20.40.00 | 73S |
IB0640 | MADRID | BARCELONA | 06.45.00 | 320 |
IB3742 | MADRID | BARCELONA | 09.15.00 | 72S |
LH1349 | COPENHAGUE | FRANCFORT | 10.20.00 | 320 |
AF577 | BILBAO | PARIS | 10.10.00 | 737 |
IB3709 | DUBLIN | BARCELONA | 14.35.00 | D9S |
IB778 | BARCELONA | ROMA | 09.45.00 | 72S |
IB721 | BARCELONA | SEVILLA | 16.40.00 | 72S |
IB327 | MADRID | SEVILLA | 18.05.00 | 72S |
IB023 | MADRID | TENERIFE | 21.20.00 | 72S |
IB368 | MALAGA | BARCELONA | 22.25.00 | D9S |
IB610 | MALAGA | LONDRES | 15.05.00 | 73S |
IB510 | SEVILLA | MADRID | 07.45.00 | 72S |
IB318 | SEVILLA | MADRID | 10.45.00 | 72S |
-
Inversión de valores, NOT :
Como se ha demostrado anteriormente el operador NOT invierte el valor de alguno de l.os operadores anteriores, NOT BETWEEN, NOT LIKE, IS NOT NULL.
CONDICIONES MÚLTIPLES
Existe la posibilidad de ordenar todas estas condiciones (y las que vendrán más adelante) en una misma sentencia ocupando los paréntesis y operadores como AND y OR.
Lo que se debe tener en cuenta es la precedencia de ellos y respetar por lo tanto dichas normas.
SELECT *
FROM RESERVAS
WHERE NUM_VUELO = “IB0640”
AND FECHA_SALIDA BETWEEN “2000-06-21” AND “2000-06-22”;
Ejemplo
NUM_VUELO | FECHA_SALIDA | PLAZAS_LIBRES |
IB0640 | 2000-06-21 | 21 |
IB0640 | 2000-06-22 | 39 |
SELECT *
FROM RESERVAS
WHERE NUM_VUELO = “IB0641”
OR FECHA_SALIDA = “2000-06-21”
AND PLAZAS_LIBRES < 50;
NUM_VUELO = “IB0641” OR FECHA_SALIDA = “2000-06-21” AND PLAZAS_LIBRES < 50;
Ejemplo
NUM_VUELO | FECHA_SALIDA | PLAZAS_LIBRES |
BA467 | 2000-06-21 | 49 |
IB0640 | 2000-06-21 | 21 |
IB510 | 2000-06-21 | 31 |
EXPRESIONES NUMÉRICAS
En SQL se pueden usar operadores aritméticos los que permiten realizar cálculos numéricos, éstos son: add (+), substract (-), multiply (*) y divide (/).
Al igual que en matemáticas, estas operaciones tienen un orden de precedencia:
División 1er orden
Multiplicación
Adición 2do orden.
Sustracción
Si se tienen operaciones del mismo orden juntas se comienza por la que está más a la izquierda.
Los paréntesis rompen la precedencia y ellos mismos se pueden utilizar para controlar el orden de evaluación, luego no es lo mismo
12 * (SALARIO + PRECIO) != 12 * SALARIO + PRECIO
Se utilizará la siguiente tabla para entregar los ejemplos
MEDIDAS
PAQUETE | ANCHO | ALTURA | LARGO | PESO |
A3456 | 4 | 3 | 26 | 4 |
A3457 | 12 | 12 | 20 | 10 |
A3458 | 10 | 20 | 34 | 20 |
A3459 | 15 | 15 | 22 | 18 |
A3460 | 10 | 10 | 40 | 40 |
A3461 | 10 | 20 | 34 | 22 |
A3462 | 5 | 10 | 15 | 30 |
A3463 | 8 | 14 | 44 | 35 |
SELECT PAQUETE, PESO
FROM MEDIDAS
WHERE (ANCHO * ALTURA) > “143”;
Ejemplo
A3457 10
A3458 20
A3459 18
A3460 40
A3461 22
SELECT PAQUETE, PESO, ANCHO*ALTURA*LARGO “Volumen = ”
FROM MEDIDAS
WHERE ANCHO > “14”;
Ejemplo
A3458 20 Volumen = 6800
A3459 18 Volumen = 4950
A3460 40 Volumen = 4000
A3461 22 Volumen = 6800
FUNCIONES
Se pueden utilizar diversas funciones en las expresiones SQL, siendo las más importantes: COUNT, MIN, MAX, AVG y SUM.
-
COUNT
Permite obtener la cantidad total de atributos que cumplen con una cierta condición.
Si existe un valor NULL en alguna columna esta función opera de dos formas, si se ocupa COUNT (*) la función cuenta los elementos con valor NULL, en otros casos no los toma en cuenta COUNT(ALTURA).
En el caso de que se encuentre con argumentos vacíos, la función devuelve un valor nulo.
SELECT COUNT(*)
FROM MEDIDAS;
Ejemplo
8
SELECT COUNT(*)
FROM MEDIDAS
WHERE ALTURA > “12”;
Ejemplo
4
SELECT COUNT(PESO)
FROM MEDIDAS
WHERE PESO = “20”;
Ejemplo
1
-
MIN
Permite obtener el valor más pequeño de un atributo.
SELECT MIN(PESO)
FROM MEDIDAS;
Ejemplo
4
-
MAX
Permite obtener el valor más grande de un atributo.
SELECT MAX(PESO)
FROM MEDIDAS;
Ejemplo
40
-
AVG
Permite obtener el promedio de los valor de un atributo. En este caso los atributos deben ser numéricos.
SELECT AVG(PESO)
FROM MEDIDAS;
Ejemplo
22,375
-
SUM
Permite obtener la suma de los atributos de una columna. En este caso los atributos deben ser numéricos.
SELECT SUM(PESO)
FROM MEDIDAS;
Ejemplo
179
Para utilizar las funciones SUM, AVG y COUNT es preferible utilizar la palabra reservada DISTINCT la cual permitirá, cuando se desee, sumar o contar los elementos de la tabla sin que se produzcan repeticiones, sobretodo cuando se está sacando un promedio.
SELECT COUNT(DISTINCT ANCHO)
FROM MEDIDAS;
Ejemplo
6
OTRA FUNCIÓN IMPORTANTE
-
Alias de columnas
El encabezado de una columna que se despliega normalmente es el especificado por la tabla, pero es posible desplegar en pantalla un encabezado de columnas distinto especificando un Column Alias en la cláusula SELECT.
Para especificar un alias, debe dejarse un espacio en blanco después del nombre del atributo y después de éste escribir el alias que se eligió.
SELECT PESO MASA
FROM MEDIDAS
WHERE LARGO > 28;
Ejemplo
MASA
40
30
35
OPERACIONES DE ACTUALIZACIÓN
SQL incluye tres operaciones de actualización UPDATE (actualización en el sentido de alterar o modificar), DELETE (eliminar) e INSERT (insertar elementos).
-
UPDATE (Actualizar).
Todos los registros de la tabla serán modificados o actualizados.
UPDATE tabla
SET campo = expresión
[campo = expresión]
[WHERE condición];
Modificación de un solo registro:
UPDATE MEDIDAS
SET ANCHO = “25”
ALTURA = “25”
WHERE PESO = “40”;
Ejemplo
A3456 | 4 | 3 | 26 | 4 |
A3457 | 12 | 12 | 20 | 10 |
A3458 | 10 | 20 | 34 | 20 |
A3459 | 15 | 15 | 22 | 18 |
A3460 | 25 | 25 | 40 | 40 |
A3461 | 10 | 20 | 34 | 22 |
A3462 | 5 | 10 | 15 | 30 |
A3463 | 8 | 14 | 44 | 35 |
Modificar varios registros:
UPDATE MEDIDAS
SET LARGO * 2;
Ejemplo
A3456 | 4 | 3 | 52 | 4 |
A3457 | 12 | 12 | 40 | 10 |
A3458 | 10 | 20 | 68 | 20 |
A3459 | 15 | 15 | 44 | 18 |
A3460 | 10 | 10 | 80 | 40 |
A3461 | 10 | 20 | 68 | 22 |
A3462 | 5 | 10 | 30 | 30 |
A3463 | 8 | 14 | 88 | 35 |
Se debe tener mucho cuidado al modificar los datos de las tablas, pues se debe estar seguro de lo que se realiza, ya que la información se pierde a medida que se modifican los datos.
Existe la posibilidad de trabajar actualizando varias tablas a la vez, si estas tablas están relacionadas con otras se debe tener en cuenta si la modificación afecta o no las tablas relacionadas con la modificada, sí así ocurre se deberán, tal vez, modificar todas las tablas en cuestión.
UPDATE VUELOS
SET NUM_VUELO = “IB0647”
WHERE NUM_VUELO = “IB0640”
UPDATE RESERVAS
SET NUM_VUELO = “IB0647”
WHERE NUM_VUELO = “IB0640”;
-
DELETE (Eliminar)
DELETE
FROM tabla
[ WHERE condición];
Eliminación de un solo registro:
DELETE
FROM MEDIDAS
WHERE PAQUETE = “A3459”;
Ejemplo
A3456 | 4 | 3 | 26 | 4 |
A3457 | 12 | 12 | 20 | 10 |
A3458 | 10 | 20 | 34 | 20 |
A3460 | 10 | 10 | 40 | 40 |
A3461 | 10 | 20 | 34 | 22 |
A3462 | 5 | 10 | 15 | 30 |
A3463 | 8 | 14 | 44 | 35 |
Eliminar varios registros:
DELETE
FROM MEDIDAS
WHERE LARGO > “30”;
Ejemplo
A3456 | 4 | 3 | 26 | 4 |
A3457 | 12 | 12 | 20 | 10 |
A3459 | 15 | 15 | 22 | 18 |
A3462 | 5 | 10 | 15 | 30 |
Eliminar toda la tabla:
DELETE
FROM MEDIDAS;
Esto no quiere decir que desaparece la tabla, sino que desaparecen los datos de la tabla
Ejemplo
De la misma forma que la sentencia UPDATE, la sentencia DELETE modifica los datos en forma irreparable por lo que se debe tener mucho cuidado al eliminar datos, tuplas, etc.
-
INSERT (Insertar)
INSERT
INTO tabla [ ( campo [ , campo ] …. ) ]
VALUES ( literal [ , literal ] …. );
Inserción de un solo registro:
INSERT
INTO MEDIDAS ( PAQUETE, ANCHO, ALTURA, LARGO, PESO)
VALUES (“A3455”, “12”, “14”, “23”, “30” );
Ejemplo
A3455 | 12 | 14 | 23 | 30 |
A3456 | 4 | 3 | 26 | 4 |
A3457 | 12 | 12 | 20 | 10 |
A3458 | 10 | 20 | 34 | 20 |
A3459 | 15 | 15 | 22 | 18 |
A3460 | 10 | 10 | 40 | 40 |
A3461 | 10 | 20 | 34 | 22 |
A3462 | 5 | 10 | 15 | 30 |
A3463 | 8 | 14 | 44 | 35 |
En este caso se ingresan valores en todos los campos, si se sabe que esto siempre será así se puede reducir la sentencia a
INSERT
INTO MEDIDAS (“A3455”, “12”, “14”, “23”, “30” );
Para insertar registros la tabla debe estar creada de antemano (de lo contrario se produce un error).
El valor a insertar debe hacerlo en un lugar específico. El dominio debe ser igual ya sea para el dato a insertar y el campo donde se insertará.
Inserción de datos NULL:
INSERT
INTO MEDIDAS (“A3455”, “10”, “10”, “12”, NULL);
Ejemplo
A3455 | 10 | 10 | 12 | NULL |
A3456 | 4 | 3 | 26 | 4 |
A3457 | 12 | 12 | 20 | 10 |
A3458 | 10 | 20 | 34 | 20 |
A3459 | 15 | 15 | 22 | 18 |
A3460 | 10 | 10 | 40 | 40 |
A3461 | 10 | 20 | 34 | 22 |
A3462 | 5 | 10 | 15 | 30 |
A3463 | 8 | 14 | 44 | 35 |
Si no se incluye un atributo (columna) en la cláusula INSERT el valor asumido por defecto para ese atributo es NULL.
Si al crear la tabla se indicó que un atributo tiene un dominio NOT NULL, ese atributo no puede recibir un valor NULL mediante la sentencia VALUES de INSERT.
INSERT
INTO MEDIDAS ( PAQUETE, ALTURA, LARGO)
VALUES (“A3464”, “18”, “17”,);
Ejemplo
A3456 | 4 | 3 | 26 | 4 |
A3457 | 12 | 12 | 20 | 10 |
A3458 | 10 | 20 | 34 | 20 |
A3459 | 15 | 15 | 22 | 18 |
A3460 | 10 | 10 | 40 | 40 |
A3461 | 10 | 20 | 34 | 22 |
A3462 | 5 | 10 | 15 | 30 |
A3463 | 8 | 14 | 44 | 35 |
A3464 | NULL | 18 | 17 | NULL |
GUÍA DE EJERCICIO
PERSONAL
CLAVE | APELLIDO | NOMBRE | EDAD | SEXO | PROFESIÓN |
123 | PEREZ | CARLOS | 27 | M | PROFESOR |
124 | PORTALES | MARÍA | 19 | F | DOCTOR |
125 | ALFARO | CECILIA | 35 | F | CONTADOR |
122 | COLLAO | JUAN | 27 | M | DOCTOR |
119 | FLORES | EDUARDO | 45 | M | INGENIERO |
180 | PINTO | JOSÉ | 33 | M | PROFESOR |
100 | VERA | MIRIAM | 28 | F | CONTADOR |
126 | OLIVARES | JAVIER | 43 | M | INGENIERO |
101 | PINTO | JORGE | 29 | M | ABOGADO |
111 | PALLARÉ | PATRICIA | 32 | F | PROFESOR |
Ordenar la tabla por apellido en forma ascendente y descendente.
Seleccionar sólo al personal femenino.
Seleccione las tuplas donde la profesión no sea contador.
Seleccionar las tuplas donde la clave se encuentre entre 119 y 130.
Busque las tuplas donde el apellido comience con la letra P.
Ubique el nombre de los empleados que tengan edades entre 25 y 35 años.
Inserte una tupla con los datos: 176, Espejo, Paulina, 29, F.
Elimine las tuplas con profesión abogado.
Modifique las tuplas que contengan apellidos que comiencen con la letra C y coloque en su lugar su apellido.
NORMALIZACIÓN DE LAS BASES DE DATOS RELACIONALES
La normalización es uno de los elementos más importantes del trabajo que se bebe realizar para crear y utilizar las B.Ds. Como se explicó anteriormente, el hecho de que durante el uso de los sistemas tradicionales comenzaran a aparecer problemas de rendimiento de las B.Ds. llevó a los ingenieros informáticos a crear diferentes formas de accesar información de una manera ordenada, segura y con un fácil acceso, pero para poder realizar todo esto los datos insertos en la B.Ds. debían estar ordenados por lo que se tuvo que crear un método que permitiera esto, es aquí que nace la NORMALIZACIÓN.
Definición: La normalización es el proceso de transformación de las complejas representaciones de los usuarios y de los almacenamientos de datos, en conjuntos estables de menor tamaño, sencillos, confiables y fáciles de mantener.
Historia: Este proceso fue creado por E.F. Codd en 1970 (quien también es el creado de las B.D.s relacionales). Al principio sólo experimentaba tres formas normales, Primera Forma Normal (1F.N.), Segunda Forma Normal (2 F.N.) y Tercera Forma Normal (3 F.N.).
Con el paso de los años estas tres formas comenzaron a tener algunos problemas, debido a la gran cantidad de datos existentes, por lo que se tuvo que refinar la 3 F.N. dando origen a la Forma Normal de Boyce y Codd (F.N.B.C [en inglés B.C.N.F.]). Posteriormente Fagin definió la Cuarta Forma Normal (4 F.N.) y la Quinta Forma Normal (5 F.N.).
Se estimó que en el caso de llegar a utilizar la Quinta Forma Normal, luego de aplicarla la tabla ya estaría lista para ser usada.
PRESENTACIONES DEL USUARIO | Informes | ||||
Relaciones sin estructura definida | RELACIONES NO NORMALIZADAS | ||||
Paso 1: Eliminar grupos repetidos | |||||
RELACIONES NORMALIZADAS | |||||
Paso 2: Eliminar dependencias parciales | |||||
RELACIONES EN 2° FORMA NORMAL | |||||
Paso 3: Eliminar dependencias transitivas | |||||
RELACIONES EN 3° FORMA NORMAL |
Ejemplo
Se tiene el siguiente documento
Compañía de Equipos Hidráulicos Mirmidón | ||||
Vendedor # : 3462 | ||||
Nombre : Waters | ||||
Área de ventas : Occidente | ||||
N° CLIENTE | NOMBRE CLIENTE | N° ALMACEN | DIRECCIÓN ALMACEN | VENTAS |
18765 | Delta Service | 4 | Fargo | 13540 |
18830 | Clery and Soto | 3 | Bismasseles | 10600 |
: | : | : | : | : |
De acuerdo a este documento podemos observar algunas asociaciones (luego se podrían pasar a un modelo de entidad y relación):
Se tiene la siguiente tabla (sin normalizar):
NÚMERO VENDEDOR | NOMBRE VENDEDOR | ÁREA VENTAS | NÚMERO CLIENTE | NOMBRE CLIENTE | NÚMERO ALMACÉN | UBICACIÓN ALMACÉN | VALOR VENTA |
3462 | Waters | OCCIDENTE | 18765 | Delta Systems | 4 | Fargo | 13540 |
3462 | Waters | OCCIDENTE | 18830 | A Levy and S | 3 | Bismarels | 10600 |
3462 | Waters | OCCIDENTE | 19242 | Raniers Comp | 3 | Bismarels | 9700 |
: : | : : | : : | : : | : : | : : | : : | : : |
3593 | Dryne | ORIENTE | 18841 | RW Flood | 2 | Superior | 11560 |
3593 | Dryne | ORIENTE | 18899 | Seward Syst | 2 | Superior | 2590 |
3593 | Dryne | ORIENTE | 19565 | Stodols Inc | 1 | Plymauth | 8800 |
: : | : : | : : | : : | : : | : : | : : | : : |
: : | : : | : : | : : | : : | : : | : : | : : |
Existen grupos repetitivos, por lo tanto no está normalizada por lo tanto la base de datos no es relacional, es una simple tabla.
Utilizando las formas normales se tiene (como es un ejemplo se muestra parte del proceso final, para llegar a lo que se ve deben realizarse varios pasos).
VENDEDOR-CLIENTE
NÚMERO VENDEDOR | NÚMERO CLIENTE | NOMBRE CLIENTE | NÚMERO ALMACÉN | UBICACIÓN ALMACÉN | VALOR VENTAS |
VENTAS CUENTA-ALMACÉN
NÚMERO VENDEDOR | NÚMERO CLIENTE | VALOR VENTAS | NÚMERO CLIENTE | NOMBRE CLIENTE | NÚMERO ALMACÉN | UBICACIÓN ALMACÉN | |
3462 | 18765 | 13540 | 18765 | Delta System | 4 | Fargo | |
3462 | 18830 | 10600 | 18830 | A Levy and S | 3 | Bismarels | |
3462 | 19242 | 9700 | 19242 | Ranier Com | 3 | Bismarels | |
3593 | 18841 | 11560 | 18841 | RW Flood | 2 | Superior | |
: | : | : | 18899 | Seward Syst | 2 | Superior | |
: | : | : | 19565 | Stodols Inc | 1 | Plymauth | |
: | : | : | : | : | : | : |
CLIENTE-ALMACÉN
NÚMERO CLIENTE | NOMBRE CLIENTE | NÚMERO ALMACÉN | UBICACIÓN ALMACÉN |
CLIENTE ALMACÉN
NÚMERO CLIENTE | NOMBRE CLIENTE | NÚMERO ALMACÉN | NÚMERO ALMACÉN | UBICACIÓN ALMACÉN | |
18765 | Delta System | 4 | 1 | Plymauth | |
18830 | A Levy and S | 3 | 2 | Superior | |
19242 | Ranier Com | 3 | 3 | Bismarels | |
18841 | RW Flood | 2 | 4 | Fargo | |
18899 | Seward Syst | 2 | |||
19565 | Stodols Inc | 1 | |||
: | : | : |
El objetivo de la normalización es obtener el mayor número posible de tablas, pero dejando en cada una de ellas los atributos que se necesitan para representar al objeto (entidad) y la relación entre las entidades a la que se refiere la tabla utilizando las claves.
Ventajas que se obtienen por el uso de la normalización:
-
Facilidad al usarla, ya que al estar los datos en tablas se identifican claramente los objetos y relaciones.
-
Flexibilidad, pues la información que necesita el usuario se obtienen de las tablas o mediante el uso del álgebra relacional (unión, proyección, selección, etc.) .
-
Poca redundancia, ya que la información no se duplica (aunque existen casos especiales).
-
Precisión, ya que se consigue la información correcta mediante la relación de las tablas.
-
Máximo rendimiento, se ocupa la información que sirve para la aplicación.
-
Fácil de implementar, las tablas se almacenan físicamente como archivos planos.
-
Independencia de datos, lo que permite agregar atributos o tablas sin que se afecte la B.Ds.
-
Claridad, ya que la representación de la información es sumamente clara y sencilla para el usuario.
Este proceso, el de normalización, lo debe realizar el analista de sistemas luego de enterarse de todo lo que requiera el usuario; esta información la recolecta mediante varias reuniones con el usuario, interiorizarse de la situación de su entorno y todo ésto debe recopilarse y documentarse.
PRIMERA FORMA NORMAL (1 F.N)
Una tabla se encuentra normalizada en 1F.N. si los valores que componen el atributo de una tupla son atómicos, esto quiere decir que no deben aparecer valores repetidos.
Ejemplo
Si observamos la siguiente tabla, ésta no se encuentra en 1F.N. ya que el atributo MEDIDAS tiene varios valores en una misma tupla:
MATERIALES
COD_MAT | DESCRIPCION | MEDIDAS |
039 | Tornillo | 3,5 - 5 - 7 |
067 | Arandela | 2 - 5 |
461 | Broca | 2,5 - 3 - 3,5 |
Este es un problema típico lo que trae consigo varios problemas:
-
Falta de espacio en el campo para los valores que tienen o el desaprovechamiento del espacio cuando algunos campos tienen pocos valores.
-
Se hace más difícil las actualizaciones (MIE o MIB, modificar-insertar-eliminar (borrar)).
Entonces se procede a normalizar de la siguiente manera:
Se localizan los atributos que conforman la clave principal, para el ejemplo COD_MAT.
Se descompone la tabla utilizando la PROYECCIÓN.
La clave con los atributos que contiene valores únicos se dejan en una tabla más pequeña continuando con el nombre inicial
MATERIALES
COD_MAT | DESCRIPCION |
039 | Tornillo |
067 | Arandela |
461 | Broca |
Se crea otra tabla con la clave y los atributos que tienen valores múltiples y esta tabla debe llevar un nombre distinto a la tabla anterior.
MATER_MEDIDA
COD_MAT | MEDIDAS |
039 | 3,5 |
039 | 5 |
039 | 7 |
067 | 2 |
067 | 5 |
461 | 2,5 |
461 | 3 |
461 | 3,5 |
Si deseamos ser aún más minuciosos podemos descomponer aún más esta tabla para acceder a una medida determinada y que cada medida tenga su propia clave:
TAB_MEDIDA
COD_MED | MEDIDAS |
01 | 3,5 |
02 | 5 |
03 | 7 |
04 | 2 |
05 | 2,5 |
06 | 3 |
y MATER_MEDIDA quedaría
MATER_MEDIDA
COD_MAT | COD_MED |
039 | 01 |
039 | 02 |
039 | 03 |
067 | 04 |
067 | 02 |
461 | 05 |
461 | 06 |
461 | 01 |
Luego conociendo la clave COD_MAT y COD_MED se puede conocer el tipo de material y la medida que tiene.
CONCEPTO DE DEPENDENCIA FUNCIONAL
Se dice que un atributo (o conjunto de atributos) DEPENDE FUNCIONALMENTE de otro atributo (o conjunto de atributos) si y sólo si cada valor del segundo atributo se corresponde., a nivel conceptual, con un único valor del primer atributo.
Su representación es la siguiente:
A B o A DF B
Ejemplo
Se sabe que entre los atributos RUT y NOMBRE existe una DEPENDENCIA FUNCIONAL ya que el valor de RUT le corresponde a un solo NOMBRE (a una sola persona).
RUT NOMBRE
En el caso de que no existan dos nombres “completamente iguales” se cumple también la dependencia
NOMBRE RUT
En este caso se tendría
RUT NOMBRE
Siendo el primer atributo el más significativo.
No siempre se cumple esta DEPENDENCIA FUNCIONAL como se puede ver en el ejemplo donde se deben relacionar DIRECCIÓN y RUT ya que varias personas pueden vivir en una misma dirección.
PROPIEDADES DE LAS DEPENDENCIAS FUNCIONALES
Supongamos que tenemos la tabla relacional T, que tiene como atributos W, X, Y, Z. Entonces podemos definir las siguientes propiedades:
-
Reflexividad
Si los valores del atributo Y están incluidos o son iguales a los atributos X, entonces se cumple que Y DEPENDE FUNCIONALMENTE de X,
(Y " X) ! (X Y)
Ejemplo
(CODPROV " CDPOST) ! (CDPOST CODPROV)
Siendo CODPROV código de provincia y CDPOST el código postal.
-
Aumentación
Si el conjunto de atributos Y DEPENDE FUNCIONALMENTE de X, entonces dicha dependencia se mantiene aunque se añada un atributo a ambos conjuntos,
(Z Y) ! (X.Z Y.Z)
Ejemplo
(RUT NOMBRE) ! (RUT.EMPRESA NOMBRE.EMPRESA)
-
Transitividad
Si Y DEPENDE FUNCIONALMENTE de X, y Z DEPENDE FUNCIONALMENTE de Y, entonces se verifica que Z DEPENDE FUNCIONALMENTE de X,
(X Y) y (Y Z) ! (X Z)
Ejemplo
(RUT NOMBRE) y (NOMBRE DIRECCION) ! (RUT DIRECCION)
Utilizando estas tres propiedades se puede establecer:
-
Unión
Si Y DEPENDE FUNCIONALMENTE de X y también Z DEPENDE FUNCIONALMENTE de X, implica que Z e Y DEPENDEN FUNCIONALMENTE de X,
Ejemplo
(RUT NOMBRE) y (RUT DIRECCION) ! (RUT NOMBRE.DIRECCION)
-
Pseudo-transitividad
Si se cumple
(X Y) y (W.Y Z) ! (W.X Z)
Ejemplo
(NOMBRE RUT) y (RUT.EMPRESA SUELDO) ! (NOMBRE.EMPRESA SUELDO)
-
Descomposición
Si el conjunto de atributos Y DEPENDE FUNCIONALMENTE de X y también se cumple que los valores del conjunto de atributos Z están incluidos en los valores de Y, entonces se tiene que cumplir que Z DEPENDE FUNCIONALMENTE de X,
(X Y) y (Z " Y) ! (X Z)
Ejemplo
(RUT CDPOST) y (CDPROV CDPOST) ! (RUT CDPROV)
GRÁFICO DE LAS DEPENDENCIAS FUNCIONALES
El gráfico de las DF es una forma clara de tener una visión general de los datos y de la cohesión existente entre ellos. La clave que se obtiene al tratar todas las DF se representa dentro de una caja con sus atributos primarios. El resto de los atributos se representa fuera de la caja y también sus dependencias entre ellos.
Si existe dependencia entre varios atributos que no son claves éstos irán dentro de la caja como un subconjunto representado por una caja de líneas discontinuas y así no se confunden con la clave de la tabla.
Ejemplo
A.B.C M | N | S
M N
B.C O | P | R
O P
C Q
SEGUNDA FORMA NORMAL (2 F.N)
Una tabla relacional se encuentra en 2 F.N. si cumple con las siguientes condiciones:
Se encuentra en 1 F.N.
Todo atributo secundario (los que no pertenecen a la clave principal, fuera de la caja) dependen de la clave completa y por lo tanto no de una parte de ella.
Esta forma normal sólo se utiliza si la clave principal es compuesta (formada por varios atributos), si la clave principal de la tabla está formada por un solo atributo la tabla ya está en 2 F.N.
Si la tabla T posee los atributos A, B, C, D y la clave es A.B y se cumplen las dependencias:
A.B C
B D
Como se puede ver la tabla no está en 2 F.N. ya que el atributo D no tiene una dependencia funcional con la clave A.B
T
Para convertir esta tabla relacional a 2F.N. se realiza una proyección de ella y se crean:
Una tabla con la clave y todas sus dependencias totales con los atributos secundarios afectados.
T1
Otra tabla con la parte de la clave que tiene dependencias y los atributos secundarios implicados.
T2
La clave de la nueva tabla será la antigua parte de la clave
Ejemplo
Las personas que trabajan en varias empresas con el sueldo correspondiente, los atributos que se tienen son:
RUT
NOMBRE
EMPRESA
SUELDO
Existen las siguientes dependencias
RUT NOMBRE
RUT.EMPRESA SUELDO
El gráfico sería
EMPLEADOS
Se puede observar que esta tabla no se encuentra en 2 F.N., entonces luego de normalizarla se tendría
EMPLEADOS
PERSONAS
2
1
NÚMERO VENDEDOR
+
NÚMERO CLIENTE
UBICACIÓN ALMACÉN
N° ALMACÉN
NOMBRE CLIENTE
UBICACIÓN ALMACÉN
N° ALMACÉN
NOMBRE CLIENTE
CLIENTE
NOMBRE VENDEDOR
ÁREA DE VENTAS
N° VENDEDOR
VALOR VENTAS
NÚMERO VENDEDOR
NÚMERO CLIENTE
NOMBRE VENDEDOR
NOMBRE CLIENTE
AREA VENTAS
NÚMERO ALMACÉN
UBICACIÓN ALMACÉN
VALOR VENTAS
S
R
Q
P
O
N
M
B
C
A
C
A
B
D
A
B
C
D
B
NOMBRE
RUT
EMPRESA
SUELDO
SUELDO
RUT
EMPRESA
NOMBRE
RUT
Descargar
Enviado por: | Castañeda Sepúlveda |
Idioma: | castellano |
País: | Chile |