You are on page 1of 60

Bases de Datos:

El modelo de datos Relacional


"
Ingeniera de Sistemas de
Informacin!
Grado en Ingeniera en Tecnologas de
Telecomunicacin"
"
GSyC"
"

2013 Pedro de las Heras Quirs,


Departamento GSyC, URJC"
Algunos derechos reservados. Este trabajo se
distribuye bajo la licencia Creative Commons
Attribution-NonCommercial-ShareAlike 3.0
Unported License"

GSyC"

2"

Contenidos"
El modelo de datos Relacional"
Normalizacin"

GSyC"

3"

El modelo de datos Relacional"

Modelos de datos"
Diseo lgico!
Tras el diseo conceptual utilizando ER realizamos ahora el diseo lgico"
Consiste en convertir la descripcin de alto nivel del diagrama ER en un modelo de
datos adecuado al SGBD que usemos"

Modelo de Datos Relacional: Modelo de datos que utiliza tablas, claves


primarias y claves forneas/Foreign Keys (FK) para modelar los datos"
Otros modelos de datos: "

Modelo de Datos Jerrquico"


Modelo de Datos en Red"
Modelo de Datos Orientado a Objetos "
Modelo de Datos Objeto-Relacional "
Modelo de Datos basado en documentos (ej. mongoDB)"

GSyC"

5"

Modelo Relacional: definiciones"


1969: Edgar F. Codd"
Una BD relacional es un conjunto de relaciones!
Relacin: formada por 2 partes"
Instancia: una tabla, con filas (o tuplas) y columnas"
N de filas: cardinalidad, N de columnas: grado"
Todas las filas son distintas"

Esquema: nombre de la relacin, nombre y tipo de cada columna (o campo, o


atributo), restricciones
""

Ejemplo de esquema: "

Alumnos(nif: string, nombre: string, email: string, edad: int, nota_media: float)

Ejemplo de una instancia (tabla) de la relacin Alumnos: "


" nif!
Nombre!
Email!
Edad!

Nota_media!

123456789A

Luis Gmez Sanz

lag@gmail.com

18

7.8

443666789F

Pedro A. lvarez Gil

pgg@gmail.com

19

8.0

436375531H

Jos Snchez Cid

jss@gmail.com

21

7.2

Cardinalidad: 3, Grado: 5, todas las filas distintas.


GSyC"

6"

Lenguajes de interrogacin
relacionales"

Interrogacin (query): Pregunta sobre los datos almacenados en una BD: "
Cul es el nombre del alumno cuyo NIF es 443666789F? "
Cuntos alumnos estn matriculados de las asignaturas de nombre IARO y SAT"
Cuntos alumnos tienen menos de un 5.0 en SAT? "

Cada SGBD define un lenguaje de interrogacin con el que pueden formularse


las interrogaciones a sus BD."
El modelo relacional tiene entre sus carctetsticas que permite definir lenguajes
de interrogacin muy potentes para las BD relacionales."
Las interrogaciones es escriben de modo intuitivo"
Un SGBD trata de que la evaluacin de las interrogaciones se haga de la forma
ms eficiente posible. "
La semntica de las interrogaciones est bien definida en trminos de un
lgebra relacional, lo que permite al optimizador reordenar operaciones "
La eficiencia tambin depende de cmo se han almacenado los datos y de
cmo se han indexado (qu ndices se han definido) "

GSyC"

7"

SQL"
Cada SGBD define"
un Lenguaje de Definicin de Datos (DDL) para especificar el
Esquema Conceptual y los Esquemas Externos (vistas) de las BD."
un Lenguaje de Manipulacin de Datos (DML) para que los usuarios
de una BD puedan crear, modificar e interrogar la BD. El lenguaje de
interrogacin es, por lo tanto, parte del DML. "
SQL, Standarized Query Language, pese a su nombre, no es
simplemente un lenguaje de interrogacin, sino que incluye tanto un DDL
como un DML."
Est estandarizado pero cada SGBD (Oracle, PostgreSQL, SQLite,
MySQL) aade su propias extensiones."

GSyC"

8"

Creacin de relaciones en SQL"


CREATE TABLE Alumnos
(nif CHAR(10),
nombre CHAR (30),
email CHAR (30),
edad INT,
nota_media FLOAT
); "

CREATE TABLE Matriculados


(nif CHAR(10),
asignatura CHAR (30),
nota FLOAT
); "
"

Alumnos
nif!

Nombre!

Email!

Edad!

Nota_media!

123456789A

Luis Gmez Sanz

lag@gmail.com

18

7.8

443666789F

Pedro A. lvarez Gil

pgg@gmail.com

19

8.0

436375531H

Jos Snchez Cid

jss@gmail.com

21

7.2

