Bodegas
Bodegas
Requisitos
Catálogo de Requisitos
Requisitos de información (RI)
RI-1: Bodega
- Como: Profesor de la asignatura
- Quiero: Poder almacenar la siguiente información de las bodegas: nombre y denominación de origen.
- Para: Que el estudiante realice a partir de este requisito el modelo conceptual, relacional y tecnológico.
RI-2: Vino
- Como: Profesor de la asignatura
- Quiero: Poder almacenar la siguiente información de los vinos: nombre, grados de alcohol y Uvas que lo componen. Los vinos pueden ser de Jóvenes o Crianzas, en función al tiempo que pasen en barrica y botella. Además, para los vinos Crianzas, se debe almacenar las cosechas.
- Para: Que el estudiante realice a partir de este requisito el modelo conceptual, relacional y tecnológico.
RI-3: Uvas
- Como: Profesor de la asignatura
- Quiero: Poder almacenar la siguiente información de las uvas: nombre (Tempranillo, Garnacha, Carbernet Sauvignon, …)
- Para: Que el estudiante realice a partir de este requisito el modelo conceptual, relacional y tecnológico.
RI-4: Cosechas
- Como: Profesor de la asignatura
- Quiero: Poder almacenar la siguiente información de las cosechas: año y calidad (Excelente, Muy buena, Buena, Normal, Mala)
- Para: Que el estudiante realice a partir de este requisito el modelo conceptual, relacional y tecnológico.
Reglas de negocio (RN)
RN-1: Unicidad
- Como: Profesor de la asignatura
- Quiero: Que no se repitan el nombre de las bodegas, vinos o uvas en el sistema
- Para: Que el estudiante practique con restricciones simples.
RN-2: Tiempo de crianza
- Como: Profesor de la asignatura
- Quiero: Que el tiempo de crianza de un vino Crianza sea de al menos 24 meses, de los cuales entre 6 y 12 meses son en barrica y el resto en botella. El vino joven generalmente no pasa tiempo en barrica, o si lo hace, es muy breve (menos de 6 meses)
- Para: Que el estudiante practique con restricciones simples.
RN-3: Graduación alcohólica
- Como: Profesor de la asignatura
- Quiero: Que la graduación alcohólica de un vino suele estar entre los 10 y 15 grados
- Para: Que el estudiante practique con restricciones complejas.
RN-4: Cosechas
- Como: Profesor de la asignatura
- Quiero: Cada vino de crianza tiene como máximo una cosecha por año, y tiene al menos una cosecha
- Para: Que el estudiante practique con restricciones complejas.
Requisitos funcionales (RF)
RF-1: Informes simples de Bodegas
- Como: Profesor de la asignatura
- Quiero: Seleccionar todas las bodegas con denominación de origen Rioja. Listado de vinos con sus uvas. Crianazas con sus cosechas. Mostrar todas las bodegas que producen vinos tanto jóvenes como crianzas. Nombre de las bodegas y vinos que están compuestos, al menos, con uva ‘Tempranillo’. Total de crianzas por cosecha. Nombre del vino joven con más grados
- Para: Que el estudiante practique con consultas simples.
Pruebas de aceptación (PA)
PA-1: Bodegas
- ✅ Crear una nueva bodega con todos los datos correctos según las reglas de negocio
- ❌ Crear una nueva bodega sin nombre.
- ❌ Crear una nueva bodega con el nombre repetido.
- ❌ Crear una nueva bodega sin denominación de origen.
PA-2: Vinos
- ✅ Crear un nuevo vino Joven con todos los datos correctos según las reglas de negocio
- ✅ Crear un nuevo vino Crianza con todos los datos correctos según las reglas de negocio
- ❌ Crear un nuevo vino Joven sin nombre.
- ❌ Crear un nuevo vino Crianza sin nombre.
- ❌ Crear un nuevo vino Joven con el nombre repetido.
- ❌ Crear un nuevo vino Crianza con el nombre repetido.
- ❌ Crear un nuevo vino Joven sin grados de alcohol.
- ❌ Crear un nuevo vino Crianza sin grados de alcohol.
- ❌ Crear un nuevo vino Joven con graduación incorrecta.
- ❌ Crear un nuevo vino Crianza con graduación incorrecta.
- ❌ Crear un nuevo vino Joven sin bodega.
- ❌ Crear un nuevo vino Crianza sin bodega.
Modelo Conceptual
Modelo conceptual
Diagrama de clases

Posible extensión
- Jerarquía extendida: Vino se especializa en Joven, Crianza y Reserva {completa, disjunta}.
- Reserva compone 0..* Valoración (ranking: TipoRanking, puntuación 0..100); no puede haber dos valoraciones del mismo ranking para un mismo vino (RN‑6).
- Se mantienen Bodega–Vino (1..), Crianza–Cosecha (1..), y Vino–Uva (M:N) como en el modelo base.
- RN‑5: Reserva 36 meses (12–24 en barrica; resto en botella). Además, se mantienen RN‑1..RN‑4.

