Ver Mensaje Individual
  #9 (permalink)  
Antiguo 03/06/2016, 06:35
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: diseño fisico bd

Bueno, mira, por lo pronto, como ya te he dicho, es dificil resolver un ejercicio de este tipo si no se cuenta con una descripcion al menos de lo que representa.
Pareciera representar los recorridos de un sistema de transporte interurbano, o bien una carrera automovilística de estilo rally, que recorre varias ciudades.

En cualquier caso, si observamos el diagrama que te dieron se pueden deducir algunas coas...
1) La tabla base es Etapas.
2) La tabla dependiente es Recorridos.
3) Caminos y Localidades son tablas autónomas, que no apuntan a ninguna otra, pero son FK en las otras tablas.

En esencia, las tablas de Caminos y Localidades tablas se definirían así:

Código MySQL:
Ver original
  1. CREATE TABLE caminos (
  2.     nombre VARCHAR(30)PRIMARY KEY ,
  3.     km DECIMAL(5 , 1 )
  4. );
  5.  
  6. CREATE TABLE localidades (
  7.     nombre VARCHAR(30) PRIMARY KEY,
  8.     provincia VARCHAR(30),
  9.     comunidad VARCHAR(30)
  10. );

Como te dije, esas tablas NO poseen ninguna FK.

Por su lado, la tabla Recorridos tiene una partede la PK apuntando a Caminos. y la otra a Localidades.
Hay que tener cuidado con la de la FK, porque el nombre del campo origen es diferente.
Código MySQL:
Ver original
  1. CREATE TABLE recorridos (
  2.     nombre VARCHAR(30),
  3.     numero VARCHAR(3),
  4.     localidad VARCHAR(30),
  5.     PRIMARY KEY (nombre , numero),
  6.     CONSTRAINT fk_localidad FOREIGN KEY (localidad)
  7.         REFERENCES localidades (nombre),
  8.     CONSTRAINT fk_camino FOREIGN KEY (nombre)
  9.         REFERENCES caminos (nombre)
  10. );

La cuarta tabla es parecida a la tercera en cuanto a la relacion de las FK, pero NO EN LA PK.
Esta tabla debe apuntar a la PK de la tercera tabla, y son sólo los campos de salida y llegada los que apuntan a Localidades y Caminos:

Código MySQL:
Ver original
  1. CREATE TABLE etapas (
  2.     nombre VARCHAR(30),
  3.     numero VARCHAR(3),
  4.     km DECIMAL(3 , 1 ),
  5.     tiempo TIME,
  6.     salida VARCHAR(30),
  7.     llegada VARCHAR(30),
  8.     PRIMARY KEY (nombre , numero),
  9.     CONSTRAINT fk_recorridos FOREIGN KEY (nombre, numero)
  10.         REFERENCES recorridos  (nombre, numero),
  11.     CONSTRAINT fk_localidad_salida FOREIGN KEY (salida)
  12.         REFERENCES localidades (nombre),
  13.     CONSTRAINT fk_localidad_llegada FOREIGN KEY (llegada)
  14.         REFERENCES localidades (nombre)
  15. );

El script completo sería:

Código MySQL:
Ver original
  1. CREATE DATABASE IF NOT EXISTS repaso;
  2. USE repaso;
  3. DROP TABLE IF EXISTS recorridos;
  4. DROP TABLE IF EXISTS caminos;
  5. DROP TABLE IF EXISTS localidades;
  6.  
  7. CREATE TABLE caminos (
  8.     nombre VARCHAR(30)PRIMARY KEY ,
  9.     km DECIMAL(5 , 1 )
  10. );
  11.  
  12. CREATE TABLE localidades (
  13.     nombre VARCHAR(30) PRIMARY KEY,
  14.     provincia VARCHAR(30),
  15.     comunidad VARCHAR(30)
  16. );
  17.  
  18. CREATE TABLE recorridos (
  19.     nombre VARCHAR(30),
  20.     numero VARCHAR(3),
  21.     localidad VARCHAR(30),
  22.     PRIMARY KEY (nombre , numero),
  23.     CONSTRAINT fk_localidad FOREIGN KEY (localidad)
  24.         REFERENCES localidades (nombre),
  25.     CONSTRAINT fk_camino FOREIGN KEY (nombre)
  26.         REFERENCES caminos (nombre)
  27. );
  28. CREATE TABLE etapas (
  29.     nombre VARCHAR(30),
  30.     numero VARCHAR(3),
  31.     km DECIMAL(3 , 1 ),
  32.     tiempo TIME,
  33.     salida VARCHAR(30),
  34.     llegada VARCHAR(30),
  35.     PRIMARY KEY (nombre , numero),
  36.     CONSTRAINT fk_recorridos FOREIGN KEY (nombre, numero)
  37.         REFERENCES recorridos  (nombre, numero),
  38.     CONSTRAINT fk_localidad_salida FOREIGN KEY (salida)
  39.         REFERENCES localidades (nombre),
  40.     CONSTRAINT fk_localidad_llegada FOREIGN KEY (llegada)
  41.         REFERENCES localidades (nombre)
  42. );

Algunas observaciones:
- AL existir FK, existe un orden de inserciones de datos (el mismo orden en que las tablas se crean), y un orden de borrado (el orden exactamente inverso al de creación de las tablas).
- Los datos de tipo DECIMAL tienen un formato específico. El que indica el gráfico no permite recorridos de más de 99,9 Km, porque un espacio de la longitud está ocupado por el punto decimal. Leer el manual de referencia, por favor.
- Los valores numéricos no deben usarse con VARCHAR. Estos producen errores gravisimos en las consultas.
- Las unidades de tiempo en horas se ponen en campos TIME. De lo contrario no se administran correctmente las consultas.

Espero que esto te sirva.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)