nif!

asignatura!

Nota!

123456789A

ISI

5.8

123456789A

Circuitos

10.0

436375531H

Latn

10.0

Matriculados
GSyC"

9"

Destruccin y modificacin de
relaciones"
Destruccin de la relacin, su esquema y sus tuplas:"
DROP TABLE Alumnos;

Aadir columna al esquema:"


ALTER TABLE Alumnos
ADD COLUMN aoIngreso INT;
Se aade campo a las tuplas existentes, con valor NULL para las filas
existentes"

GSyC"

10"

Aadir, Eliminar y Modificar tuplas"


Aadir tupla en una tabla:"
INSERT INTO Alumnos(nif, nombre, email, edad, nota_media)
VALUES ('1234234N', 'Pepe Leches', 'pepe@gmail.com', 22, 2.3); "

Borrar tuplas de una tabla"


DELETE FROM Alumnos
WHERE nombre = 'Pepe Leches';"

Modificar una tupla:"


UPDATE Alumnos
SET nombre='Jose Leches'
WHERE nif= '1234234N';

GSyC"

11"

Interrogacin SQL"
Alumnos
nif!

Nombre!

Email!

Edad!

Nota_media!

123456789A

Luis Gmez Sanz

lag@gmail.com

18

7.8

443666789F

Pedro A. lvarez Gil

pgg@gmail.com

19

8.0

jss@gmail.com
21
" 436375531H Jos Snchez Cid
"
Para encontrar todos los estudiantes de 18 aos:"

7.2

SELECT *
FROM Alumnos A
WHERE A.edad=18;

"
Para encontrar slo nombres e emails:"
SELECT A.nombre, A.email
FROM Alumnos A
WHERE A.edad=18;

"
"

GSyC"

12"

JOIN: Interrogacin SQL en varias


tablas"
Alumnos

"
"

nif!

Nombre!

Email!

Edad!

Nota_media!

123456789A

Luis Gmez Sanz

lag@gmail.com

18

7.8

443666789F

Pedro A. lvarez Gil

pgg@gmail.com

19

8.0

436375531H

Jos Snchez Cid

jss@gmail.com

21

7.2

nif!

Asignatura!

Nota!

123456789A

ISI

5.8

123456789A

Circuitos

10.0

Matriculados

10.0
" 436375531H Latn
Para encontrar todos los estudiantes con matrcula de honor:"
"
SELECT A.nombre, M.asignatura
SELECT A.nombre, M.asignatura FROM Alumnos
FROM
JOIN Matriculados M ON A.nif = M.nif AND
" Alumnos A, Matriculados M
WHERE A.nif = M.nif AND M.nota=10.0;
M.nota = 10.0;
"

A.Nombre!

M.Asignatura!

Luis Gmez Sanz

Circuitos

Jos Snchez Cid

Latn

Resultado
GSyC"

13"

El modelo de datos relacional:


Restricciones de Integridad
"

Restricciones de Integridad
Integrity Constraints (ICs)"
Restricciones de integridad: Condicin que debe cumplirse en cualquier
instancia de la BD"
Ej: restricciones de dominio: el campo X almacena nmeros enteros"

Las restricciones se expresan cuando se define el esquema!


Las restricciones se comprueban cuando se modifican las relaciones!
Una instancia legal de una relacin es la que satisface todas las
restricciones de integridad"
Los DBMS no deben permitir instancias ilegales"

Si el DBMS comprueba las restricciones de integridad, los datos


almacenados son ms fieles a su significado en el mundo real"
Y adems se evitan errores en la introduccin de datos"

Tipos de Restricciones de Integridad: "

Restricciones de Dominio "


Restricciones de Clave Primaria "
Restricciones de Clave Fornea "
Restricciones de Tabla"
Restricciones Complejas (Aserciones). "

GSyC"

15"

Restricciones de dominio"
Dominio: El conjunto valores permitidos para cada columna (campo/
atributo) de una tabla. "
Cada valor para una columna debe estar entre el rango permitido en su
dominio al definirla. "
Al declarar el dominio de una columna puede darse un valor por defecto
para ella. "
Al declarar el dominio de una columna puede especificarse si se permite
un valor nulo para ella. "
Si se intenta aadir una fila que no cumple todas las restricciones de
dominio para los valores de todos sus campos, la insercin ser
rechazada. "
Con SQL hay dominios predefinidos y pueden definirse nuevos. "

GSyC"

16"

Restricciones de dominio: Ejemplo"


En SQL:
CREATE TABLE Estudiantes(nif VARCHAR(20) NOT NULL,
nombre VARCHAR(30) NOT NULL, login VARCHAR(20), edad
INT NOT NULL, nota_media FLOAT DEFAULT '0.0' NOT
NULL); "
"
NOT NULL: Indica que este campo no puede tener valor nulo. "
DEFAULT: Indica el valor por defecto para este campo."

"
"
!

GSyC"

17"

Restricciones de Clave Primaria y


candidatas"
Clave o Clave candidata: Conjunto de campos de una tabla que identifica
unvocamente una tupla/fila, cumplindose adems que ningn
subconjunto de ellos lo hace. "
Superclave: Conjunto de campos que identifica unvocamente una fila,
siendo que un subconjunto de ellos tambin lo hace. "
Clave primaria: Una de las claves candidatas ser la clave primaria,
elegida al definir el esquema"
La restriccin de clave primaria en una tabla implica que no pueden
aadirse dos filas con los mismos valores en la clave primaria. "
Si se han definido otras claves candidatas, tampoco podrn aadirse
dos filas con los mismos valores en todos los campos de una clave
candidata. "

GSyC"

18"

Restricciones de Clave Primaria y


candidatas. Ejemplo"
CREATE TABLE Estudiantes(nif VARCHAR(20), nombre
VARCHAR(30), login VARCHAR(20), fecha_nac DATE, nota_media
FLOAT, UNIQUE(nombre, fecha_nac), PRIMARY KEY(nif));
UNIQUE define una clave candidata, si la hubiera. "
PRIMARY KEY define la clave primaria."

En Meteor, Rails, Django, se utiliza como clave primaria de todas las entidades
una clave surrogada en lugar de la clave natural obtenida del modelo ER. "
La clave surrogada es una columna adicional que se aade automticamente: el
campo _id en Meteor, Rails,"
Se garantiza que es nica y que no se reutiliza"
Pero debemos mantener como clave candidata las claves naturales
identificadas en el modelo ER, para garantizar las restricciones de integridad
identificadas en el diseo conceptual expresado en el diagrama ER"
En el ejemplo, nombre y fecha_nac por un lado, y nif por otro."

GSyC"

"

19"

Restricciones de Clave Primaria y


Candidatas: Precauciones"
Cuidado con cmo elegimos las claves, candidatas
y primarias:"
1. As, slo guardamos una nota para cada pareja de asignatura y alumno:

CREATE TABLE Matriculados (nif CHAR(10),


asignatura CHAR (30), nota FLOAT, PRIMARY KEY
(nif, asignatura));"
2.

CREATE TABLE Matriculados (nif CHAR(10), asignatura


CHAR (30), nota FLOAT, PRIMARY KEY (nif), UNIQUE
(asignatura, nota));
"En cuntas asignaturas puede estar matriculado un alumno?
"cuntas notas puede tener para cada asignatura?, cuntos
"alumnos pueden sacar un 7.0 en cada asignatura?"
GSyC"

20"

Restricciones de Clave Primaria y


Candidatas: Precauciones"
Cuidado con cmo elegimos las claves, candidatas
y primarias:"
1. As, slo guardamos una nota para cada pareja de asignatura y alumno:

CREATE TABLE Matriculados (nif CHAR(10),


asignatura CHAR (30), nota FLOAT, PRIMARY KEY
(nif, asignatura));"
2.

CREATE TABLE Matriculados (nif CHAR(10), asignatura


CHAR (30), nota FLOAT, PRIMARY KEY (nif), UNIQUE
(asignatura, nota));
"As, cada alumno slo puede estar matriculado en una asignatura, y
"recibir slo una nota para esa asignatura, y en cada asignatura no
"puede haber un alumno con la misma nota. Seguro que queremos
"eso? J"
GSyC"

21"

Restricciones de clave fornea


Integridad referencial"
La clave fornea se utiliza en el modelo relacional para implementar las
relaciones del modelo ER"
Clave Fornea: Conjunto de campos de una tabla que son clave primaria
de otra tabla"
se usan para referirse a una fila de esa otra tabla, como un puntero lgico "

En una misma tabla puede haber varias columnas con claves forneas de
tablas distintas. "
Un clave fornea puede referirse a la clave primaria de la propia tabla."
Ej: empleado supervisa empleado"

Si se fuerzan todas las restricciones de clave fornea se consigue la


Integridad referencial: no hay referencias apuntando a tuplas de otras
tablas que no existen"
"
GSyC"

22"

Restricciones de clave fornea:


implicaciones en operaciones SQL"

Cmo forzamos las restricciones de integridad de las FK para que no existan en