Modelo Relacional (v1)
Modelo relacional
Versión 1: Una relación para cada clase de la jerarquía
Intensión
Bodegas(bodegaId, nombre, denominaciónOrigen)
PK(bodegaId)
AK(nombre)
Vinos(vinoId, bodegaId, nombre, grados)
PK(vinoId)
FK(bodegaId) / Bodegas
AK(nombre)
Jóvenes(vinoId, tiempoBarrica, tiempoBotella)
PK(vinoId)
FK(vinoId) / Vinos
Crianzas(vinoId, tiempoBarrica, tiempoBotella)
PK(vinoId)
FK(vinoId) / Vinos
Uvas(uvaId, nombre)
PK(uvaId)
AK(nombre)
Cosechas(cosechaId, crianzaId, año, calidad)
PK(cosechaId)
FK(crianzaId) / Crianzas
AK(cosechaId, crianzaId, año)
VinosUvas(vinoUvaId, vinoId, uvaId)
PK(vinoUvaId)
FK(vinoId) / Vinos
FK(uvaId) / Uvas
AK(vinoId, uvaId)
Extensión
Bodegas = {
(b1, "Bodegas El Sol", "Rioja"),
(b2, "Bodegas La Luna", "Ribera del Duero")
}
Vinos = {
(v1, b1, "Vino Blanco Joven", 12),
(v2, b2, "Vino Tinto Joven", 13),
(v3, b1, "Vino Crianza Especial", 14),
(v4, b2, "Vino Crianza Reserva", 13.5)
}
Jóvenes = { (v1, 0, 6), (v2, 0, 12) }
Crianzas = { (v3, 6, 18), (v4, 12, 12) }
Uvas = {
(u1, "Tempranillo"),
(u2, "Garnacha"),
(u3, "Albarino")
}
Cosechas = {
(c1, v3, 2020, "Excelente"),
(c2, v3, 2019, "Buena"),
(c3, v4, 2018, "Muy buena")
}
VinosUvas = {
(vu1, v1, u3),
(vu2, v2, u1),
(vu3, v3, u2),
(vu4, v3, u1),
(vu5, v4, u2),
(vu6, v4, u1)
}
Álgebra relacional
-Renombrado:
\[B = \Ren{B(bid,nb,do)}(Bodegas)\] \[V = \Ren{V(vid,bid,nv,g)}(Vinos)\] \[J = \Ren{J(vid,tba,tbo)}(Jóvenes)\] \[C = \Ren{C(vid,tba,tbo)}(Crianzas)\] \[U = \Ren{U(uid,nu)}(Uvas)\] \[Co = \Ren{Co(coid,vid,a,c)}(Cosechas)\] \[VU = \Ren{VU(vuid,vid,uid)}(VinosUvas)\]- Seleccionar todas las bodegas con denominación de origen Rioja:
- Listado de vinos con sus uvas:
La intensión de la relación derivada VVUU sería la unión de los conjuntos de atributos de las relaciones V, VU y U:
Intensión(VVUU) = {vid, bid, nv, g, vuid, uid, nu}
La extensión de VVUU quedaría con las siguientes tuplas:
Extensión(VVUU) = {
(1, 1, "Vino Blanco Joven", 12, 1, 3, "Albarino"),
(2, 2, "Vino Tinto Joven", 13, 2, 1, "Tempranillo"),
(3, 1, "Vino Crianza Especial", 14, 4, 2, "Garnacha"),
(3, 1, "Vino Crianza Especial", 14, 5, 1, "Tempranillo"),
(4, 2, "Vino Crianza Reserva", 13.5, 6, 2, "Garnacha"),
(4, 2, "Vino Crianza Reserva", 13.5, 7, 1, "Tempranillo")
}
- Crianzas con sus cosechas:
En este caso, la intensión de la relación derivada CCo sería la unión de los conjuntos de atributos de las relaciones C y Co, y la extensión tendría las siguientes tuplas:
Intensión(CCo) = {vid, bid, nv, g, coid, a, c}
Extensión(CCo) = {
(3, 1, "Vino Crianza Especial", 14, 1, 2020, "Excelente"),
(3, 1, "Vino Crianza Especial", 14, 2, 2019, "Buena"),
(4, 2, "Vino Crianza Reserva", 13.5, 3, 2018, "Muy buena")
}
- Mostrar todas las bodegas que producen vinos tanto jóvenes como crianzas:
- Nombre de las bodegas y vinos que están compuestos, al menos, con uva “Tempranillo”:
- Total de cosechas por vino de crianza:
- Nombre del vino joven con más grados:
- Número de vinos crianza por cosecha:
- Bodegas con más vinos:
- Vinos que tienen, al menos, las mismas uvas que el vino ‘v1’:
Versión 2: Una relación para cada subclase
Intensión
Bodegas(bodegaId, nombre, denominaciónOrigen)
PK(bodegaId)
AK(nombre)
Jóvenes(jovenId, bodegaId, nombre, grados, tiempoBarrica, tiempoBotella)
PK(jovenId)
FK(bodegaId) / Bodegas
AK(nombre)
Crianzas(crianzaId, bodegaId, nombre, grados, tiempoBarrica, tiempoBotella)
PK(crianzaId)
FK(bodegaId) / Bodegas
AK(nombre)
Uvas(uvaId, nombre)
PK(uvaId)
AK(nombre)
Cosechas(cosechaId, crianzaId, año, calidad)
PK(cosechaId)
FK(crianzaId) / Crianzas
AK(cosechaId, crianzaId, año)
VinosUvas(vinoUvaId, jovenId*, crianzaId*, uvaId)
PK(vinoUvaId)
FK(jovenId) / Jóvenes
FK(crianzaId) / Crianzas
FK(uvaId) / Uvas
AK(jovenId, uvaId)
AK(crianzaId, uvaId)
* Restricción: jovenId y crianzaId deben ser disjuntos.
Extensión
Bodegas = {
(b1, "Bodegas El Sol", "Rioja"),
(b2, "Bodegas La Luna", "Ribera del Duero")
}
Jóvenes = {
(j1, b1, "Vino Blanco Joven", 12, 6, 0),
(j2, b2, "Vino Tinto Joven", 13, 0, 12),
}
Crianzas = {
(c1, b1, "Vino Crianza Especial", 14, 6, 18),
(c2, b2, "Vino Crianza Reserva", 13.5, 12, 12)
}
Uvas = {
(u1, "Tempranillo"),
(u2, "Garnacha"),
(u3, "Albarino")
}
Cosechas = {
(co1, c1, 2020, "Excelente"),
(co2, c1, 2019, "Buena"),
(co3, c2, 2018, "Muy buena")
}
VinosUvas = {
(vu1, j1, null, u3),
(vu2, j2, null, u1),
(vu3, null, c1, u2),
(vu4, null, c1, u1),
(vu5, null, c2, u2),
(vu6, null, c2, u1)
}
Modelo Relacional (v2)
Modelo relacional
Versión 2: Una relación para cada subclase
Intensión
Bodegas(bodegaId, nombre, denominaciónOrigen)
PK(bodegaId)
AK(nombre)
Jóvenes(jovenId, bodegaId, nombre, grados, tiempoBarrica, tiempoBotella)
PK(jovenId)
FK(bodegaId) / Bodegas
AK(nombre)
Crianzas(crianzaId, bodegaId, nombre, grados, tiempoBarrica, tiempoBotella)
PK(crianzaId)
FK(bodegaId) / Bodegas
AK(nombre)
Uvas(uvaId, nombre)
PK(uvaId)
AK(nombre)
Cosechas(cosechaId, crianzaId, año, calidad)
PK(cosechaId)
FK(crianzaId) / Crianzas
AK(cosechaId, crianzaId, año)
VinosUvas(vinoUvaId, jovenId*, crianzaId*, uvaId)
PK(vinoUvaId)
FK(jovenId) / Jóvenes
FK(crianzaId) / Crianzas
FK(uvaId) / Uvas
AK(jovenId, uvaId)
AK(crianzaId, uvaId)
* Restricción: jovenId y crianzaId deben ser disjuntos.
Extensión
Bodegas = {
(b1, "Bodegas El Sol", "Rioja"),
(b2, "Bodegas La Luna", "Ribera del Duero")
}
Jóvenes = {
(j1, b1, "Vino Blanco Joven", 12, 6, 0),
(j2, b2, "Vino Tinto Joven", 13, 0, 12),
}
Crianzas = {
(c1, b1, "Vino Crianza Especial", 14, 6, 18),
(c2, b2, "Vino Crianza Reserva", 13.5, 12, 12)
}
Uvas = {
(u1, "Tempranillo"),
(u2, "Garnacha"),
(u3, "Albarino")
}
Cosechas = {
(co1, c1, 2020, "Excelente"),
(co2, c1, 2019, "Buena"),
(co3, c2, 2018, "Muy buena")
}
VinosUvas = {
(vu1, j1, null, u3),
(vu2, j2, null, u1),
(vu3, null, c1, u2),
(vu4, null, c1, u1),
(vu5, null, c2, u2),
(vu6, null, c2, u1)
}
Modelo Tecnológico (v1)
Modelo tecnológico. Versión 1: Una relación para cada clase de la jerarquía
Script SQL para crear la base de datos
Script SQL para la carga inicial de datos
Consultas
Modelo Tecnológico (v2)
Modelo tecnológico. Versión 2: Una relación para cada subclase
Script SQL para crear la base de datos
Script SQL para la carga inicial de datos
Consultas
SQL Avanzado
Realice un disparador que compruebe que en la tabla VinosUvas no se insertan tuplas con valores para jovenId y crianzaId simultáneamente: