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

ayuda con relacion ternaria o binaria

Estas en el tema de ayuda con relacion ternaria o binaria en el foro de Mysql en Foros del Web. caja id_caja nombre_caja caja x1 , caja x2 descripcion_caja descripcion color id_color color_caja negro,naranja,rojo,verde unidad id_unidad unidad_caja 4,9,25,36 caja x1 descripcion 4 negro,naranja,rojo,verde caja x1 ...
  #1 (permalink)  
Antiguo 22/11/2010, 04:23
 
Fecha de Ingreso: febrero-2009
Mensajes: 443
Antigüedad: 15 años, 2 meses
Puntos: 1
ayuda con relacion ternaria o binaria

caja
id_caja
nombre_caja caja x1 , caja x2
descripcion_caja descripcion

color
id_color
color_caja negro,naranja,rojo,verde


unidad
id_unidad
unidad_caja 4,9,25,36


caja x1 descripcion 4 negro,naranja,rojo,verde
caja x1 descripcio 9 negro,naranja,rojo,verde
caja x1 descripcion 25 negro,naranja,rojo,verde
caja x1 descripcion 36 negro,naranja,rojo,verde

tengo redundancia de datos nombre_caja i descripcion_caja algunas vece pude que
se repitan

es mejor hacer una relacion M:N entre unidad i color i en la tabla unidad_color meter el nombre i descripcion

o crear una relacion ternacio M:N:R entre caja color i unidad


Código MySQL:
Ver original
  1. CREATE TABLE caja_color_unidad
  2. (
  3.     id_caja INT UNSIGNED NOT NULL,
  4.     id_color INT UNSIGNED NOT NULL,
  5.     id_unidad INT UNSIGNED NOT NULL,
  6.     CONSTRAINT pk_caja_color_unidad PRIMARY KEY (id_caja,id_color,id_unidad),
  7.     CONSTRAINT fk_caja_color_unidad_id_caja FOREIGN KEY (id_caja) REFERENCES caja(id_caja),
  8.     CONSTRAINT fk_caja_color_unidad_id_color FOREIGN KEY (id_color) REFERENCES caja(id_color),
  9.     CONSTRAINT fk_caja_color_unidad_id_unidad FOREIGN KEY (id_unidad) REFERENCES caja(id_unidad)

Código MySQL:
Ver original
  1. INSERT INTO caja_color_unidad (id_caja,id_color,id_unidad) VALUES ('1','1','4');
  2. INSERT INTO caja_color_unidad (id_caja,id_color,id_unidad) VALUES ('2','2','4');
  3. INSERT INTO caja_color_unidad (id_caja,id_color,id_unidad) VALUES ('3','3','4');
  4. INSERT INTO caja_color_unidad (id_caja,id_color,id_unidad) VALUES ('4','4','4');
  5.  
  6. INSERT INTO caja_color_unidad (id_caja,id_color,id_unidad) VALUES ('5','1','9');
  7. INSERT INTO caja_color_unidad (id_caja,id_color,id_unidad) VALUES ('6','2','9');
  8. INSERT INTO caja_color_unidad (id_caja,id_color,id_unidad) VALUES ('7','3','9');
  9. INSERT INTO caja_color_unidad (id_caja,id_color,id_unidad) VALUES ('8','4','9');
  10.  
  11. INSERT INTO caja_color_unidad (id_caja,id_color,id_unidad) VALUES ('9','1','25');
  12. INSERT INTO caja_color_unidad (id_caja,id_color,id_unidad) VALUES ('10','2','25');
  13. INSERT INTO caja_color_unidad (id_caja,id_color,id_unidad) VALUES ('11','3','25');
  14. INSERT INTO caja_color_unidad (id_caja,id_color,id_unidad) VALUES ('12','4','25');
  15.  
  16. INSERT INTO caja_color_unidad (id_caja,id_color,id_unitat) VALUES ('13','1','36');
  17. INSERT INTO caja_color_unidad (id_caja,id_color,id_unitat) VALUES ('14','2','36');
  18. INSERT INTO caja_color_unidad (id_caja,id_color,id_unitat) VALUES ('15','3','36');
  19. INSERT INTO caja_color_unidad (id_caja,id_color,id_unitat) VALUES ('16','4','36');

me sale el siguiente error

Código MySQL:
Ver original
  1. ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`caja`.`caja_color_unidad`, CONSTRAINT `caja_color_unidad_ibfk_3` FOREIGN KEY (`id_unidad`) REFERENCES `unidad` (`id_unidad`))

Última edición por albertrc; 22/11/2010 a las 04:30
  #2 (permalink)  