Matriculados claves forneas que no correspondan a alumnos de la tabla
Alumnos?"
Insercin: Se rechaza la insercin de un fila en la que el valor de los campos de
las claves forneas no aparece en ninguna fila de la tabla referenciada."
Borrado: Cuando se borra una fila de una tabla referenciada en otra mediante
clave fornea se puede optar entre: "
1. Rechazar el borrado de esa fila si en la otra tabla alguna fila referencia a la que se quiere borrar. "
2. Borrar tambin todas las filas de otra tabla que referenciaban a la fila borrada (a travs de su clave
fornea). "
3. Cambiar el valor de la clave fornea de las filas afectadas a un valor por defecto (si est
establecido al definir el campo en la tabla original). "
4. Cambiar el valor de la clave fornea de las filas afectadas al valor nulo (si est permitido al definir el
campo en la tabla original). "

Actualizacin: Cuando se cambia la clave primaria de una tabla referenciada en


otra mediante clave fornea, es un caso anlogo al del borrado, con las mismas
opciones "

"
GSyC"

23"

Restricciones de clave fornea:


ejemplo SQL"
CREATE TABLE Matriculados (nif CHAR(10), asignatura
CHAR (30), nota FLOAT, PRIMARY KEY (nif, asignatura)
FOREIGN KEY (nif) REFERENCES Alumnos
ON DELETE CASCADE);
Significa: cuando se borre en la tabla alumnos una tupla se deben borrar en Matriculados las tuplas que
pertenezcan a aquella"

CREATE TABLE Matriculados (nif CHAR(10), asignatura


CHAR (30), nota FLOAT, PRIMARY KEY (nif, asignatura)
FOREIGN KEY (nif) REFERENCES Alumnos
ON DELETE CASCADE
ON UPDATE NO ACTION);

ON DELETE especifica el comportamiento al borrar una entrada de la tabla referenciada, y ON UPDATE


al actualizar la clave primaria en una entrada de esa tabla. "

NO ACTION especifica rechazar el cambio (es el valor por defecto)."


CASCADE especifica borrar o actualizar las entradas afectadas. "
SET DEFAULT especifica poner el valor por defecto en la clave fornea de las entradas afectadas. "
SET NULL especifica poner el valor nulo en la clave fornea de las entradas afectadas. "

"
GSyC"

24"

Modelo Relacional: Resumen"


Representacin de los datos en tablas/relaciones"
Simple, intuitivo, el ms usado "
Las restricciones de integridad las puede especificar el
administrador de la BD o el programador de la aplicacin,
basndose en la semntica de la aplicacin"
El DBMS comprueba si hay violaciones"
Restricciones de clave primaria y de clave fornea"
Restricciones de dominio"

Hay lenguajes de interrogacin potentes como SQL"


Hay reglas para traducir del modelo ER al modelo
relacional"

GSyC"

25"

Conversin de un Modelo ER
a un Modelo de datos
Relacional"

Conjuntos de Entidades como


tablas"
Cada atributo del conjunto de entidades se convierte
en un campo de la tabla. "
Los atributos clave se convierten en la clave primaria
de la tabla. "

GSyC"

27"

Conjuntos de Entidades como


tablas: Ejemplo"

CREATE TABLE Empleados (dni VARCHAR(10),


nombre VARCHAR(30),
fecha_nac DATE,
PRIMARY KEY (dni));

GSyC"

28"

Conjuntos de Relaciones sin


restricciones como tablas"
Los atributos de la tabla que representa al
conjunto de relaciones incluyen: "
los atributos descriptivos asociados al conjunto de
relaciones "
los atributos clave de cada conjunto de entidades,
definidos como claves forneas "

Los atributos clave de cada conjunto de entidades


pasan a ser la clave primaria de la tabla"
Recuerda que en Meteor, RoR se utiliza una clave
primaria surrogada, distinta de la clave natural
identificada por el modelo ER"
La clave natural pasa a ser candidata"
GSyC"

29"

Conjuntos de Relaciones sin


restricciones como tablas: ejemplo"

CREATE TABLE Trabaja_En2 (


dni VARCHAR(20), dep_id INT,
direccion VARCHAR(30),
fecha_ingreso DATE,
PRIMARY KEY (dni, dep_id, direccion),
FOREIGN KEY (dni) REFERENCES Empleados,
FOREIGN KEY (dep_id) REFERENCES Departamentos,
FOREIGN KEY (direccion) REFERENCES Sedes
);
GSyC"

30"

Conjuntos de Relaciones con


restricciones de clave"
Opcin 1: Convertirla en una tabla como en el caso
anterior, con la modificacin siguiente: "
los atributos clave de un conjunto de entidades de la que salga una
flecha hacia el conjunto de relaciones se convierten (ellos solos)
en una clave candidata para la tabla"
todas las claves de las entidades participantes en la relacin se
convierten en claves forneas de la tabla de la relacin "

Opcin 2 (preferible): Incluir la informacin de la relacin


