Diseñode base de datos
Análisis de requisitos
Diseño conceptual de bases de datos
Diseño lógico de bases de datos
Usuarios Requisitos
Requisitos Modelo entidad-relación
Modelo entidad-relación Modelo relacional
Hasta ahora
Sabemoscomotransformarrequisitosde usuarioen
modeloentidadrelación(E/R), pero…
¿Quéhacemoscon esto?
Hoy veremoscómotransformarelmodeloE/R al
modelorelacional
Llaves
ModeloRelacionaly Llaves
ModeloRelacional
Los datosse almacenancomotablas:
ID Película Nombre Película Año CategoríaCalificación (IMDB)
1 Interstellar 2014 Fantasía 8.6
2 The Revenant 2015 Drama 8.1
3 The Imitation Game 2014 Biografía 8.1
4 The Theory of Everything2014 Biografía 7.7
Distinguimos:
•Relaciones: a cadatablale llamamosrelación
•Atributos: son las columnasde la relación
•Tuplas: son las filasde la relación
Películas
ModeloRelacional
UnaRelaciones un conjuntode tuplas!!!
-Quieredecir; no hay filasrepetidas
ID Película Nombre Película Año CategoríaCalificación (IMDB)
1 Interstellar 2014 Fantasía 8.6
2 The Revenant 2015 Drama 8.1
3 The Imitation Game 2014 Biografía 8.1
4 The Theory of Everything2014 Biografía 7.7
4 The Theory of Everything2014 Biografía 7.7
ModeloRelacional
UnaRelaciones un conjuntode tuplas, no hay filas
repetidas
ID Película Nombre Película Año CategoríaCalificación (IMDB)
1 Interstellar 2014 Fantasía 8.6
2 The Revenant 2015 Drama 8.1
3 The Imitation Game 2014 Biografía 8.1
4 The Theory of Everything2014 Biografía 7.7
4 The Theory of Everything2014 Biografía 7.7
Llaves
Ejemplo: Una tablacon informaciónde vinos.
Esquema:
Vinos(Productor, Cepa, Gama, Año, Grados, Orígen)
Productor Cepa Gama AñoGradosOrígen
Perez-CruzCabernet Sauvignon Reserva 201413.5 Maipo
Perez-CruzCabernet Sauvignon Gran Reserva 201513.5 Maipo
Tarapaca Merlot Reserva 2011 14
San
Pedro
Viu Manent Carmenere Gran Reserva 2014 12
Colchagu
a
Perez-CruzCabernet SauvignonEdición Especial2014 14 Maipo
… … … … …
Llaves
Son restriccionesque imponemosa un esquemaque todas
las instanciasdebensatisfacer
La restricciónmásimportanteson las llaves
Intuitivamenteunallavepermiteidentificar, de manera
única, unatuplade la relación
Hay distintascategoríasde llaves!
Restriccionesde integridad
Super llave
La super llavepara unarelaciónR es:
un conjunto de atributosde R talque no puedenexistirdos
tuplasenRcon losmismosvaloresde estosatributos
Intuitivamente: siconozcolosvaloresde atributosde la
super llave, puedoidentificarde forma únicaa la tuplade
la relación
Llaves
Superllave
El conjunto de TODOSlosatributosde la relaciónsiempre
formanunasuper llave!
Otrassuper llaves: (Productor, Cepa, Gama, Año, Grados)
(Productor, Cepa, Gama, Año, Orígen)
Productor Cepa Gama AñoGradosOrígen
Perez-CruzCabernet Sauvignon Reserva 201413.5 Maipo
Perez-CruzCabernet Sauvignon Gran Reserva 201513.5 Maipo
Tarapaca Merlot Reserva 2011 14
San
Pedro
Viu Manent Carmenere Gran Reserva 2014 12
Colchagu
a
Perez-CruzCabernet SauvignonEdición Especial2014 14 Maipo
… … … … …
Llaves
Superllave
Como (Productor, Cepa, Gama, Año, Orígen)es
superllave. lo siguienteno estápermitidoenunainstancia:
Productor Cepa Gama AñoGrados Orígen
Perez-CruzCabernet Sauvignon Reserva 2014 13.5 Maipo
Perez-CruzCabernet Sauvignon Gran Reserva 2015 13.5 Maipo
Tarapaca Merlot Reserva 2011 14 San Pedro
Viu Manent Carmenere Gran Reserva 2014 12 Colchagua
Perez-CruzCabernet Sauvignon EdiciónEspecial2014 14 Maipo
Perez-CruzCabernet Sauvignon Edición Especial2014 13 Maipo
Llaves
Llavecandidata
La llave(o llavecandidata) para unarelaciónR es:
un conjunto de atributosde R que es unasuper llavede R,
y no existeun subconjuntopropiode estosatributosque es
unasuper llave
Intuitivamente: unasuper llaveque no se puedeachicar!
Llaves
Llaveprimaria
La llaveprimariaes unallavecandidataque queremos
destacar, y la subrayamosenelesquema.
Llaves
Llaveprimaria
Vinos(Productor, Cepa, Gama, Año, Grados, Orígen)
Productor Cepa Gama AñoGradosOrígen
Perez-CruzCabernet Sauvignon Reserva 201413.5 Maipo
Perez-CruzCabernet Sauvignon Gran Reserva 201513.5 Maipo
Tarapaca Merlot Reserva 2011 14
San
Pedro
Viu Manent Carmenere Gran Reserva 2014 12
Colchagu
a
Perez-CruzCabernet SauvignonEdición Especial2014 14 Maipo
… … … … …
Llaves
Si definomal la llaveprimariahabráproblemas!
Vinos(Productor, Cepa, Gama, Año, Grados, Orígen)
Un productor no puedeproducirvino de mismacepa y gamaendistintos
años!
Productor Cepa Gama AñoGradosOrígen
Perez-CruzCabernet Sauvignon Reserva 201413.5 Maipo
Perez-CruzCabernet Sauvignon Gran Reserva 201513.5 Maipo
Perez-CruzCabernet Sauvignon Gran Reserva 2014 14 Maipo
… … … … …
Llaves
Si definomal la llaveprimariatendréproblemas!
Vinos(Productor, Cepa, Gama, Año, Grados, Orígen)
Un productor no puedeproducirvinos de distintacepa o gamaenun año!
Productor Cepa Gama AñoGradosOrígen
Perez-CruzCabernet Sauvignon Reserva 201413.5 Maipo
Perez-Cruz Carmenere Reserva 201413.5 Maipo
Perez-CruzCabernet Sauvignon Gran Reserva 2014 14 Maipo
… … … … …
Llaves
Llaves
Super llave(superkey): cualquierconjunto de atributos
quédeterminaa todoelresto
Llave(candidata): cualquierconjunto de atributosqué
determinaa todoelresto, y ningunode sus subconjuntos
es unasuper llave
Llaveprimaria: unallavecandidataque queremos
destacar(la subrayadaenelesquema)
Terminología
ModeloRelacional
Mejortipode llave: ID únicode la tupla!!!!
Llaves
Enla tablaVinos no
existía!
Surrogate key (llavesustituta): unallavegenérica
que simplificacosas. -> id
Vinos(id, Productor, Cepa, Gama, Año, Grados,
Orígen)
Hay que tenercuidadocon la lógicade la
relación!
Diseñode base de datos
Análisis de requisitos
Diseño conceptual de bases de datos
Diseño lógico de bases de datos
Usuarios Requisitos
Requisitos Modelo entidad-relación
Modelo entidad-relación Modelo relacional
M. E/R →M. Relacional
Producto(nombre: string, precio: int, categoría: string)
Compañía(nombre: string, valor-acción: int)
Fabrica(Producto.nombre: string, Compañia.nombre, desde: date)
Compañía
nombre
valor-acción
nombre
precio
categoría
desde
fabricaProducto
Las llaves de las entidades
involucradas forman una
super llave para la relación
M. E/R →M. Relacional
Producto(nombre: string, precio: int, categoría: string)
CREATETABLEproducto(
nombrevarchar(30),
precioint,
categoriavarchar(30),
PRIMARYKEY(nombre)
)
nombre
precio
categoría nombre valor-acción
desde
Producto fabrica Compañía
M. E/R →M. Relacional
Compañía(nombre: string, valor-acción: int)
CREATETABLEcompania(
nombrevarchar(30),
valor_accionint,
PRIMARYKEY(nombre)
)
nombre
precio
categoría nombre valor-acción
desde
Producto fabrica Compañía
¿Como relacionamosla tabla
companiacon la tabla
producto?
M. E/R →M. Relacional
CREATETABLEfabrica(
p_nombrevarchar(30),
c_nombrevarchar(30),
desdedate,
PRIMARYKEY(p_nombre, c_nombre),
FOREIGNKEY(p_nombre) REFERENCES producto(nombre),
FOREIGNKEY(c_nombre) REFERENCES compania(nombre)
)
Fabrica(Producto.nombre: string, Compañia.nombre, desde: date)
Llavesforáneas!
nombre
precio
categoría nombre valor-acción
desde
Producto fabrica Compañía
¡Usandollaves
foraneas!
Paréntesis:
Llavesforáneas
LlavesForáneas
Cuandolareferenciaalatablaesunallave:
Y B
1,...,B
nson llavepara S
La relaciónR contienela llavede la relaciónS
¿Que es unallaveforanea?
Pero hay que tenercuidado, porejemplo:
Llavesforáneas
¿Quépasaaquí?
pid nombre precio
1 SonyXZ89 $100.000
2 SonyXperia1 $1.000.000
3 Huawei23 $1000
cid nombre
C1 Sony
C2 Apple
pid cid
1 C1
2 C1
3 C8
89 C2
fabrica
producto compania
Compañía
nombre
nombre
pid
fabricaProducto
precio
cid
Llavesforáneas
¿Quépasaaquí?
pid nombre precio
1 SonyXZ89 $100.000
2 SonyXperia1$1.000.000
3 Huawei23 $1000
cid nombre
C1 Sony
C2 Apple
pid cid
1 C1
2 C1
3 C8
89 C2
fabrica
producto compania
???
C8 No existeenla
tablacompania!
Compañía
nombre
nombre
pid
fabricaProducto
precio
cid
Llavesforáneas
¿Quépasaaquí?
pid nombre precio
1 SonyXZ89 $100.000
2 SonyXperia1$1.000.000
3 Huawei23 $1000
cid nombre
C1 Sony
C2 Apple
pid cid
1 C1
2 C1
3 C8
89 C2
fabrica
producto compania
???
C8 No existeenla
tablacompania!
???
89 No existeenla
tablaproducto!
Compañía
nombre
nombre
pid
fabricaProducto
precio
cid
¿CómorepresentarE/R
con llavesforáneas?
M. E/R →M. Relacional
Producto fabrica Compañía
nombre
precio
categoría nombre
valor-acción
desde
Producto(nombre: string, precio: int, categoría: string)
Compañía(nombre: string, valor-acción: int)
Fabrica(Producto.nombre: string, Compañia.nombre, desde: date)
¿Que hacemosenestecaso?
M. E/R →M. Relacional
Producto(nombre: string, precio: int, categoría: string)
Compañía(nombre: string, valor-acción: int)
Fabrica(Producto.nombre: string, Compañia.nombre, desde: date)
¿Que hacemosenestecaso?
No se necesita que
Compañia.nombre sea llave
Producto.nombre forma una llave
candidata
Producto fabrica Compañía
nombre
precio
categoría nombre
valor-acción
desde
M. E/R →M. Relacional
Producto(nombre: string, precio: int, categoría: string,
Compañía.nombre: string, desde: date)
Compañía(nombre: string, valor-acción: int)
¿Y ahora?
Sólo necesitamos una llave foránea
en Producto.
Agregamos también el atributo de la
relación.
Producto fabrica Compañía
nombre
precio
categoría nombre
valor-acción
desde
M. E/R →M. Relacional
Producto(nombre: string, precio: int, categoría: string,
Compañía.nombre: string, desde: date)
Compañía(nombre: string, valor-acción: int)
Un mejordiagrama…
Sólo necesitamos una llave foránea
en Producto.
Agregamos también el atributo de la
relación.
Producto fabrica Compañía
nombre
precio
categoría nombre
valor-acción
desde
M. E/R →M. Relacional
¿Y enestecaso?
Producto(nombre: string, precio: int, categoría: string)
Compañía(nombre: string, valor-acción: int)
Fabrica(Producto.nombre: string, Compañia.nombre, desde: date)
Podemos hacer llave a Producto.nombre o
a Compañía.nombre
Producto fabrica Compañía
nombre
precio
categoría nombre
valor-acción
desde
M. E/R →M. Relacional
modelo
dirección
categoría
id
año
Auto
Arrendar
Local de
Autos
Persona
cliente cajero
fecha
nombre
rut
Auto(modelo: string, año: int, categoría: string)
Local de Autos(id: int, dirección: string)
Persona(rut: string, nombre: string)
Arriendo(A.modelo: string, A.año: int, Pr.rut-cl: string, Pr.rut-ca: string, L.id: int, fecha: date )
¿Que hacemosenestecaso?
¿Cómorepresentarun M.
E/R enun M. Relacional
con jerarquiade clases?
Ejemplo
Bebida
Vino
nombre
origen
Cerveza
isA isA
año
Jerarquíade clases
M. E/R →M. Relacional
Vino(nombre: string, origen: string, año: string)
Cerveza(nombre: string, origen: string)
Bebida
Vino
nombre
origen
Cerveza
isA isA
año
Jerarquíade clases
Opción1: Tablassolo para las subclases
Bebida(nombre: string, origen: string)
Vino(nombre: string, año: string)
Cerveza(nombre: string)
Opción2: Tablapara la superclase
¿Cuáles mejor?
Si hay muchosolapamiento: opción2.
De lo contrariotendríamosmucharepeticiónde datos.
Se requierenjoins para acceder a
todoslosdatos
Si no hay cobertura: opción2.
No hay otraopcióno no podríamosguardarelwhisky :(
M. E/R →M. Relacional
Vino(nombre: string, origen: string, año: string)
Cerveza(nombre: string, origen: string)
Jerarquíade clases
Opción1: Tablassolo para las subclases
Bebida(nombre: string, origen: string)
Vino(nombre: string, año: string)
Cerveza(nombre: string)
Opción2: Tablapara la superclase
¿Cuáles mejor?
Se requierenjoins para acceder a
todoslosdatos
Bebida
Vino
nombre
origen
Cerveza
isA isA
año
M. E/R →M. Relacional
Vino(nombre: string, origen: string, año: string)
Cerveza(nombre: string, origen: string)
Jerarquíade clases
Opción1: Tablassolo para las subclases
Bebida(nombre: string, origen: string)
Vino(nombre: string, año: string)
Cerveza(nombre: string)
Opción2: Tablapara la superclase
¿Cuáles mejor?
Si hay muchasconsultaspornombre: opción2.
Con la opción1 tendríamosque consultardos tablas.
Se requierenjoins para acceder a
todoslosdatos
Bebida
Vino
nombre
origen
Cerveza
isA isA
año
M. E/R →M. Relacional
Bebida
nombre
origen
año
Jerarquíade clases
Opción3: Quitarla jerarquía
Bebida(nombre: string, origen: string, año: string, tipo: string)
•Muchasrepeticionesde la columnatipo.
•Puedeque no se conozcaeltipo(nulls).
•Pero mássencillo(y comprimible)
tipo
¿Cómorepresentarun M.
E/R enun M. Relacional
con entidadesdébiles?
Ejemplo
Evaluación de Curso
fecha
código
nombre
nombre
Entidadesdébiles
M. E/R →M. Relacional
Entidadesdébiles
Evaluación de Curso
fecha
código
nombre
nombre
Curso(codigo: string, nombre: string)
¿Quétablasnecesitamos?
¿Estábien esto?
La tablaDe es redundante(1-a-algo)
(ymal nombrepara unatabla)
De(E.nombre: string, C.código: string)
Evaluación(nombre: string, C.código: string, fecha: date)
M. E/R →M. Relacional
Entidadesdébiles
Curso(codigo: string, nombre: string)
Evaluación(nombre: string, C.código: string, fecha: date)
¡Ahorasí!
CREATETABLEevaluacion(
nombrevarchar(30) NOTNULL,
codigovarchar(30) NOTNULL,
fechadate,
PRIMARYKEY (nombre, codigo)
FOREIGNKEY(codigo) REFERENCES curso(codigo) ONDELETECASCADE
)
Evaluación de Curso
fecha
código
nombre
nombre
M. E/R →M. Relacional
Entidadesdébiles
Evaluación
de Curso
fecha
código nombrenombre
Nota eval
Alumno
rut
nombre
autor
preguntavalor
¿Y las relaciones?
Curso(codigo: string, nombre: string)
Evaluación(nombre: string, C.código: string, fecha: date)
Nota(pregunta: int, E.nombre: string, C.código: string, A.rut: string, valor: float)
Alumno(rut: string, nombre: string)
¿Cómorepresentarun M.
E/R enun M. Relacional
con agregacion?
Ejemplo: Arrendarun auto
Dirección
desde
categoría
modelo
precio
hasta
disponibilidad
modelo
dirección
categoría
codigo
Auto
Arrendar
Local de
Autos
Persona
desde
nombre
rut
tiene
precio_por_dia
hasta
M. E/R →M. Relacional
Agregación
Auto(categoria: string, modelo: string) as A
LocalDeAutos(codigo: string, direccion: string) as L
Tiene(A.categoría: string, L.código: string, precio_por_dia: int) as T
Persona(rut: string, nombre: string) as P
Arrendar(T.a.categoría: string, T.l.código: string, P.rut, desde: date, hasta: date)
modelo
codigo
categoría
direccion
Auto
Arrendar
Local de
Autos
Persona
desde
nombre rut
tiene
precio_por_dia
hasta
Falta …..
Multiplicidades
Entrega en dirección diferente
Principiosbásicosdel
diseño
Principiosbásicosdel diseño
1. Fidelidadal problema
Producto compra Persona
País Presidente Persona
Las relacionesno tienennada que verentre si
Principiosbásicosdel diseño
4. No complicarmásde lo necesario
¿Quéestámal?
Fechapuedeserunatributodecompra
Principiosbásicosdel diseño
5. Buena elecciónde llaveprimaria.
Al momentode diseñarsiemprequeremosidentificartodaslos
atributosde las entidadesque son candidatosa ser llavede la tabla,
a estosles llamamosnatural key, porqueson columnasque
naturalmentetienenelcomportamientode unallave. Por ejemplode
la siguientetabla:
Usuario(email, rut, username, nombre, tipo, fecha_de_inscripcion)
rut, email y username son posiblesnatural keys.
...peroenla prácticael99% de las veceses mejorusar unacolumna
inventada, sin significadoque sea autogeneradaporelRDBMS. A
estole llamamossurrogate key.
Principiosbásicosdel diseño
Elecciónde llaveprimaria.
Bueno enrealidades algo medio opinionado...
Principiosbásicosdel diseño
Elecciónde llaveprimaria.
Bueno enrealidades algo medio opinionado...
Pero enla prácticalosframeworks de desarrolloweb modernos
esperanunasurrogate key llamadaid comollaveprimariae inclusola
generanpordefecto.
La tablaanterior deberíamosgenerarlaasí:
CREATETABLEusuario(
id SERIAL,
email nombrevarchar(30) UNIQUE NOT NULL,
RUTvarchar(30) UNIQUE NOT NULL,
fechadate,
PRIMARYKEY(id)
)
M. E/R →M. Relacional
Curso(codigo: string, nombre: string)
Evaluación(nombre: string, C.código: string, fecha: date)
CREATETABLEevaluacion(
nombrevarchar(30)NOTNULL,
codigovarchar(30) NOTNULL,
fechadate DEFAULT NOW(),
PRIMARYKEY (nombre, codigo)
FOREIGNKEY(codigo) REFERENCES curso(codigo) ONDELETECASCADE
)
fecha
código
nombr
e
nombre
deEvaluación Curso
¿Que restricciones
vesaquí?
M. E/R →M. Relacional
Curso(codigo: string, nombre: string)
Evaluación(nombre: string, C.código: string, fecha: date)
CREATETABLEevaluacion(
nombrevarchar(30)NOTNULL,
codigovarchar(30) NOTNULL,
fechadate DEFAULT NOW(),
PRIMARYKEY (nombre, codigo)
FOREIGNKEY(codigo) REFERENCES curso(codigo) ONDELETECASCADE
)
No puede ser nulo
Tiene que tener a lo más 30 caracteres
No puede ser nulo
Tiene que ser una fecha, y su valor
por defecto es la fecha actual
La llave son “nombre” y “código”
“codigo” es una llave foránea a la tabla curso
Borrar las tuplas de evaluación que dependan de
un código en la tabla curso que fue eliminado.
fecha
código
nombr
e
nombre
deEvaluación Curso
¿Que restricciones
vesaquí?
Restriccionesde integridad
Integridadde la entidad
Unejemplodetabladeprofesorconalgunas
restricciones:
CREATETABLEProfesor(
idintPRIMARYKEY,
nombrevarchar(30) NOTNULL,
apellidosvarchar(30) NOTNULL,
telefonovarchar(30) NOTNULL,
id_universidadint,
nivelvarchar(20) DEFAULT'Pregrado'
FOREIGNKEY(id_universidad) REFERENCES Universidad(id)
)
Profesor trabaja Universidad
Restriccionesde integridad
Participación
Cadaprofesornecesariamentetrabajaenunaúnica
universidad:
Cadaprofesorpuedetrabajarenunaúnicauniversidad
(peropuedeestarsintrabajo!):
Profesor trabaja Universidad
Profesor trabaja Universidad
Restriccionesde integridad
Participación
Cadaprofesornecesariamentetrabajaenunaúnica
universidad
CREATETABLEProfesor(
idintPRIMARYKEY,
nombrevarchar(30) NOTNULL,
apellidosvarchar(30) NOTNULL,
telefonovarchar(30) NOTNULL,
id_universidadintNOTNULL,
nivelvarchar(20) DEFAULT'Pregrado'
FOREIGNKEY(id_universidad) REFERENCES Universidad(id)
)
Profesor trabaja Universidad