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

Cuando Utilizar relacion muchos a muchos

Estas en el tema de Cuando Utilizar relacion muchos a muchos en el foro de Mysql en Foros del Web. Estoy en un dilema que no logro aclarar aun. No tengo muy claro en que momento debo utilizar relaciones muchos a muchos y uno a ...
  #1 (permalink)  
Antiguo 03/12/2015, 14:10
Avatar de el_cesar  
Fecha de Ingreso: mayo-2001
Ubicación: Cali
Mensajes: 2.423
Antigüedad: 22 años, 9 meses
Puntos: 20
Cuando Utilizar relacion muchos a muchos

Estoy en un dilema que no logro aclarar aun.

No tengo muy claro en que momento debo utilizar relaciones muchos a muchos y uno a muchos, pues cuando creo las relaciones en workbench y exporto la base de datos, al momento de insertar los datos me aparece siempre un error que me dice que no puedo insertar un registro en la tabla hijo sin que exista el registro en la tabla padre.

Un ejemplo para aclararlo es:

Tengo la tambla usuario, y la tabla perfil, segun supongo, un usuario solo puede tener un perfil, para lo cual creo una relación uno a uno, sin embargo, tengo otra tabla que es sucursales, por lo que varios usuarios pueden tener varias sucursales, en este caso la relación que supongo serian muchos a muchos, pero tambien podria pensar que un suauario puede tener varias sucursales, la cuestion es que: de ninguna manera me permite ejecutar el insert con los datos de la tabla usuario, pues me arroja el error que menciono antes, y si creo el insert a usuario y luego a la tabla perfil, tampoco lo permite.

Alguien me puede sugerir un tutorial o un manual donde pueda ver de manera clara como utilizar las relaciones y en que momento utilizar cada una.

Agradezco toda la ayuda.
__________________
Say no more.......
  #2 (permalink)  
Antiguo 03/12/2015, 14:23
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, 7 meses
Puntos: 774
Respuesta: Cuando Utilizar relacion muchos a muchos

cuando usas una relacion uno a muchos ocupas una tabla intermedia digamos el ejemplo usuarios, perfiles, sucursales

usuario
id_usuario nombre id_perfil

perfil
id descripcion

sucursales
id_sucursal nombre

usuarios_sucursales
id_sucursal id_usuario


Ahi tienes la relacion muchos a muchos en usuarios_sucursales en donde la llave primaria seria una llave compuesta por usuario y sucursal, por lo que un usuario puede tener muchas sucursales :)

tus llaves foraneas serian id_sucursal de sucursales e id_usuario de usuarios :)

se entiende?
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 03/12/2015, 14:37
Avatar de el_cesar  
Fecha de Ingreso: mayo-2001
Ubicación: Cali
Mensajes: 2.423
Antigüedad: 22 años, 9 meses
Puntos: 20
Respuesta: Cuando Utilizar relacion muchos a muchos

Si, esa parte la entiendo y es clara para mi, mi duda es referente al momento de intertar los datos, pues siempre me sale el error de "no puede insertar datos en una tabla hijo sin que exista el registro en padre", claro que me has hecho caer en cuenta de una cosa, tal vez estoy utilizando el tipo de relación incorrecta, pues a fin de cuentas deberia ser un usuario tiene un solo perfil (relación uno a uno) un usuario puede tener varias sucursales (uno a muchos), mi pregunta en este caso es:

tabla usuario
Código SQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `consicon_movimientos`.`usuario` (
  2.   `idusuario` INT NOT NULL AUTO_INCREMENT COMMENT '',
  3.   `nombre` VARCHAR(45) NOT NULL COMMENT '',
  4.   `apellidos` VARCHAR(45) NOT NULL COMMENT '',
  5.   `cargo` VARCHAR(45) NOT NULL COMMENT '',
  6.   `email` VARCHAR(45) NOT NULL COMMENT '',
  7.   `celuar` VARCHAR(45) NULL COMMENT '',
  8.   PRIMARY KEY (`idusuario`)  COMMENT '')
  9. ENGINE = InnoDB;