en la tabla del conjunto entidad del que sale la flecha 1-amuchos: "
incluir como claves forneas los atributos clave de las otras
entidades relacionadas"
incluir los atributos descriptivos "
GSyC"

31"

Conjuntos de Relaciones con


restricciones de clave"
Ventajas de la opcin 2: "
Una tabla menos, menor complejidad "
Las interrogaciones sobre ese conjunto de relaciones se harn
sobre una sola tabla"
Al no usar JOIN mejora el rendimiento pues la informacin est contigua en el
disco, no en dos tablas"

Inconveniente de la opcin 2: "


Si la participacin del conjunto de entidades en el conjunto de
relaciones es parcial, se desperdicia espacio en la BD (los campos
aadidos tendrn valor nulo). "

GSyC"

32"

Conjuntos de Relaciones con


restricciones de clave: Ejemplo"
Opcin 1!

CREATE TABLE Dirige (


dni VARCHAR(20), dep_id INT,
fecha_comienzo DATE,
PRIMARY KEY (dep_id),
FOREIGN KEY (dni) REFERENCES Empleados,
FOREIGN KEY (dep_id) REFERENCES Departamentos
);
GSyC"

33"

Conjuntos de Relaciones con


restricciones de clave: Ejemplo"
Opcin 2!

CREATE TABLE Departamento_Dirigido


(
dep_id INT, dep_nombre VARCHAR(20),
presupuesto FLOAT(20,2),
dni VARCHAR(20),
fecha_comienzo DATE,
PRIMARY KEY (dep_id),
FOREIGN KEY (dni) REFERENCES Empleados
);
GSyC"

34"

Conjuntos de Relaciones con


restricciones de participacin"

En algunos casos una restriccin de participacin total puede representarse


con restricciones NOT NULL"
Ejemplo con la opcin 2 del caso anterior: "

CREATE TABLE Depart_Dir (


dep_id INT, dep_nombre VARCHAR(20),
presupuesto FLOAT(20,2),
dni VARCHAR(20) NOT NULL,
fecha_comienzo DATE,
PRIMARY KEY (dep_id),
FOREIGN KEY (dni) REFERENCES Empleados
);

35"

Conjuntos de Relaciones con


restricciones de participacin"

Pero algunas restricciones de participacin, como la del ejemplo, son ms


difciles de trasladar al modelo relacional: necesitan restricciones de tabla en
SQL o aserciones para poder expresarse: ejemplo, todo empleado trabaja en
algn dpto y en todo dpto. trabaja al menos un trabajador"
En la aplicacin tendremos que escribir el cdigo que garantice que cada vez
que se aade un empleado o un dpto. se aade una entrada en la relacin "

36"

Relaciones ES-UN"
Alternativa 1: "
Tanto el conjunto de entidades base como los conjuntos de entidades
derivados se trasladan a tablas diferentes."
Las tablas de las entidades derivadas incluyen como campos: "
sus atributos especficos"
los atributos clave de la entidad base son clave primaria y clave fornea en la derivada"

Para cada fila de la tabla de la entidad derivada, los campos heredados


se guardan en una fila de la tabla de la entidad base (referenciada a travs
de la clave fornea). "
Si se borra la fila de la clase de la entidad base, debe borrarse la de la
entidad derivada."
Las queries de la entidad base son inmediatas. Las de la entidad derivada
requieren join con la base para obtener algunos de los atributos"

Alternativa 2: Slo se convierten en entidades las derivadas, que


incluyen los campos de la base."
Obliga a que cada empleado tenga que estar en alguna de las derivadas "
GSyC"

37"

Relaciones ES-UN: ejemplo"

CREATE TABLE Emp_Tpo_Parcial (horas_trab INT,


sueldo_hora FLOAT,
dni VARCHAR(20),
PRIMARY KEY (dni),
Alternativa 1
FOREIGN KEY (dni) REFERENCES Empleados
ON DELETE CASCADE);
CREATE TABLE Emp_Tpo_Parcial (nombre VARCHAR(20), fecha_nac DATE,
horas_trab INT,
sueldo_hora FLOAT,
dni VARCHAR(20),
Alternativa 2
PRIMARY KEY (dni)
);
GSyC"

38"

Conjuntos de entidades dbiles"


El conjunto de entidades dbil y el conjunto de relaciones
se convierten a una sola tabla "
Cuando el dueo de la entidad de la que depende la
entidad dbil se borre, todas las entidades dbiles que
posee deben borrarse"

GSyC"

39"

Conjuntos de entidades dbiles:


ejemplo"
nombre
dni

fecha_nac

Empleados

coste

Pliza

f_nombre

edad

Familiares

CREATE TABLE Fam_Poliza (f_nombre VARCHAR(20),


edad INT,
coste FLOAT,
dni VARCHAR(10) NOT NULL,
PRIMARY KEY (f_nombre, dni),
FOREIGN KEY (dni) REFERENCES Empleados
ON DELETE CASCADE);

