Auxiliar 2 - Modelos de Datos Relacionales

¿Qué son los datos relacionales?

En una base de datos relacionales se modela una colección de entidades del mundo real como tablas. Una entidad puede ser cualquier cosa de la que te gustaría almacenar información.

💡
Una entidad puede ser, por ejemplo, un cliente. Una empresa que realiza envíos desearía almacenar los clientes, con información relevante sobre ellos como: su dirección, número telefónico, correo, etc

Las tablas relacionales son un formato de data esctruturada: Todas las filas de la tabla tienen el mismo número de columnas.

💡
Sin embargo, no todas las filas deben tener un valor en cada columna, estas se rellenan con el valor null (vacío).

Normalización

Es una metodología aplicada al diseño de bases de datos para minimizar la duplicación de información y reforzar la integridad de los datos.

Existen muchas formas de normalización. Algunas de ellas son las siguientes:

Primera Forma Normal (1FN)

Este tipo de normalización exige que no hayan columnas con más de un valor para todas las filas. Por ejemplo, la siguiente base da datos no está en primera forma normal, ya que existen filas con más de un valor para el atributo oferta académica.

DepartamentosOferta Académica
DIIIng Industrial, MDS
DFIFísica, Astronomía
DIMMDS
DCCMDS

Si queremos pasarla a forma normal podemos listar de otra forma:

Carreras PregradoDepartamento
Ing IndustrialDII
FísicaDFI
AstronomíaDFI
MDSDII
MDSDIM
MDSDCC

Segunda Forma Normal (2FN)

Antes, un breve repaso sobre llaves:

La 2FN debe cumplir dos condiciones:

  1. La tabla debe estar en primera formal normal (solo un valor por atributo)
  1. Todos los atributos no primos son dependientes funcionalmente (o pueden ser accedidos) de cualquier llave candidata.

Sea la siguiente tabla (modificada del caso anterior):

CarrerasDepartamentoQ alumnosPorgrama
Ing IndustrialDII90Pregrado
FísicaDFI15Pregrado
AstronomíaDFI20Pregrado
MDSDII5Postgrado
MDSDIM5Postgrado
MDSDCC10Postgrado
MAGCEADII5Postgrado

En la tabla anterior, podemos identificar que Carreras y Departamento es una llave candidata. Ejemplo de esto es que con ambas llaves podemos acceder a cualquiera de las otras columnas. Un ejemplo de no llave candidata es (a la que no se puede acceder a las filas) es tomar solo Carreras. Qué ocurriría si quisiera saber el Departamento de MDS?

Como Programa está fuera de cualquier llave candidata, podemos concluir que es no-primario. Notemos que es depende funcionalmente de la columna Carreras. Como Carreras (sola) no es una llave candidata, automaticamente se viola la regla de 2FN.

Para convertir este modelo a segunda forma normal, creamos las siguientes tablas, donde ambas están en 2FN.

CarrerasPrograma
Ing IndustrialPregrado
FisicaPregrado
AstronomiaPregrado
MDSPregrado
MAGCEAPregrado
CarrerasDepartamentoQ alumnos
Ing IndustrialDII90
FísicaDFI15
AstronomíaDFI20
MDSDII5
MDSDIM5
MDSDCC10
MAGCEADII5

Tercera Forma Normal (3FN)

Las condiciones para la tercera forma nomal son:

Una dependencia transitiva es una dependencia funcional en la que X→Z cuando X→Y y Y→Z.

Sea la siguiente tabla:

TournamentYearWinnerBirth
Indiana Invitational1998Al Fredrickson21 July 1975
Cleveland Open1999Bob Albertson28 September 1968
Des Moines Masters1999Al Fredrickson21 July 1975
Indiana Invitational1999Chip Masterson14 March 1977

En este caso, (Tournament, Year) corresponde a una llave candidata, ya que pueden identificar cualquier fila de la tabla. Está en 1NF (facilito) y además ambas columnas no primas dependen funcionalmente de algún atributo de la llave candidata, por lo tanto, al menos está en 2NF.

Sin embargo, el atributo Birth depende transitivamente de la llave candidata a través del atributo Winner. Esto implica que un cambio sobre la columna Winner debe ir acompañado sobre Birth inmediatamente para evitar inconsistencias.

Para resolver este problema podemos dividirlas en dos:

