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.
Las tablas relacionales son un formato de data esctruturada: Todas las filas de la tabla tienen el mismo número de columnas.
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.
Departamentos | Oferta Académica |
---|---|
DII | Ing Industrial, MDS |
DFI | Física, Astronomía |
DIM | MDS |
DCC | MDS |
Si queremos pasarla a forma normal podemos listar de otra forma:
Carreras Pregrado | Departamento |
---|---|
Ing Industrial | DII |
Física | DFI |
Astronomía | DFI |
MDS | DII |
MDS | DIM |
MDS | DCC |
Segunda Forma Normal (2FN)
Antes, un breve repaso sobre llaves:
- Superllave: combinación de columnas que nos permiten acceder/identificar cualquier fila de la tabla. Pueden incluir columnas redundantes (que repiten valores entre sí y no ayudan a la identificación)
- Llave candidata: Es una llave única (sus combinaciones no se pueden repetir). Todas las llaves candidatas son superllaves. No todas las superllaves son llaves candidatas
- Atributos Primos: O columnas primas, son aquellas que forman parte de una llave candidata (no son redudantes y ayudan a definir las filas de una tabla)
La 2FN debe cumplir dos condiciones:
- La tabla debe estar en primera formal normal (solo un valor por atributo)
- Todos los atributos no primos son dependientes funcionalmente (o pueden ser accedidos) de cualquier llave candidata.
Sea la siguiente tabla (modificada del caso anterior):
Carreras | Departamento | Q alumnos | Porgrama |
---|---|---|---|
Ing Industrial | DII | 90 | Pregrado |
Física | DFI | 15 | Pregrado |
Astronomía | DFI | 20 | Pregrado |
MDS | DII | 5 | Postgrado |
MDS | DIM | 5 | Postgrado |
MDS | DCC | 10 | Postgrado |
MAGCEA | DII | 5 | Postgrado |
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.
Carreras | Programa |
---|---|
Ing Industrial | Pregrado |
Fisica | Pregrado |
Astronomia | Pregrado |
MDS | Pregrado |
MAGCEA | Pregrado |
Carreras | Departamento | Q alumnos |
---|---|---|
Ing Industrial | DII | 90 |
Física | DFI | 15 |
Astronomía | DFI | 20 |
MDS | DII | 5 |
MDS | DIM | 5 |
MDS | DCC | 10 |
MAGCEA | DII | 5 |
Tercera Forma Normal (3FN)
Las condiciones para la tercera forma nomal son:
- Estar en segunda forma normal
- Ningún atributo no primario de la tabla depende transitivamente de ninguna llave candidata.
Una dependencia transitiva es una dependencia funcional en la que X→Z cuando X→Y y Y→Z.
Sea la siguiente tabla:
Tournament | Year | Winner | Birth |
---|---|---|---|
Indiana Invitational | 1998 | Al Fredrickson | 21 July 1975 |
Cleveland Open | 1999 | Bob Albertson | 28 September 1968 |
Des Moines Masters | 1999 | Al Fredrickson | 21 July 1975 |
Indiana Invitational | 1999 | Chip Masterson | 14 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:
Tournament | Year | Winner |
---|---|---|
Indiana Invitational | 1998 | Al Fredrickson |
Cleveland Open | 1999 | Bob Albertson |
Des Moines Masters | 1999 | Al Fredrickson |
Indiana Invitational | 1999 | Chip Masterson |
Winner | Birth |
---|---|
Al Fredrickson | 21 July 1975 |
Bob Albertson | 28 September 1968 |
Al Fredrickson | 21 July 1975 |
Chip Masterson | 14 March 1977 |
Ejercicios
- Sea la siguiente tabla:
ID | Division | Dirección_de_trabajo | Nombre | Position | Horas_Semana |
---|---|---|---|---|---|
001 | Sales | Diagonal Paraguay 257, Santiago | Diego Reyes | Intern | 40 |
002 | Operations | Las Palmeras 3425, Ñuñoa | Max Rosadio | Trainee | 24 |
003 | Sales | Diagonal Paraguay 257, Santiago | Gaby Mora | Manager | 40 |
002 | Marketing | Portugal 84, Santiago | Max Rosadio | Trainee | 16 |
004 | Marketing | Portugal 84, Santiago | Felipe Arias | Manager | 30 |
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.
ID | Nombre | Position |
---|---|---|
001 | Diego Reyes | Intern |
002 | Max Rosadio | Trainee |
003 | Gaby Mora | Manager |
004 | Felipe Arias | Manager |
División | Dirección Trabajo |
---|---|
Sales | Diagonal Paraguay 257, Santiago |
Operations | Las Palmeras 3425, Ñuñoa |
Marketing | Portugal 84, Santiago |
ID | Division | Horas semana |
---|---|---|
001 | Sales | 40 |
002 | Operations | 24 |
002 | Marketing | 16 |
003 | Sales | 40 |
004 | Marketing | 30 |
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:
Statement | Description |
---|---|
CREATE | Create a new object in the database, such as a table or a view. |
ALTER | Modify the structure of an object. For instance, altering a table to add a new column. |
DROP | Remove an object from the database. |
RENAME | Rename an existing object. |
DCL Statement
Manage access to objects in a database by granting, denying, or revoking permissions to specific users or groups.
Statement | Description |
---|---|
GRANT | Grant permissions to perform specific actions |
DENY | Deny permission to perfom specific |
REVOKE | Remove 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.
Statement | Description |
SELECT | Read rows from a table |
INSERT | Insert new rows into a table |
UPDATE | Modify data in existing rows |
DELETE | Delete existing rows |
Ejercicios
Usted trabaja ahora en una fábrica de aviones, donde cuentan con el siguiente esquema de base de datos:
- Modelo(codigo:string, capacidad máxima:int, capacidad mínima:int)
- Avión(codigo:string, M.codigo:string, capacidad:int, precio:int)
- Cliente(id:string, contacto:string)
- Venta(A.código:string, C.id:string, fecha entrega:date)
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;