GSyC"

40"

Agregaciones: ejemplo 1"


Ejemplo 1:"
Una tabla para Supervisa, con los atributos clave de
Empleados y Depende, y el descriptivo de Supervisa
Las dems entidades y la relacin Depende, se
convierten normalmente"
CREATE TABLE Supervisa

(dni VARCHAR(20),
pid INT,
did INT,
hasta DATE,
PRIMARY KEY (dni,
FOREIGN KEY (dni)
FOREIGN KEY (pid)
FOREIGN KEY (did)

pid, did),
REFERENCES Empleados,
REFERENCES Proyectos,
REFERENCES Departamentos);

Supervisa

hasta

"

comienzo
desde

ppresupuesto

pid

Proyectos

Depende

GSyC"

did

dnombre

dpresupuesto

Departamentos

41"

Agregaciones: ejemplo 2"


Ejemplo 2: "

Si Depende no tuviese atributo descriptivo y su participacin en


Supervisa fuese total, podemos eliminar la tabla de Depende,
pues toda instancia de Depende se puede obtener en las
columnas pid y did de Supervisa

CREATE TABLE Supervisa

(dni VARCHAR(20),
pid INT,
did INT,
hasta DATE,
PRIMARY KEY (dni,
FOREIGN KEY (dni)
FOREIGN KEY (pid)
FOREIGN KEY (did)

pid, did),
REFERENCES Empleados,
REFERENCES Proyectos,
REFERENCES Departamentos);

Supervisa

hasta

"

comienzo
did

ppresupuesto

pid

Proyectos

Depende

GSyC"

dnombre

dpresupuesto

Departamentos

42"

Ejemplo adicional 1"


Una tabla para Empleados
Las restricciones de clave nos permiten combinar
Comprador con Plizas, y Beneficiario con
Familiares
Las restricciones de participacin nos hacen usar
nombre
f_nombre
edad
NOT NULL"
fecha_nac
dni
Familiares

Empleados
Comprador

Beneficiario

Plizas
GSyC"
GSyC"

poli_id

coste

43"

Ejemplo adicional 1"


CREATE TABLE Plizas (poli_id INT,
coste FLOAT,
dni VARCHAR(10) NOT NULL,
PRIMARY KEY (poli_id),
FOREIGN KEY (dni) REFERENCES Empleados
ON DELETE CASCADE);

CREATE TABLE Familiares (f_nombre VARCHAR(20),


edad INT,
poli_id INT NOT NULL,
PRIMARY KEY (f_nombre, poli_id)
FOREIGN KEY (poli_id) REFERENCES Plizas
ON DELETE CASCADE);
"

GSyC"

44"

Ejemplo adicional 2"


Supongamos en este otro ejemplo que Pliza es una entidad dbil "
Una tabla para Empleados
Lo dems es parecido pero:"
La clave primaria de Plizas pasa a ser poli_id, dni"
Y por tanto la primaria y la fornea de Familiares tambin incorporan dni "

dni

nombre

f_nombre

fecha_nac

edad

Familiares

Empleados
Comprador

Beneficiario

Plizas
GSyC"

poli_id

coste

45"

Ejemplo adicional 2"


CREATE TABLE Plizas (poli_id INT,
coste FLOAT,
dni VARCHAR(10) NOT NULL,
PRIMARY KEY (poli_id, dni),
FOREIGN KEY (dni) REFERENCES Empleados
ON DELETE CASCADE);

CREATE TABLE Familiares (f_nombre VARCHAR(20),


edad INT,
poli_id INT NOT NULL,
dni VARCHAR(10) NOT NULL,
PRIMARY KEY (f_nombre, poli_id, dni)
FOREIGN KEY (poli_id, dni) REFERENCES Plizas
ON DELETE CASCADE);
"

GSyC"

46"

Normalizacin"

Introduccin"
En Meteor, Rails, Django, se utiliza como clave primaria de todas las
entidades una clave surrogada en lugar de la clave natural obtenida del
modelo ER (tipicamente denominada _id) "
Se garantiza que es nica y que no se reutiliza"
Pero debemos mantener como clave candidata la clave natural
identificada en el modelo ER, para garantizar las restricciones de
integridad identificadas en el diseo conceptual expresado en el diagrama
ER"
Y debemos identificar otros conjuntos de claves que puedan ser claves
candidatas"

Tras el paso del modelo ER al modelo de datos relacional se


realiza el proceso de normalizacin !
Hay que tener en cuenta todas las claves candidatas"
GSyC"

48"

