Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

[SOLUCIONADO] diseño fisico bd

Estas en el tema de diseño fisico bd en el foro de Mysql en Foros del Web. Tengo que crear esta bd , pero nada mas empezar , ya empiezan los errores ... Código: create or replace table caminos ( nombre varchar(30), ...
  #1 (permalink)  
Antiguo 02/06/2016, 11:32
 
Fecha de Ingreso: mayo-2015
Ubicación: Vigo
Mensajes: 20
Antigüedad: 8 años, 10 meses
Puntos: 0
De acuerdo diseño fisico bd




Tengo que crear esta bd , pero nada mas empezar , ya empiezan los errores ...

Código:
create or replace table caminos
(
nombre varchar(30),
km dec(4,1),
primary key (nombre),
constraint fk_camino foreign key (nombre) references
recorridos (nombre),
constraint fk_caminos foreign key (nombre) references
etapas (nombre)
);
Código:
ERROR 1005 (HY000): Can't create table `repaso`.`caminos` (errno: 150 "Foreign key constraint is incorrectly formed") 
MariaDB [repaso]>
He probado cambiando el nombre de fk_ con varias combinaciones y posiciones y no hay manera
  #2 (permalink)  
Antiguo 02/06/2016, 12:09
Avatar de 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, 4 meses
Puntos: 2658
Respuesta: diseño fisico bd

Si tienes una PK compuesta de más de una columna, la FK debe tener la misma cantidad de columnas, del mismo tipo y en el mismo orden.
Es obligatorio, porque una FK no puede apuntar hacia una parte de la PK, sino a la PK completa...

Por otro lado, tu podemo adolece ed un problema: Es una relación circular, y eso genera una dependencia de cumplimiento imposible.
Describe exactamente como es la relacion que intentas crear, para poder decirte con certeza donde está mal.

¿Los recorridos de qué son? ¿Vehiculos? ¿Personas?
¿las etapas son de alguna carrera?
¿Que relacion tiene las localidades con el camino y las etapas.

No queda claro qué estás representando, pero se ve que no está correctamente diseñado.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 02/06/2016, 12:20
 
Fecha de Ingreso: mayo-2015
Ubicación: Vigo
Mensajes: 20
Antigüedad: 8 años, 10 meses
Puntos: 0
Respuesta: diseño fisico bd

Pues entonces según tu criterio esas tablas , están mal ? Te puedo pasar todo el código que tengo sí es lo que me preguntas , para ayudarme mejor

Gracias por tu rápida respuesta
  #4 (permalink)  
Antiguo 02/06/2016, 12:52
Avatar de 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, 4 meses
Puntos: 2658
Respuesta: diseño fisico bd

No te voy a corregir el código. Mi intención es explicarte como debería diseñarse ese esquema., Pero para eso necesito que respondas las preguntas que te hice
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 02/06/2016, 13:27
 
Fecha de Ingreso: mayo-2015
Ubicación: Vigo
Mensajes: 20
Antigüedad: 8 años, 10 meses
Puntos: 0
Respuesta: diseño fisico bd

Me parece , esta habiendo un mal entendido , lo que hay en la IMAGEN , lo ha puesto un PROFESOR de bases de datos , del instituto al que voy , por eso yo tampoco entiendo lo que tu me preguntas , yo tengo que realizar ese diseño mediante código , y ya lo tengo hecho , aquí esta

Código MySQL:
Ver original
  1. create database if not exists repaso;
  2. use repaso;
  3.  
  4. (
  5. nombre varchar(30),
  6. km dec(4,1),
  7. primary key (nombre),
  8. constraint fk_caminos foreign key (nombre) references
  9. recorridos (nombre),
  10. constraint fk_camino foreign key (nombre) references
  11. etapas (nombre)
  12. );
  13.  
  14. create or replace table localidades
  15. (nombre varchar(30) primary key,
  16. provincia varchar(30),
  17. comunidad varchar(30),
  18. constraint fk_localidades foreign key(localidad) references,
  19. recorridos (localidad) and fk_caminos1 (nombre) references,
  20. etapas (salida,llegada)
  21. );
  22.  
  23. (nombre varchar(30),
  24. numero varchar(3),
  25. km dec(3,1),
  26. tiempo int(horas),
  27. salida varchar(30) = localidad,
  28. llegada varchar(30) = localidad,
  29. primary key (nombre,numero)
  30. );
  31.  
  32. create or replace table recorridos
  33. (nombre varchar(30),
  34. numero varchar(3),
  35. localidad varchar(30),
  36. primary key (nombre,numero)
  37. );

Y como digo al ingresar la primera tabla , ya empieza a darme error , no he probado el resto
  #6 (permalink)  
Antiguo 02/06/2016, 13:36
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: diseño fisico bd

Como bien te dijeron aqui no vas a poder hacer la relacio porq esta se tiene q hacer con las 2 llaves q conforman la llave primaria de tus tablas(etapas y recorridos) en tu caso nombre y numero.
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #7 (permalink)  
Antiguo 02/06/2016, 13:42
Avatar de 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, 4 meses
Puntos: 2658
Respuesta: diseño fisico bd

Bueno, desde el vamos, si eso te lo dio un profesor en la universidad, es una trampa cazabobos... cosa que no me extrañaría porque tuve dos en Base de Datos I de la UNIMOROn que hacían eso..
SI sólo te dieron el diagrama, sin las reglas de negocio, entonces tendrás que hacer algunas inferencias.

Por lo pronto, es IMPOSIBLE indicar una FK cuando no existe la tabla refernciada, y al moment de ejecutarse ese primer CREATE, las tablas Etapas y Recorridos AUN NO EXISTEN.

¿Queda claro eso?

En segundo lugar, en esa primera tabla intentas apuntar un sólo campo como FK de Recorridos, por ejemplo. Pero esa tabla tiene una PK COMPUESTA, la PK tiene DOS campos, y por ende la FK que apunte a ella debe si o si tener DOS campos también, del mismo tipo de dato y en el mismo orden.
Y no tienes los capos necesarios.

¿Se va entendiendo?

Finalmente, estás omitiendo lo principal: Dependencia de integridad referencial.

Una FK protege la itegridad referencial entre las tablas, lo que significa que cuando ingrese un registro en Caminos, los valores a asignar en"nombre" y el campo faltante tienen que existir previamente en Etapas y Recorridos.
Pero en esas tablas, como apuntan a Caminos, no se puede ingresar datos que no existan PREVIAMENTE en la primera tabla.

¿Queda claro?

Bueno, eso se denomina "dependencia circular", y es una condición de cumplimiento IMPOSIBLE en una base de datos relacional.

Para que ingrese A, debe existir B, y para que ingrese B, debe existir A.

No hay forma en que eso se pueda hacer. Cualquier ingreso te disparará un error de integridad referencial.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 02/06/2016, 16:17
 
Fecha de Ingreso: mayo-2015
Ubicación: Vigo
Mensajes: 20
Antigüedad: 8 años, 10 meses
Puntos: 0
Respuesta: diseño fisico bd

Pues eso será lo que soy un bobo , entiendo esto según lo que indicáis , pero no funciona otra cosa he pensado es en no poner foreing key de la tabla de la derecha , ya que la flecha indica la clave compuesta de la izquierda , pero no me da para más ....

Código MySQL:
Ver original
  1. (
  2. nombre varchar(30),
  3. km dec(4,1),
  4. primary key (nombre),
  5. constraint fk_caminos foreign key (nombre,numero) references
  6. recorridos (nombre,numero),
  7. constraint fk_camino foreign key (nombre,numero) references
  8. etapas (nombre,numero)
  9. );
  #9 (permalink)  
Antiguo 03/06/2016, 06:35
Avatar de 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, 4 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)
  #10 (permalink)  
Antiguo 03/06/2016, 06:53
 
Fecha de Ingreso: mayo-2015
Ubicación: Vigo
Mensajes: 20
Antigüedad: 8 años, 10 meses
Puntos: 0
Respuesta: diseño fisico bd

Vale gracias maestro , en un rato me pongo a machacar y voy diciendo , la Base de Datos hace referencia a una vuelta ciclista
  #11 (permalink)  
Antiguo 03/06/2016, 11:51
 
Fecha de Ingreso: mayo-2015
Ubicación: Vigo
Mensajes: 20
Antigüedad: 8 años, 10 meses
Puntos: 0
Respuesta: diseño fisico bd



Gonazlo pero el diseño tuyo , no es como el de mi foto , entonces supongo no podré hacer los ejercicios que tengo que hacer

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:46.