MODELO RELACIONAL DE LAS BASES DE DATOS
1.1 ESTRUCTURA DE LAS BASES DE DATOS RELACIONALES
Una base de datos relacional consiste en una colección de tablas a cada una de las cuales se asigna un nombre único, una fila de una tabla representa una relación entre un conjunto de valores, puesto que una tabla es una colección de dichas relaciones hay una estrecha correspondencia entre el concepto de tablas y el concepto matemático de la relación del cual toma su nombre el modelo de datos relacional.
ESTRUCTURAS BASICAS
En general una tabla (también llamada relación) contendrá únicamente un subconjunto del conjunto de todas las filas posibles. Por lo tanto la tabla o relación es un subconjunto de D1xD2xD3x…xDn-1xDn. Debido a que cada atributo contiene un conjunto de valores permitidos llamado dominio de ese atributo (D1,D2,D3…).
Puesto que las tablas son esencialmente relaciones, usaremos los términos matemáticos relación y tupla en lugar de los términos de tabla y fila.
Debido a que una relación es un conjunto de tuplas usaremos la notación matemática t r para indicar que la tupla t está o pertenece a la relación r.
Donde:
t= tupla
= pertenece a
r= relación
Entonces tenemos que para todas las relaciones R, los dominios de todos los atributos de r, deberán ser atómicos.
Un dominio es atómico si los elementos del dominio se consideran unidades indivisibles.
ESQUEMA DE LA BASE DE DATOS
Al hablar de una base de datos se debe diferenciar entre el esquema de la base de datos o el diseño lógico de la base de datos, y una instancia de la base de datos, que son los datos en la base de datos en un instante de tiempo dado.
El concepto de esquema de una relación, corresponde a la noción de definición de tipo en los lenguajes de programación. Una variable de un tipo dado tiene un valor determinado en un instante de tiempo dado.
Así una variable en los lenguajes de programación corresponde al concepto de una instancia de una relación. Es conveniente dar un nombre al esquema de una relación así como damos nombres a las definiciones de tipo en los lenguajes de programación.
Usaremos nombres en minúsculas para relaciones y nombres empezando con una letra mayúscula para los esquemas de relaciones.
Ejemplo:
Esquema_deposito=(nombre_sucursal, número_cuenta, nombre_cliente, saldo)
El hecho de que depósito es una relación sobre el esquema depósito se indica de la siguiente manera:
depósito (esquema_depósito)
Cuando queramos definir nuestros dominios usaremos la notación siguiente:
Esquema_depósito = (nombre_sucursal: cadena, número_Cuenta: entero, nombre_cliente: cadena, saldo: entero)
CLAVES
Las claves de una tabla o relación pueden ser superclave, clave candidata y clave primaria las cuales pueden formarse por atributos simples o por un conjunto de atributos, llamados atributos compuestos.
Ejemplo:
Esquema _ sucursal = (nombre_sucursal, activo, ciudad_sucursal)
Para el esquema sucursal ({nombre sucursal} y {nombre_sucursal, ciudad _ sucursal} son súper claves.
{nombre_sucursal} Es en sí, una súper clave y además es una llave candidata.
Este atributo {ciudad_sucursal} no es una súper clave por sí solo debido a que dos sucursales pueden estar en una misma ciudad teniendo nombres diferentes.
LENGUAJES DE CONSULTA
Un lenguaje de consulta, es un lenguaje en el que un usuario solicita información de la base de datos, estos lenguajes son normalmente de más alto nivel que los lenguajes estándar de programación.
Los lenguajes de consulta se pueden clasificar en:
1. Lenguaje procedimental: En este, el usuario da instrucciones al sistema para que realice una secuencia de operaciones en la base de datos para calcular el resultado deseado.
2. Lenguaje no precedimental: En este el usuario describe la información deseada sin dar un procedimiento específico para obtener esa información.
La mayor parte de los sistemas comerciales de bases de datos relacionales ofrecen un lenguaje de consulta que incluya elementos de los dos enfoques procedimental y no procedimental.
El álgebra relacional es procedimental, mientras que el cálculo relacional de tuplas y el cálculo relacional de dominios son no procedimentales.
Enunciados Relacionales.
Los enunciados relacionales, son predicados que especifican una operación precisa sobre una o dos relaciones para obtener consultas definidas por condiciones planteadas por los usuarios de las bases de datos.
Operadores Relacionales.
Los operadores relacionales son símbolos que se usan para comparar dos valores. Si el resultado de la comparación es correcto la expresión considerada es verdadera, en caso contrario es falsa. Los principales operadores de comparación utilizados en el álgebra relacional son:
Mayor que >
Menor que <
Igual =
Diferente
Mayor o igual
Menor o igual
Y (Lógico)
O (Lógico) V
1.2. ÁLGEBRA RELACIONAL
El Álgebra Relacional es un lenguaje que se compone de un conjunto de operaciones fundamentales ( también llamadas operadores ), que toman una o dos relaciones para obtener una tabla que representa una consulta generada por un proceso ( mediante operadores, enunciados o predicados y comandos ).
OPERADORES RELACIÓNALES BÁSICOS.
Las principales operaciones básicas del Álgebra Relacional también conocidas como operaciones fundamentales son:
1. Seleccionar.
2. Proyectar.
3. Renombrar.
Estas operaciones son unitarias porque se aplican sobre una sola tabla.
4. Producto cartesiano.
5. Unión
6. Diferencia de conjuntos
Otras operaciones del álgebra relacional que son consideradas como no fundamentales (debido a que el uso de estas puede sustituirse utilizando una combinación de las operaciones fundamentales antes mencionadas) son:
7. Intersección de Conjuntos.
8. Producto Natural.
9. División.
10. Asignación.
EJEMPLO DE ACCESO A BASES DE DATOS RELACIÓNALES.
Los ejemplos del acceso a las Bases de Datos relacionales, se tomaran del siguiente Diagrama E-R correspondiente a una Empresa Bancaria para utilizar los operadores fundamentales y no fundamentales que se mencionaron en el punto anterior y se explican a detalle a continuación.
Ejemplo: El siguiente diagrama E-R, representa una Empresa Bancaria el cual contiene dos conjuntos de entidades llamadas Cliente y Sucursal y las claves primarias para estos son Nombre_cliente y Nombre_sucursal, respectivamente. Además se tienen dos relaciones llamadas Depósito y Préstamo.
CLIENTE
Depósito
Calle
Nombre_cliente Activo Nombre_sucursal
Ciudad_cliente
Numero_prestamo Cantidad Numero_cuenta Saldo
Ciudad_sucursal
Préstamo
Relación CLIENTE
Nombre_cliente Calle Ciudad_cliente
Johnson Main Harrison Smith North Rye Hayes Main Harrison Curry North Rye Lindsay Park Pittsfield Turner Putnam Stamford Williams Nassau Princeton Adams Spring Pittsfield Johnson Alma Palo Alto Glenn Sand Hill Woodside Brooks Senator Brooklyn
Relación Depósito
Nombre_sucursal Numero_cuenta Nombre_cliente Saldo
Downtown 101 Johnson 500
Mianus 215 Smith 700
Perryridge 102 Hayes 400
Round Hill 305 Turner 350
Perryridge 201 Williams 900
Redwood 222 Lindsay 700
Brigthon 217 Green 750
Downtown 105 Green 850
El atributo Nombre_cliente representa el mismo conjunto de entidades en las 2 relaciones. En caso de querer utilizar una sola tabla con el siguiente esquema:
Esquema_info(nombre_sucursal,numero_cuenta, nombre_cliente,saldo, calle, ciudad_cliente)
Primero, habría repetición de información, ya que si un cliente tiene varias cuentas, se debe listar su dirección una vez para cada cuenta.
Segundo, si un cliente tiene una o más cuentas, pero no ha dado su dirección, no se puede construir una tupla en Esquema_info, ya que no se conocen los valores de Calle y Ciudad_cliente. Es decir, se crearian valores nulos, lo cual no es conveniente.
Debido a estos inconvenientes se realizaron las dos relaciones anteriores (tablas), que se muestran en el esquema E-R.
Las Tablas faltantes son las relaciones Sucursal y Préstamo, que a continuación se presentan:
Relación SUCURSAL
Nombre_sucursal Activo Ciudad_sucursal
Relación Prestamo
Nombre_sucursal Numero_prestamo Nombre_cliente Cantidad
Downtown 17 Jones 1000
Redwood 23 Smith 2000
Perryridge 15 Hayes 1500
Downtown 14 Jackson 1500
Mianus 93 Curry 500
Round Hill 11 Turner 900
Pownal 29 Williams 1200
North Town 16 Adams 1300
Downtown 18 Johnson 2000
Perryridge 25 Glen 2500
Brigthon 10 Brooks 2200
Tomaremos una tabla más denominada relación Servicio la cual se obtiene de la relación entre los conjuntos de entidades Banquero y Cliente (que no se muestra en el diagrama E-R anterior.
Relación servicio
Nombre_cliente Nombre_banquero
Turner Jonson Hayes Jones Johnson Jonson
SELECCIONAR
Esta operación permite seleccionar tuplas que satisfacen un predicado dado (condición). Se utiliza el símbolo de la letra griega minúscula Sigma () para inmdicar la selección. El predicado aparece como subíndice de () y entre paréntesis el nombre de la relación de la cual se hace la operación.
Ejemplos:
a) Seleccionar las tuplas de la relación préstamo en las que la sucursal es Perryridge:
Nombre_sucursal=”Perryridge” (Préstamo)
La tabla generada es la siguiente:
Nombre_sucursal Numero_prestamo Nombre_cliente Cantidad
Perryridge 15 Hayes 1500
b) Encontrar las tuplas en las que la cantidad es mas de 1200 dólares. cantidad>1200 (Préstamo)
Genera la siguiente tabla:
Nombre_sucursal Numero_prestamo Nombre_cliente Cantidad
Redwood 23 Smith 2000
Perryridge 15 Hayes 1500
Downtown 14 Jackson 1500
North Town 16 Adams 1300
Downtown 18 Johnson 2000
Perryridge 25 Glen 2500
Brigthon 10 Brooks 2200
PROYECTAR
La operación proyectar es una operación unitaria que devuelve su relación con ciertas columnas seleccionadas. Puesto que una relación es un conjunto se eliminan todas las filas duplicadas. La proyección se indica con la letra griega Pi (). Se listan los atributos que queremos que aparezcan como subíndice de Pi (), la relación argumento se escribe a continuación entre paréntesis después de Pi ().
Ejemplos:
a) Seleccionar las tuplas de la relación servicio de aquellos clientes cuyo nombre es igual al nombre del banquero, proyectando el nombre del cliente
nombre_cliente(nombre_cliente=nombre_banquero(servicio))
La tabla resultante es:
Nombre_cliente
Johnson
b) Seleccionar las tuplas de la relación préstamo donde cantidad es mayor o igual a 2000, proyectando sucursal y cantidad.
Nombre_sucursal,Cantidad(Cantidad>=2000(Préstamo))
La tabla resultante es:
Nombre_sucursal cantidad
Redwood 2000
Downtown 2000
Perryridge 2500
c) Proyectar Nombre_sucursal de la relación Sucursal, aquella donde el activo es mayor o igual a 8 000 000.
Nombre_sucursal
Downtown Round Hill
PRODUCTO CARTESIANO
Esta operación se representa por medio de una cruz (X), es una operación binaria y ayuda a combinar información de varias relaciones. Escribimos el producto cartesiano de las relaciones
R1 y R2 como R1XR2. Se listan todos los atributos de las 2 relaciones y se adjunta el nombre de
la relación de la que el atributo procede originalmente; para aquellos atributos que solo aparecen en uno de los dos esquemas, se puede omitir el prefijo del nombre de la relación.
El número de tuplas que existen en el producto cartesiano se define por n1n2, siendo n1 el
número de tuplas que tiene R1, y n2 el número de tuplas que tiene R2.
Ejemplo: Encontrar todos los clientes del banquero Jonson, así como las ciudades en que viven estos clientes.
Solución:
Se utilizarán las relaciones Servicio y Cliente.
r = servicio X cliente
Esquema_r=(servicio.nombre_cliente, servicio.nombre_banquero, cliente.nombre_cliente, cliente.calle, cliente.ciudad_cliente)
Nota: se puede cambiar cliente.calle, cliente.ciudad_cliente por calle,ciudad_cliente, puesto que solo son atributos de cliente.
La tabla resultante es la siguiente:
Servicio.
Nombre_cliente Nombre_banquero
Cliente.
Nombre_cliente Calle Ciudad_cliente
Turner Johnson Brooks Senator Brooklyn Turner Johnson Green Walnut Stamford Hayes Jones Johnson Main Harrison Hayes Jones Smith North Rye Hayes Jones Hayes Main Harrison Hayes Jones Curry North Rye Hayes Jones Lindsay Park Pittsfield Hayes Jones Turner Putnam Stamford Hayes Jones Williams Nassau Princeton Hayes Jones Adams Spring Pittsfield Hayes Jones Johnson Alma Palo Alto Hayes Jones Glenn Sand Hill Woodside Hayes Jones Brooks Senator Brooklyn Hayes Jones Green Walnut Stamford Johnson Johnson Johnson Main Harrison Johnson Johnson Smith North Rye Johnson Johnson Hayes Main Harrison Johnson Johnson Curry North Rye Johnson Johnson Lindsay Park Pittsfield Johnson Johnson Turner Putnam Stamford Johnson Johnson Williams Nassau Princeton Johnson Johnson Adams Spring Pittsfield Johnson Johnson Johnson Alma Palo Alto Johnson Johnson Glenn Sand Hill Woodside Johnson Johnson Brooks Senator Brooklyn Johnson Johnson Green Walnut Stamford
Como solo se quieren los clientes de Johnson, entonces, el predicado es: nombre_banquero=”Johnson”(servicioXcliente)
La tabla resultante quedaría de la siguiente manera:
Servicio.
Nombre_cliente Nombre_banquero
Cliente.
Nombre_cliente Calle Ciudad_cliente
Johnson Johnson Williams Nassau Princeton Johnson Johnson Adams Spring Pittsfield Johnson Johnson Johnson Alma Palo Alto Johnson Johnson Glenn Sand Hill Woodside Johnson Johnson Brooks Senator Brooklyn Johnson Johnson Green Walnut Stamford
La columna cliente.nombre_cliente puede contener clientes de banqueros que no sean Johnson. La operación producto cartesiano (X) asocia todas las tuplas de cliente con todas las tuplas de servicio, alguna tupla en servicioXcliente tiene la dirección del cliente del banquero. Esto ocurre solo cuando servicio.nombre_cliente=cliente.nombre_cliente. Entonces:
servicio.nombre_cliente=cliente.nombre_cliente(nombre_banquero=”Jonson”(servicioXcliente))
Como solo queremos el nombre del cliente y la ciudad, hacemos una proyección:
servicio.nombre_cliente,ciudad_cliente(servicio.nombre_cliente=cliente.nombre_cliente
(nombre_banquero=”Jonson”(servicioXcliente)))
Quedando la tabla de la siguiente manera:
Servicio.
Nombre_cliente Ciudad_cliente
Johnson Harrison
Turner Stamford
Johnson Palo Alto
RENOMBRAR
Esta operación se utiliza para renombrar una referencia a una relación y así hacer la referencia a la relación 2 veces sin ambigüedad. Se denota por la letra griega ; su sintaxis es la siguiente:
x(r)
Donde x es el nombre de la nueva relación (copia) y r es el nombre de la relación original.
Ejemplo: Encontrar los nombres de todos los clientes que viven en la misma calle y misma ciudad que Smith.
Se encuentra la calle y ciudad de Smith:
calle,ciudad_cliente(nombre_cliente=”Smith”(cliente))
Para encontrar otros clientes con esa calle y ciudad, se tiene que referenciar una segunda vez: cliente.nombre_cliente(cliente2.calle=cliente.calle^cliente2.cliente_ciudad=cliente.cliente_ciudad(clienteX(calle,ciudad_cliente
La tabla resultante es:
Nombre_cliente
Smith Curry
UNION
Esta operación selecciona las tuplas que cumplen con ciertas condiciones en las relaciones que la conforman. Se representa por .
Sirve para encontrar cierta información en las relaciones y finalmente une el resultado de cada una, obteniendo un conjunto de tuplas eliminando los valores duplicados.
En general debemos asegurarnos de que las uniones se toman entre relaciones compatibles. Por lo tanto para que una operación de unión R S sea valida exigimos se cumplan dos condiciones:
1. Las relaciones R y S deben tener el mismo número de atributos.
2. Los dominios del atributo iésimo de S y del atributo iésimo de R deben ser los mismos.
Ejemplo:
a) Encontrar todos los clientes de la sucursal Perryridge, que tengan un préstamo, una cuenta o ambas.
nombre_cliente(nombre_sucurscal=”Perryridge”(prestamo)) nombre_cliente(nombre_sucurscal=”Perryridge”(deposito))
Puesto que las relaciones son conjuntos, se eliminan los valores duplicados. La tabla resultante es:
Nombre_cliente Nota: Para que una operación rs
Hayes sea válida, se tiene que tomar de
Glenn relaciones compatibles y tener al
Williams menos un atributo igual.
DIFERENCIA DE CONJUNTO
* Encontrar todos los clientes de la sucursal Perryridge que tienen una cuenta ahí, pero no tienen un préstamo.
nombre_cliente(nombre_sucurscal=”Perryridge”(deposito)) - nombre_cliente(nombre_sucurscal=”Perryridge”(prestamo))
La tabla quedaría de la siguiente manera:
Nombre_cliente
Williams
INTERSECCIÓN DE CONJUNTOS.
Permite seleccionar las tuplas que se encuentran en las dos relaciones. Su símbolo es .
* Encontrar todos los clientes que tienen una cuenta y un préstamo en la sucursal Perryridge.
nombre_cliente(nombre_sucurscal=”Perryridge”(préstamo))nombre_cliente(nombre_sucurscal=”Perryridge”(déposito))
Nombre_cliente
Williams
Se puede representar esta operación como:
rs = r - (r - s)
PRODUCTO NATURAL.
Permite combinar ciertas selecciones y un producto cartesiano en una misma operación. El
símbolo utilizado es . Forma un producto cartesiano de sus dos argumentos, realiza una
selección forzando la igualdad en aquellos atributos que aparezcan en ambas planificaciones
de relaciones y, finalmente, quita las columnas duplicadas.
* Encontrar todos los clientes que tienen un préstamo y las ciudades donde viven.
El predicado con operaciones fundamentales sería:
Utilizando el Producto Natural quedaría de la siguiente manera: nombre_cliente,ciudad_cliente (prestamocliente)
El resultado es:
Nombre_cliente Ciudad_cliente
Jones Harrison Smith Rye Hayes Harrison Curry Rye Turner Stamford Williams Princeton Adams Pittsfield Johnson Palo Alto Glenn Woodside Brooks Brooklyn
DIVISIÓN.
Esta operación se establece para aquellas consultas que incluyen la frase <<para todos>>. El símbolo utilizado es .
* Encontrar todos los clientes que tienen una cuenta en todas las sucursales que están en Brooklyn.
Se encuentran todas las sucursales que están en Brooklyn: R1 = nombre_sucursal (ciudad_sucursal=”Brooklyn”(sucursal))
La relación resultante es
Nombre_sucursal
Brighton Downtown
Ahora, se encuentran todos los pares nombre_cliente, nombre_sucursal para los cuales el cliente tiene una cuenta en una sucursal:
R2 = nombre_cliente,nombre_sucursal (déposito)
Quedando de la siguiente forma:
Nombre_cliente Nombre_sucursal
Se necesita encontrar los clients que aparecen en R2 con cada nombre de sucursal en R1. La división hace exactamente esto. El predicado resultante sería:
= nombre_sucursal (ciudad_sucursal=”Brooklyn”(sucursal))nombre_cliente,nombre_sucursal (déposito)
La tabla resultante sería:
Nombre_cliente
Green
ASIGNACIÓN.
A veces es conveniente escribir una expresión del álgebra relacional por partes usando la asignación a una variable de relación temporal. La operación asignación, representada por , funciona de forma parecida a la asignación en un lenguaje de programación. Para ilustrar esta operación, considérese la definición de división anterior. Podemos definir rs como:
tempR-S(r)
temp - R-S((temp s) – r)
La evaluación de una asignación no da como resultado una relación que se presenta al usuario. Más bien, el resultado de la expresión a la derecha de es asignado a la variable de la relación a la izquierda de . Esta variable de relación puede usarse en subsiguientes expresiones. Con la operación asignación una consulta puede escribirse como un programa secuencial que consta de una serie de asignaciones seguidas de una expresión cuyo valor se presenta como el resultado de la consulta. Las asignaciones deben hacerse siempre a una variable de relación temporal y es una forma conveniente de expresar consultas complejas.
1.3. NORMALIZACIÓN
Uno de los conceptos fundamentales en la normalización es el de dependencia funcional y uno
de los retos en el diseño de la base de datos es el de obtener una estructura estable y lógica tal
que:
El sistema de base de datos no sufra de anomalías de almacenamiento.
El modelo lógico pueda modificarse fácilmente para admitir nuevos requerimientos.
Una base de datos implantada sobre un modelo bien diseñado tiene mayor esperanza de vida
aun en un ambiente dinámico, que una base de datos con un diseño pobre. En promedio, una
base de datos experimenta una reorganización general cada seis años, dependiendo de lo
buen desempeño aunque aumente su tamaño, y será lo suficientemente flexible para incorporar
nuevos requerimientos o características adicionales.
Existen diversos riesgos en el diseño de las bases de datos relacionales que afecten la
funcionalidad de la misma, los riesgos generalmente son la redundancia de información y la
inconsistencia de datos.
La normalización es el proceso de simplificar la relación entre los campos de un registro. Por
medio de la normalización un conjunto de datos en un registro se reemplaza por varios registros
que son más simples y predecibles y, por lo tanto, más manejables. La normalización se lleva a
cabo por cuatro razones:
Estructurar los datos de forma que se puedan representar las relaciones pertinentes
entre los datos.
Permitir la recuperación sencilla de los datos en respuesta a las solicitudes de consultas
y reportes.
Simplificar el mantenimiento de los datos actualizándolos, insertándolos y borrándolos. Reducir la necesidad de reestructurar o reorganizar los datos cuando surjan nuevas
aplicaciones.
En términos más sencillos la normalización trata de simplificar el diseño de una base de
datos, esto a través de la búsqueda de la mejor estructuración que pueda utilizarse con
las entidades involucradas en ella.
La teoría de normalización tiene como fundamento el concepto de formas normales; se dice que
una relación está en una determinada forma normal si satisface un conjunto de restricciones.
Formas normales: Son las técnicas para prevenir las anomalías en las tablas. Dependiendo de
su estructura, una tabla puede estar en primera forma normal, segunda forma normal o en
PRIMERA FORMA NORMAL
Una relación R se encuentra en 1FN si y solo sí por cada renglón columna contiene valores
atómicos.
Abreviada como 1FN, se considera que una relación se encuentra en la primera forma normal
cuando cumple lo siguiente:
1. Las celdas de las tablas poseen valores simples y no se permiten grupos ni arreglos
repetidos como valores, es decir, contienen un solo valor por cada celda.
2. Todos los ingresos en cualquier columna (atributo) deben ser del mismo tipo.
3. Cada columna debe tener un nombre único, el orden de las columnas en la tabla no es
importante.
4. Dos filas o renglones de una misma tabla no deben ser idénticas, aunque el orden de las
filas no es importante.
Por lo general la mayoría de las relaciones cumplen con estas características, así que podemos
decir que la mayoría de las relaciones se encuentran en la primera forma normal.
Para ejemplificar como se representan gráficamente las relaciones en primera forma normal
consideremos la relación alumno cursa materia cuyo diagrama E-R es el siguiente:
ALUMNO CURSA MATERIA
Control Nombre clave NomM
Como esta relación maneja valores atómicos, es decir un solo valor por cada uno de los
campos que conforman a los atributos de las entidades, ya se encuentra en primera forma
normal, gráficamente así representamos a las relaciones en 1FN.
SEGUNDA FORMA NORMAL.
Para definir formalmente la segunda forma normal requerimos saber que es una dependencia
funcional: Consiste en edificar que atributos dependen de otro(s) atributo(s).
Definición formal: Una relación R está en 2FN si y solo si está en 1FN y los atributos no
primos dependen funcionalmente de la llave primaria.
Una relación se encuentra en segunda forma normal, cuando cumple con las reglas de la
primera forma normal y todos sus atributos que no son claves (llaves) dependen por completo
de la clave . De acuerdo con está definición, cada tabla que tiene un atributo único como clave,
esta en segunda forma normal.
La segunda forma normal se representa por dependencias funcionales como:
Nótese que las llaves primarias están representadas con doble cuadro, las flechas nos indican
que de estos atributos se puede referenciar a los otros atributos que dependen funcionalmente
de la llave primaria.
TERCERA FORMA NORMAL.
Para definir formalmente la 3FN necesitamos definir dependencia transitiva: En una afinidad
(tabla bidimensional) que tiene por lo menos 3 atributos (A,B,C) en donde A determina a B, B
determina a C pero no determina a A.
control
Nombre
Esp
Clave
NomM
Definición formal: Una relación R está en 3FN si y solo si esta en 2FN y todos sus atributos no
primos dependen no transitivamente de la llave primaria.
Consiste en eliminar la dependencia transitiva que queda en una segunda forma normal, en
pocas palabras una relación esta en tercera forma normal si está en segunda forma normal y no
existen dependencias transitivas entre los atributos, nos referimos a dependencias transitivas
cuando existe más de una forma de llegar a referencias a un atributo de una relación.
Existen seis niveles más de normalización, los cuales se mencionan a continuación:
1. Forma Normal Boyce-Codd
2. Cuarta Forma Normal (4NF)
3. Quinta Forma Normal (5FN) o Forma Normal de Proyección-Unión
4. Forma Normal de Proyección-Unión Fuerte
5. Forma Normal de Proyección-Unión Extra Fuerte
6. Forma Normal de Clave de Dominio
Estas formas de normalización pueden llevar las cosas más allá de lo que necesita. Éstas
existen para hacer una base de datos realmente relacional. Tienen que ver principalmente con
dependencias múltiples y claves relacionales.
¿Porque APLICAR la NORMALIZACION?
Debido a que la normalización es un conjunto de reglas que sirven para ayudar a los
diseñadores a desarrollar un esquema que minimice los problemas de lógica, cada regla está
basada en la que le antecede.
La normalización se adoptó porque el viejo estilo de poner todos los datos en un solo lugar,
como un archivo o una tabla de la base de datos, era ineficiente y conducía a errores de lógica
Resumen de Normalización
La normalización es una técnica que se utiliza para crear relaciones lógicas apropiadas entre
tablas de una base de datos.
Ayuda a prevenir errores lógicos en la manipulación de datos. La normalización facilita también
agregar nuevas columnas sin romper el esquema actual ni las relaciones.
Las tres primeras formas normales proveen suficiente nivel de normalización para cumplir con
las necesidades de la mayoría de las bases de datos.
Normalizar demasiado puede conducir a tener una base de datos ineficiente y hacer que el
esquema sea demasiado complejo para trabajar. Un balance apropiado de sentido común y
práctico puede ayudarnos a decidir cuándo normalizar.
1.4. CÁLCULO RELACIONAL
El álgebra relacional dice cómo obtener unos resultados, mientras el cálculo dice qué resultado se desea.
El álgebra es procedimental mientras que el cálculo es no procedimental.
El cálculo relacional es un lenguaje declarativo, es decir no funciona con procedimientos. Es un lenguaje formal, basado en la rama de la lógica matemática llamado cálculo de predicados. El cual tiene dos adaptaciones: cálculo relacional de tuplas y cálculo relacional de dominios.
Cálculo Relacional de Tuplas
Se basa en la especificación de un cierto número de variables tupla.
Su forma general es:
{ t / P ( t )}
o en forma ampliada:
{t 1 A 1 , t 2 A 2 ,... t n A n / condición(t 1, t 2... t n )}
Lenguajes como Quel (1976) y SQL (1984) se apoyan en este.
Cuantificadores
Se pueden usar los cuantificadores Universal ( ? ) y Existencial ( ? ).
Si una variable tupla esta cuantificada se dice que es una variable restringida o ligada.
Ejemplos.
Obtener los alumnos con promedio superior a 4.0
{t /t ? alumno ? t[promedio] >4.0}
también:
{t /t ? alumno ? t.promedio >4.0}
El caso anterior pero solo obteniendo los codigos y nombres de los estudiantes: {t.codigoal, t.nombreal /t ? alumno ? t.promedio >4.0}
Encontrar el nombre de los profesores que tienen asignadas materias.
{t.nombre /t ? profesor ? ? s ? prof_mat ( t.codigoprof = s.codigoprof )}
Encontrar los nombres de los alumnos que tienen notas en todas las materias.
{t.nombreal /t ? alumno ? ? s ? nota ( t.codigoal = s.codigoal) ? v ? materia (s.codigomat = v.codigomat) }
Cálculo relacional de Dominios
Variables de dominio toman valores en los dominios de los atributos.
Forma General:
Donde:
<x 1 ,x 2 ... x n >, representa las variables tuplas.
P(x 1 ,x 2 ... x n ), es el predicado o condiciones sobre las variables.
Ejemplos.
Obtener los alumnos con promedio superior a 4.0
{<a,b,c,d> /<a,b,c,d> ? alumno ? d >4.0}
El caso anterior pero solo obteniendo los códigos y nombres de los estudiantes: {<a,b> /<a,b,c,d> ? alumno ? d >4.0}
Ejercicios propuestos.
Conseguir los siguientes resultados tanto con cálculo relacional de tuplas, como de dominios:
• Encontrar los nombres de los monitores y los códigos de las materias que monitorean.
• Encontrar los códigos de los estudiantes que no sean monitores
• Encontrar los alumnos que pertenezcan a ASI o a IE
• Encontrar los nombres de los monitores y sus promedios de carrera para aquellos monitores matriculados en ASI
TRABAJANDO SOBRE LAS RELACIONES CON LOS SIGUIENTES ESQUEMAS
cliente (nclie, nombre, ciudad, dire, telef) proveedor (nprove,nombre,ciudad)
producto (nprod, descr, color, peso, nprove, precio) pedido (nped, nclie, fecha, total)
prodped (nped, nprod, cant, subt)
alumno (codigoal, nombreal,promedio, carrera) monitor (codigoal, codmat)
profesor (codprof, nombre, escalafon,carrera) materia (codmat,nombremat,carrera)
USANDO ALGEBRA O CALCULO RELACIONAL DE TUPLAS O DOMINIOS, A MENOS QUE SE ESPECIFIQUE UNO EN PARTICULAR:
• Encontrar la carrera que tenga el máximo de los promedios de los estudiantes.
• Mostrar los clientes que hayan comprado todos los productos del proveedor con nombre “soluciones en Sistemas”.
• Borrar de la relación producto los productos que sean de valor inferior a $500.
• Incremente en 20% el precio de todos los productos.
• Encuentre la cantidad de pedidos realizados por cada cliente.
• Conseguir la pareja profesor, monitor para cada materia que tenga monitor.
• Nombre de cliente que sus pedidos sumen más de $150,000. Muestre ese valor total para cada uno.
• Valor total y promedio de los productos pedidos fabricados por proveedor CINDU ANDINA.
• Mostrar los clientes que hayan comprado todos los productos del proveedor con nombre “soluciones en Sistemas”. Hacerlo por Cálculo relacional.