Normalizacin"
Es un proceso mediante el que se reorganizan los
campos y las tablas de una base de datos relacional"
Introducido por Codd en el artculo original de 1969 "

Objetivo: minimizar la redundancia y las


dependencias entre los campos "
Haciendo que cada hecho de la realidad modelada slo
aparezca en una tabla se minimiza la probabilidad de que
las inserciones/actualizaciones/borrados puedan dejar la
BD en un estado inconsistente"

Consiste en dividir tablas con muchos campos en


tablas con menos campos, aadiendo relaciones
entre ellas"
GSyC"

49"

Normalizacin"
Ojo: tras realizar la normalizacin, aumenta el
nmero de tablas, por lo que empeora el tiempo de
ejecucin de las operaciones"
Se necesitan ms JOINs, entre tablas dispersas en el
disco"

Por ello se suele realizar una denormalizacin a


posteriori, ad hoc, en funcin del patrn de
inserciones/modificaciones/borrados observado"

GSyC"

50"

Primera Forma Normal (1FN)"


El dominio de cada atributo contiene slo valores atmicos y el valor de
cada atributo contiene un slo valor de ese dominio"
Los campos no pueden ser conjuntos/arrays"

Jugadores!
_id!
Nombre!
Apellidos!
Telfono!
!
1!
Mara!
Paz Vega!
666666!
2!
Carlos!
Sez Sez!
777777!
!
999999!
!
3!
Ludovico!
Cuesta Aylln! 888888!
!
Problema:!
Las consultas que busquen por telfono son difciles
(bsqueda en un string con todos los tlfs. por ejemplo)"
Cambiar un telfono o borrarlo tambin es difcil"
GSyC"

51"

Primera Forma Normal (1FN)"


Esto NO es una solucin razonable"
_id!
Nombre!
Jugadores!
1!
Mara!
!
2!
Carlos!
!
3!
Ludovico!
!
!
_id! Nombre! Apellido
Telfono1!
s!
Jugadores!
1!
Mara!
Paz
666666!
Vega!
!
2!
Carlos!
Sez
777777"
Sez!
!
4!
Ludovico! Cuesta
888888!
Aylln!
!
Problema:"

Apellidos!

Telfono!

Paz Vega!

666666!

Sez Sez!

777777!
999999!

Cuesta Aylln!

888888!

Telfono 2!
!
null!
999999"
"
null!

Y si hay 3 telfonos? Cambiar el esquema (ALTER) no es barato"


Malgastamos disco en los que slo tienen 1 telfono"
GSyC"

52"

Primera Forma Normal (1FN)"


Solucin 1: usamos 2 tablas"

Jugadores"
_id!

Nombre!

Apellidos!

Telfono!

1!

Mara!

Paz Vega!

666666!

2!

Carlos!

Sez Sez!

777777!
999999!

3!

Ludovico!

Cuesta Aylln! 888888!

1FN
Jugadores

Telfonos

_id! Nombre!

Apellidos!

_id!

Telfono! Jugador_id!

1"

Mara"

Paz Vega"

1"

666666"

1"

2"

Carlos"

Sez Sez"

2"

777777!

2"

3"

Ludovico"

Cuesta Aylln"

3"

999999!

2"

4"

888888"

3"

GSyC"

53"

Primera Forma Normal (1FN)"


Solucin 2: peor que la anterior"
_id!
Nombre!
Jugadores!
1!
Mara!
!
2!
Carlos!
!
3!
Ludovico!
!
1FN
!
_id!
Nombre!
Jugadores!
"
"

Apellidos!

Telfono!

Paz Vega!

666666!

Sez Sez!

777777!
999999!

Cuesta Aylln!

888888!

Apellidos!

Telfono!

1!

Mara!

Paz Vega!

666666!

2!

Carlos!

Sez Sez!

777777"

3!

Carlos!

Sez Sez!

999999"

4!

Ludovico!

Cuesta Aylln!

888888!

Est en 1FN pero es peor que la solucin 1"


{Nombre, Apellidos} NO es clave candidata (hay varias filas), lo que posiblemente
no refleja los hechos de la realidad modelada"
veremos despus que no est en 3FN: si cambian el nombre o los apellidos habra
que modificar varias filas"
GSyC"
54"

Segunda Forma Normal (2FN)"


1FN, y adems los atributos que no forman parte de una clave dependen
de toda la clave (para todas las claves candidatas y primaria)"

Aficiones"

_id!

Nombre!

Deporte!

Fecha Nacimiento!

1!

Mara Saz Fiz!

Golf!

1/1/1982!

2!

Mara Saz Fiz!

Tenis!

1/1/1982"

3"

Camilo Gmez Ruano"

Tiro olmpico"

3/11/1989"

4"

Jaime Sol Luz"

Beisbol"

12/2/1969"