TournamentYearWinner
Indiana Invitational1998Al Fredrickson
Cleveland Open1999Bob Albertson
Des Moines Masters1999Al Fredrickson
Indiana Invitational1999Chip Masterson
WinnerBirth
Al Fredrickson21 July 1975
Bob Albertson28 September 1968
Al Fredrickson21 July 1975
Chip Masterson14 March 1977

Ejercicios

  1. Sea la siguiente tabla:
IDDivisionDirección_de_trabajoNombrePositionHoras_Semana
001SalesDiagonal Paraguay 257, SantiagoDiego ReyesIntern40
002OperationsLas Palmeras 3425, ÑuñoaMax RosadioTrainee24
003SalesDiagonal Paraguay 257, SantiagoGaby MoraManager40
002MarketingPortugal 84, SantiagoMax RosadioTrainee16
004MarketingPortugal 84, SantiagoFelipe AriasManager30

a) ¿Está la tabla en 2NF? Fundamente

A pesar de que dirección tiene una coma y se podría interpretar como que la tabla no está en 1NF (y por lo tanto, tampoco en 2NF). Sin embargo, si los valores fueran del tipo String, no sería problema.

El problema principal es que existe al menos una columna no primaria: Dirección_de_Trabajo que depende funcionalmente de Division que no es una llave candidata, ya que no define unicamente a todas las filas de la tabla por si sola.

b) Transforme la base de datos, convirtiendo a un modelo relacional de más tablas en que al menos dos tablas cumplan 3FN.

IDNombrePosition
001Diego ReyesIntern
002Max RosadioTrainee
003Gaby MoraManager
004Felipe AriasManager
DivisiónDirección Trabajo
SalesDiagonal Paraguay 257, Santiago
OperationsLas Palmeras 3425, Ñuñoa
MarketingPortugal 84, Santiago
IDDivisionHoras semana
001Sales40
002Operations24
002Marketing16
003Sales40
004Marketing30

Notemos que todas las tablas están en 3FN. En la última tabla no existen atributos no primarios, asi que, a pesar de que existan dependencias transitivas, estas se dan entre atributos primarios.

Consultas SQL

SQL se refiere a Structured Query Language. Se usa para comunicarse con bases de datos relacionales.

Existen 3 tipos de consultas:

Declaraciones DDL

You use Data Definition Language (DDL) statements to create, modify, and remove tables and other objects in a database (table, stored procedures, views, and so on).

The most common DDL statements are:

StatementDescription
CREATECreate a new object in the database, such as a table or a view.
ALTERModify the structure of an object. For instance, altering a table to add a new column.
DROPRemove an object from the database.
RENAMERename an existing object.

DCL Statement

Manage access to objects in a database by granting, denying, or revoking permissions to specific users or groups.

StatementDescription
GRANTGrant permissions to perform specific actions
DENYDeny permission to perfom specific
REVOKERemove a previously granted permission

DML Statement

You use DML statements to manipulate the rows in tables. These statements enable you to retrieve (query) data, insert new rows, or modify existing rows. You can also delete rows if you don't need them anymore.

StatementDescription
SELECTRead rows from a table
INSERTInsert new rows into a table
UPDATEModify data in existing rows
DELETEDelete existing rows

Ejercicios

Usted trabaja ahora en una fábrica de aviones, donde cuentan con el siguiente esquema de base de datos:

M.nombre, A.código y C.id son llaves foráneas que hacen referencia a las tablas Modelo, Avión y Cliente, respectivamente.

a) Los nombres de los modelos de aviones con un precio mayor que 1500000.

SELECT codigo
FROM Avion
WHERE precio>1500000;

b) Los precios de los aviones que tienen una capacidad menor que la capacidad mínima de su modelo o mayor que la capacidad máxima de su modelo.

SELECT precio
FROM Avion A, Modelo M
WHERE A.codigo=M.codigo AND (capacidad > cap_max OR capacidad < cap_min);

c) Debe devolver el id del cliente y el precio del avión más caro que compra, ordenado de mayor a menor.

SELECT Cliente_id, MAX(A.precio)
FROM Cliente C, Venta V, Avion A
WHERE A.codigo=V.Avion_codigo
GROUP BY Cliente_id
ORDER BY precio DESC;

d) Para cada Modelo, el conteo de aviones asociados con ese modelo. Debe devolver el nombre del modelo y el conteo. Además, debe ordenar los resultados por conteo (descendente).

SELECT M.codigo, COUNT(M.codigo) as Conteo
FROM Modelo M LEFT JOIN Avion ON M.codigo = Avion.Modelo_codigo
GROUP BY Modelo_codigo
ORDER BY Conteo DESC;