Tabla Perfil
Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `consicon_movimientos`.`perfl_usuario` (
  2.   `idperfl_usuario` INT NOT NULL AUTO_INCREMENT COMMENT '',
  3.   `perfil` VARCHAR(45) NOT NULL COMMENT '',
  4.   `nombreusuario` VARCHAR(45) NOT NULL COMMENT '',
  5.   `contrasena` VARCHAR(45) NOT NULL COMMENT '',
  6.   `creado` DATETIME NULL COMMENT '',
  7.   `usuario_idusuario` INT NOT NULL COMMENT '',
  8.   PRIMARY KEY (`idperfl_usuario`)  COMMENT '',
  9.   INDEX `fk_perfl_usuario_usuario1_idx` (`usuario_idusuario` ASC)  COMMENT '',
  10.   CONSTRAINT `fk_perfl_usuario_usuario1`
  11.     FOREIGN KEY (`usuario_idusuario`)
  12.     REFERENCES `consicon_movimientos`.`usuario` (`idusuario`)

Estas son mis tablas usuario y perfil, supongo que un usuario puede tener solo un perfil, la pregunta es, como debo hacer el insert al momento de crear un usuario nuevo? y como deberia hacer el update cuando por ejemplo quieren cambiar contraseña o eliminar el usuario?
__________________
Say no more.......
  #4 (permalink)  
Antiguo 03/12/2015, 15:22
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, 7 meses
Puntos: 774
Respuesta: Cuando Utilizar relacion muchos a muchos

en tu caso te hace falta la tabla de perfiles, donde tengas el perfil y la descripcion del mismo, asi al momento de insertar el nuevo usuario ya tendras a que perfil corresponde


y en esta tabla podemos quitar varios campos

`nombreusuario` VARCHAR(45) NOT NULL COMMENT '',
`contrasena` VARCHAR(45) NOT NULL COMMENT '',
`creado` DATETIME NULL COMMENT '',


y estos datos agregarlos a la tabla de usuarios

y en la de perfil solo manejar:

`idperfl_usuario` INT NOT NULL AUTO_INCREMENT COMMENT '',
`usuario_idusuario` INT NOT NULL COMMENT '',


Asi te quedaria la tabla de usuarios con lo siguiente:

idusuario` INT NOT NULL AUTO_INCREMENT COMMENT '',
`nombre` VARCHAR(45) NOT NULL COMMENT '',
`apellidos` VARCHAR(45) NOT NULL COMMENT '',
`cargo` VARCHAR(45) NOT NULL COMMENT '',
`email` VARCHAR(45) NOT NULL COMMENT '',
`celuar` VARCHAR(45) NULL COMMENT '',
`nombreusuario` VARCHAR(45) NOT NULL COMMENT '',
`contrasena` VARCHAR(45) NOT NULL COMMENT '',
`creado` DATETIME NULL COMMENT '',


Al momento de hacer el delete o el update tendrias que hacerlo en cascada, primero los hijos y al final los padres :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 03/12/2015, 18:10
Avatar de el_cesar  
Fecha de Ingreso: mayo-2001
Ubicación: Cali
Mensajes: 2.423
Antigüedad: 22 años, 9 meses
Puntos: 20
Respuesta: Cuando Utilizar relacion muchos a muchos

Muchs Gracias Libras voy a probarlo y comento como me fué, aprovecho y te hago una pregunta, segun lo que me dices, el update o delete se debe hacer primero en los hijos y luego en los padres (es decir que debo crear consultas para cada uno?), funciona igual al momento de hacer el insert para crear uno nuevo? (crear primero el hijo y luego el padre con un insert para cada uno?
__________________
Say no more.......
  #6 (permalink)  
Antiguo 03/12/2015, 21:08
Avatar de el_cesar  
Fecha de Ingreso: mayo-2001
Ubicación: Cali
Mensajes: 2.423
Antigüedad: 22 años, 9 meses
Puntos: 20
Respuesta: Cuando Utilizar relacion muchos a muchos

No me ha funcionado:

Siguiendo la recomendación hice lo siguiente:

Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `consicon_movimientos`.`usuario` (
  2.   `idusuario` INT NOT NULL AUTO_INCREMENT COMMENT '',
  3.   `nombre` VARCHAR(45) NOT NULL COMMENT '',
  4.   `apellidos` VARCHAR(45) NOT NULL COMMENT '',
  5.   `cargo` VARCHAR(45) NOT NULL COMMENT '',
  6.   `email` VARCHAR(45) NOT NULL COMMENT '',
  7.   `celuar` VARCHAR(45) NOT NULL COMMENT '',
  8.   `nombreusuario` VARCHAR(45) NOT NULL COMMENT '',
  9.   `contrasena` VARCHAR(45) NOT NULL COMMENT '',
  10.   `creado` DATETIME NULL COMMENT '',
  11.   PRIMARY KEY (`idusuario`)  COMMENT '')

y

Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `consicon_movimientos`.`perfl_usuario` (
  2.   `idperfl_usuario` INT NOT NULL AUTO_INCREMENT COMMENT '',
  3.   `perfil` VARCHAR(45) NOT NULL COMMENT '',
  4.   `usuario_idusuario` INT NOT NULL COMMENT '',
  5.   PRIMARY KEY (`idperfl_usuario`)  COMMENT '',
  6.   INDEX `fk_perfl_usuario_usuario1_idx` (`usuario_idusuario` ASC)  COMMENT '',
  7.   CONSTRAINT `fk_perfl_usuario_usuario1`
  8.     FOREIGN KEY (`usuario_idusuario`)
  9.     REFERENCES `consicon_movimientos`.`usuario` (`idusuario`)

y el insert lo estoy haciendo en php así:

Código PHP:
Ver original
  1. //Primero, insertamos los datos del perfil, que es el hijo y tiene la llave foranea.
  2.  
  3.     $inserta_perfil = "INSERT INTO perfl_usuario (perfil) values ('$perfil')";
  4.     $run_ip = mysql_query($inserta_perfil) or die (mysql_error());
  5.    
  6.     //Segundo Insertamos en la tabla usuario, que es el padre
  7.  
  8.     $inserta_usuario = "INSERT INTO usuario (nombre,apellidos,cargo,email,celuar,nombreusuario,contrasena,creado) values ('$nombres','$apellidos','$cargo','$email','$celular','$user','$pss','$fecha')";
  9.     $run_iu = mysql_query($inserta_usuario) or die ( mysql_error());

Le hice un echo a los insert y me muestra esto:

Código HTML:
Ver original
  1. INSERT INTO perfl_usuario (perfil) values ('0')
  2.  
  3. INSERT INTO usuario (nombre,apellidos,cargo,email,celuar,nombreusuario,contrasena,creado) values ('Cesar Augusto','Jaramillo Contreras','Developer','[email protected]','3215425611','cejarcon','f587695dba25e8b5795fa785fafd9410','2015/12/03 10:05:15')

Segun esto, el insert está bien, sin embargo, el error que me dá es este
Cita:
Cannot add or update a child row: a foreign key constraint fails (`consicon_movimientos`.`perfl_usuario`, CONSTRAINT `fk_perfl_usuario_usuario1` FOREIGN KEY (`usuario_idusuario`) REFERENCES `usuario` (`idusuario`) ON DELETE CASCADE ON UPDATE CASCADE)
Y Efectivamente no me inserta ningun registro.
__________________
Say no more.......
  #7 (permalink)  
Antiguo 03/12/2015, 21:39
Avatar de el_cesar  
Fecha de Ingreso: mayo-2001
Ubicación: Cali
Mensajes: 2.423
Antigüedad: 22 años, 9 meses
Puntos: 20
Respuesta: Cuando Utilizar relacion muchos a muchos

Lo solucioné de la siguiente manera:

el id_usuario, que lo tenía como INT Autoincrement lo nombre cedula (para utilizar el dni de cada usuario como llave primaria) y ahora, en el formulario pregunto ese dato y lo insterto en ambas tablas y funciona bien, no se si es lo correcto pero me funcionó jejeje, ante eso me queda una duda, ¿cual es la importancia entonces de definir las relaciones en el diseño de la base de datos? si, a din de cuentas, al momento de desarrollar el script para innsertar los datos se puede indicar a que tablas va cada registro.
__________________
Say no more.......

Etiquetas: muchos, relacion, tabla, usuarios
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 02:48.