5"

Jaime Sol Luz"

Golf"

12/2/1969"

6"

Jaime Sol Luz"

Paddle"

12/2/1969"

Problema: Si cambia la fecha de nacimiento hay que cambiar


varias filas"
Est en 1FN pero no en 2FN porque:"
La razn por la que no est en 2FN es que Fecha Nacimiento slo
depende de Nombre y debera depender de {Nombre, Deporte} para
aparecer una sla vez"
Nombre no es clave candidata (hay varias filas con mismo nombre). Deporte
tampoco. La pareja {Nombre, Deporte}
GSyC" s es una clave candidata"

55"

Segunda Forma Normal (2FN)"


Solucin"

Aficiones"

"
Aficiones
_id!

jugador_id!

_id!

Nombre!

Deporte!

Fecha Nacimiento!

1!

Mara Saz Fiz!

Golf!

1/1/1982!

2!

Mara Saz Fiz!

Tenis!

1/1/1982"

3"

Camilo Gmez Ruano"

Tiro olmpico"

3/11/1989"

4"

Jaime Sol Luz"

Beisbol"

12/2/1969"

5"

Jaime Sol Luz"

Golf"

12/2/1969"

6"

Jaime Sol Luz"

Paddle"

12/2/1969"

Deporte!

2FN

Jugadores
_id!

Nombre!
!

Fecha Nacimiento!

1!

1!

Golf!

2!

1!

Tenis!

1!

Mara Saz Fiz"

1/1/1982"

3"

2"

Tiro olmpico"

2"

3/11/1989"

4"

3"

Beisbol"

Camilo Gmez
Ruano"

5"

3"

Golf"

3"

Jaime Sol Luz"

12/2/1969"

6"

3"

Paddle"

GSyC"

56"

Tercera Forma Normal (3FN)"


2FN, y adems los atributos que no forman parte de una clave slo
dependen de la clave (para todas las claves candidatas y primaria)"

Torneos"

_id!

Torneo!

Fecha!

Ganador!

Fecha Nacimiento
Ganador!

1!

Froot Wars!

1/12/2013!

Gema"

12/1/1992"

2!

Alien Invasion!

12/12/2013!

locobiedma" 1/3/1993"

3"

Froot Wars"

6/1/2014"

Xevit"

21/5/1991"

4"

Clarkasonne"

7/12/2013"

Gema"

12/1/1992"

5"

Clarkasonne"

3/4/2014"

locobiedma" 1/3/1993"

"
Problema: Si cambia la fecha de nacimiento de un ganador hay
que modificar varias filas"

Est en 2FN pero no en 3FN porque:"


Fecha Nacimiento Ganador depende de Ganador, que no es un
atributo que forme parte de ninguna clave candidata ni de la primaria"
{Torneo, Fecha} es clave candidata pero ni Torneo ni Fecha por separado
lo son"

"

GSyC"

57"

Tercera Forma Normal (3FN)"


Solucin"

Torneos:"
_id!

Torneo!

Fecha!

Ganador!

Fecha Nacimiento
Ganador!

1!

Froot Wars!

1/12/2013!

Gema"

12/1/1992"

2!

Alien Invasion!

12/12/2013!

locobiedma" 1/3/1993"

3"

Froot Wars"

6/1/2014"

Xevit"

21/5/1991"

4"

Clarkasonne"

7/12/2013"

Gema"

12/1/1992"

5"

Clarkasonne"

3/4/2014"

locobiedma" 1/3/1993"

Torneos
_id!

Torneo!

Fecha!

Jugador_id!

1!

Froot Wars!

1/12/2013!

1"

2!

Alien
Invasion!

12/12/2013!

2"

3"

Froot Wars"

6/1/2014"

3"

4"

Clarkasonne" 7/12/2013"

1"

5"

Clarkasonne" 3/4/2014"

2"

3FN

GSyC"

Jugadores

_id!

Jugador!
!

Fecha Nacimiento!

1!

Gema"

12/1/1992"

2"

locobiedma"

1/3/1993"

3"

Xevit"

21/5/1991"

58"

La verdad, toda la verdad, y nada


ms que la verdad
sobre la Normalizacin"
Todo atributo no clave"
depende de la clave, "
de toda la clave, "
y nada ms que de la
clave"

GSyC"

1FN"
2FN"
3FN"

59"

Referencias "
Database Management Systems, 3rd edition.
Raghu Ramakrishnan, Johannes Gehrke.
Ed. Mc Graw Hill, 2003. Captulos 1,2,3,5."
Learning SQL. Alan Beaulieu. Ed. OReilly.
2005."
Database Normalization, Wikipedia. http://
en.wikipedia.org/wiki/
Database_normalization"

GSyC"

60"

You might also like