Antiguo 22/11/2010, 07:11
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: ayuda con relacion ternaria o binaria

El problema es bastante simple: No puedes ingresar al menos uno de los registros porque sus valores no respetan la restricción de FK definida sobre ellos. Esto significa que el valor en ese campo no existe en la tabla referida.
Mi mayor duda consiste en que estás definiendo tres FK que hacen referencia a tres campos diferentes de la misma tabla, cosa que resulta irregular porque una FK sólo debe referirse a una PK... y no puede haber tres PK diferentes en la misma tabla.
La única salvedad que existe en MySQL es que ese campo sea un campo UNIQUE, que en definitiva es una clave candidata.

¿Podrías explicar eso?
__________________
¿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 22/11/2010, 09:20
 
Fecha de Ingreso: febrero-2009
Mensajes: 443
Antigüedad: 15 años, 2 meses
Puntos: 1
Respuesta: ayuda con relacion ternaria o binaria

si la tabla fuere ternaria

tendría que repetir el campo id_caja

como tendría que ir pues la ternaria
así serian de M:N tendría el campo id_caja repetido
id_caja id_color id_caja id_unidad

antes hacia las relaciones en el word de openoffice
por escrito
pero ahora lo hago con workbenk


tengo 15 tablas pero con 3 ya tengo problemas

primero are todas las relaciones y después are pruebas con 3 o 4 tablas
antes, cuando estas vaya bien con 3 o 4 mas
y después todas a la vez

he visto que cuando es ternaria hacen una cuarta tabla para que la relación sea
1:1 1:N o M:N entre las 4 tablas
así resulta mas fácil abajar con la base de datos

el problema en si no es insertar datos sino diseñar la base de datos correctamente
  #4 (permalink)  
Antiguo 22/11/2010, 16:07
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: ayuda con relacion ternaria o binaria

Cita:
si la tabla fuere ternaria

tendría que repetir el campo id_caja

como tendría que ir pues la ternaria
así serian de M:N tendría el campo id_caja repetido
id_caja id_color id_caja id_unidad
Damos por entendido esto:

- Las relaciones ternarias no son conceptos del modelo físico de datos sino del modelo lógico. Esto implica que en el modelo lógico se representan abstracciones del mundo real. No puedes pasar de la abstracción a las tablas en una relación 1:1. No son equivalentes, sino que deben someterse a un proceso de transformación.

- Toda relación M:N determina la existencia de una tabla nueva (que no existe en el modelo lógico como entidad) que determina la relación. Debe contener como PK, la PK de las dos tablas relacionadas.

- Si tienes una relación entre tres entidades (ternaria), y la relación es N:N;N, esa relación se transforma también en una tabla nueva que represente la relación y contenga las PK de las tablas. En ella las PK de las tres son la PK de la tabla.

- En las ternarias de clase 1:1:1, o 1:1:N se debe analizar la lógica de la relación para saber qué claves migran a cuales tablas.

- Lo que es admisible, luego del proceso de normalización de bases de datos (que aún no has enfrentado, asumo).

Lo que no tiene ningún sentido es que esté sucediendo esto:
Código SQL:
Ver original
  1. CONSTRAINT fk_caja_color_unidad_id_caja
  2.      FOREIGN KEY (id_caja) REFERENCES caja(id_caja),
  3. CONSTRAINT fk_caja_color_unidad_id_color
  4.      FOREIGN KEY (id_color) REFERENCES caja(id_color),
  5. CONSTRAINT fk_caja_color_unidad_id_unidad
  6.      FOREIGN KEY (id_unidad) REFERENCES caja(id_unidad)

Porque la tabla caja, o tiene por PK id_caja, o la PK es id_color, o lo es id_unidad.
Si lo que quieres manejar es una clave de tres campos, entonces esa tabla está mal definida (dos de los campos son UNIQUE), y esta tabla en cuestión tiene mal definida las FK, porque si es un a PK de tres campos debería decir:
Código SQL:
Ver original
  1. CONSTRAINT fk_caja_color_unidad_PK
  2.      FOREIGN KEY (id_caja) REFERENCES caja(id_caja, id_color, id_unidad)

¿Se comprende lo que digo?

Aclarame ese detalle.

Cita:
el problema en si no es insertar datos sino diseñar la base de datos correctamente
Craso error: Si diseñas bien y entras los datos sin respetar las restricciones, el problema es tan grave como diseñar mal, porque significa que no estás entendiendo el concepto de restricciones de clave foránea.


¿Quince tablas y tienes problemas de lógica?

Eso es una nimiedad. Espera que tengas que enfrentar bases de datos de más de 50 tablas y hablamos.

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

Etiquetas: relacion
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 17:12.