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

relacion n:m

Estas en el tema de relacion n:m en el foro de Mysql en Foros del Web. Hola amigos, hace rato que sigo con un proyecto que le doy las mil vueltas por todos lados, por que es my dream , asi ...
  #1 (permalink)  
Antiguo 28/03/2011, 23:18
Avatar de memoadian
Colaborador
 
Fecha de Ingreso: junio-2009
Ubicación: <?php echo 'México'?>
Mensajes: 3.696
Antigüedad: 15 años, 4 meses
Puntos: 641
relacion n:m

Hola amigos, hace rato que sigo con un proyecto que le doy las mil vueltas por todos lados, por que es my dream , asi que espero sean pacientes conmigo, estaba leyendo sobre normalización, de bases de datos y verifique mis tablas y me dicuenta de sendos errores, por qui alguien me dijo lo de las relaciones n:m que van en tablas aparte y yo tengo dos tablas asi:

libro

id
nombre
alias
imagen
sinopsis
volumenes
fecha_edicion

antes tenia paginas pero según la normalizacion los campos deben ser atomicos etc. etc.

editorial

id
nombre
acronimo
alias //los alias los uso para los links amigables
portada //esto me indica un valor true o false

la relacion de estas dos tablas es n:m ya que un libro puede ser editado por varias editoriales y una editorial puede tener muchos libros

la maner de asociar estas dos tablas ¿es asi?

libro | editorial
20,000 leguas de... | gomez editores
20,000 leguas de... | juana de arco
las mil y una noch... | juana de arco

por que la verdad creo no lo capto muy bien, malditas bases de datos no se me dan.

y antes de seguir quiero tener como toda buena construccion, unas buenas "bases" :P

gracias si leiste todo este choro
  #2 (permalink)  
Antiguo 29/03/2011, 01:20
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 9 meses
Puntos: 89
Respuesta: relacion n:m

Tienes que hacer una tabla que relacione la dos tablas que tienes donde esté el ID de ambas.
  #3 (permalink)  
Antiguo 29/03/2011, 07:46
Avatar de memoadian
Colaborador
 
Fecha de Ingreso: junio-2009
Ubicación: <?php echo 'México'?>
Mensajes: 3.696
Antigüedad: 15 años, 4 meses
Puntos: 641
Respuesta: relacion n:m

entiendo, ok
pero pues que no es lo mismo si pongo cualquier pk?
obvio hay una diferencia de espacio usado. gracias por responder.
  #4 (permalink)  
Antiguo 29/03/2011, 08:01
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: relacion n:m

Cita:
pero pues que no es lo mismo si pongo cualquier pk?
¿A qué te refieres con "cualquier PK"?
Una tabla que representa la relación N:N entre otras dos debe tener como PK las dos PK correspondientes a cada tabla. No necesita una PK propia más que esa porque su existencia depende de ellas, por tanto hereda las claves como PK/FK.
Sólo necesitaría un discriminante como parte de su PK sólo si existe la posibilidad de que un mismo libro tuviese diferentes formatos en una misma editorial.

En realidad, eso es un punto a analizar: El diagrama en el mundo real de una relación entre obras y editoriales es mucho más complejo, porque cada edición, respecto de otra, puede diferir en formatos y también en un atributo clave de la identidad de la obra editada: el ISBN.

El modelado que planteas es básico, sirve para estudiar bases de datos, pero no sirve para representar los sistemas reales.
__________________
¿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 29/03/2011, 08:11
 
Fecha de Ingreso: marzo-2011
Mensajes: 17
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: relacion n:m

Si te he entendido bien, lo que necesitas es algo parecido a esto (la definicion de los campos no la pongo, para que uses la que tienes actualmente) :

Create Table `LIBRO`(
`IDLIBRO` Integer(9) Not Null AUTO_INCREMENT,
`NOMBRE` ,
`ALIAS` ,
`IMAGEN` ,
`SINOPSIS` ,
`VOLUMENES` ,
`FECHA_EDICION` ,
PRIMARY KEY (`IDLIBRO`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Create Table `EDITORIAL`(
`IDEDITORIAL` Integer(9) Not Null AUTO_INCREMENT,
`IDLIBRO` Integer(9),
`NOMBRE` ,
`ACRONIMO` ,
`ALIAS` ,
`PORTADA` ,
PRIMARY KEY (`IDEDITORIAL`)
KEY (`IDLIBRO`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Lo que he hecho es añadir en la tabla 'EDITORIAL' el identificador de la tabla 'LIBRO'.

De esta forma puedes:
  • Leer todos los libros que tienes (leyendo de la tabla LIBROS).
  • Leer todas las editoriales que tienes (leyendo de la tabla EDITORIAL).
  • Leer en que editoriales hay un determinado libro (leyendo de la tabla EDITORIAL mediante IDLIBRO).

Espero que te sirva.
  #6 (permalink)  
Antiguo 29/03/2011, 08:19
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: relacion n:m

Cita:
Iniciado por jvcano Ver Mensaje
Si te he entendido bien, lo que necesitas es algo parecido a esto (la definicion de los campos no la pongo, para que uses la que tienes actualmente) :

Create Table `LIBRO`(
`IDLIBRO` Integer(9) Not Null AUTO_INCREMENT,
`NOMBRE` ,
`ALIAS` ,
`IMAGEN` ,
`SINOPSIS` ,
`VOLUMENES` ,
`FECHA_EDICION` ,
PRIMARY KEY (`IDLIBRO`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Create Table `EDITORIAL`(
`IDEDITORIAL` Integer(9) Not Null AUTO_INCREMENT,
`IDLIBRO` Integer(9),
`NOMBRE` ,
`ACRONIMO` ,
`ALIAS` ,
`PORTADA` ,
PRIMARY KEY (`IDEDITORIAL`)
KEY (`IDLIBRO`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Lo que he hecho es añadir en la tabla 'EDITORIAL' el identificador de la tabla 'LIBRO'.

De esta forma puedes:
  • Leer todos los libros que tienes (leyendo de la tabla LIBROS).
  • Leer todas las editoriales que tienes (leyendo de la tabla EDITORIAL).
  • Leer en que editoriales hay un determinado libro (leyendo de la tabla EDITORIAL mediante IDLIBRO).

Espero que te sirva.
Jvcano, eso es una relación 1:N entre libro y editorial.
Eso permite que un libro pueda estar en varias editoriales, pero una editorial sólo pueda tener un libro...

Lo que el necesita es:
Código MySQL:
Ver original
  1. CREATE TABLE  `LIBRO_EDITORIAL`(
  2.              `IDEDITORIAL` INT NOT NULL,
  3.              `IDLIBRO` INT NOT NULL
  4. PRIMARY KEY  (`IDEDITORIAL`, `IDLIBRO`)
  5. CONSTRAINT libro_editorial FOREIGN KEY `IDLIBRO` REFERENCES `LIBRO`(`IDLIBRO`) ON DELETE CASCADE ON UPDATE CASCADE,
  6. CONSTRAINT editorial_libro FOREIGN KEY `IDEDITORIAL` REFERENCES `EDITORIAL`(`IDEDITORIAL`) ON DELETE CASCADE ON UPDATE CASCADE,
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 29/03/2011, 08:31
Avatar de memoadian
Colaborador
 
Fecha de Ingreso: junio-2009
Ubicación: <?php echo 'México'?>
Mensajes: 3.696
Antigüedad: 15 años, 4 meses
Puntos: 641
Respuesta: relacion n:m

gracias gonzsoloyo, la idea que tengo de pk es un dato que no se repite y sirve como identificador primario, sin la necesidad de agregar un id, bueno eso lei en mysql con clase, y se que esta tabla de ejmplo no es buena para un sistema real de libros, pero como verás en mi firma es una biblioteca anime , pero pongo la BB normal para que me entiendan, de todos modos creo que ya comprendi, gracias.
  #8 (permalink)  
Antiguo 29/03/2011, 08:36
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: relacion n:m

El concepto de PK esta bien. El tema de las tablas que nacen de una relación N:N es que esa tabla es dependiente de otras y hereda ambas PK. SOn las dos PK al mismo tiempo las que componen la PK de esa tabla.
Recordemos la definición básica: "Clave primaria (PK) es un campo o conjunto de campos que identifica univocamente un registro en una tabla".
En el caso de las tablas que representan la relación, la PK está compuesta por al menos dos columnas, una proveniente de cada tabla relacionada. Lo que no se peude repetir en este caso es el par de claves ( (1,1), (2,34), etc.). Por eso se trata de una clave compuesta.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 29/03/2011, 08:56
Avatar de memoadian
Colaborador
 
Fecha de Ingreso: junio-2009
Ubicación: <?php echo 'México'?>
Mensajes: 3.696
Antigüedad: 15 años, 4 meses
Puntos: 641
Respuesta: relacion n:m

bueno en ese caso esto seria lo ideal?

libro | editorial
34 | 1
34 | 12
23 | 12

por que esa fue mi pregunta original, y los conceptos a la teoria hay un mundo aun para mi. aunque los medio entiendo al plasmarlos es donde me cuesta un poco.

PD no acostumbro ser tan pesado, lo siento :S

Última edición por memoadian; 29/03/2011 a las 09:12
  #10 (permalink)  
Antiguo 29/03/2011, 09:16
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: relacion n:m

Exactamente, esa es la idea: Una tabla que contenga las dos claves, las cuales se definen como PK de esa tabla.
En esas condiciones un mismo libro puede ser publicado por diversas editoriales, y cada editorial puede publicar diversos libros. Lo que nunca habrá es dos registros iguales con la misma editorial y el mismo libro al mismo tiempo.

No te preocupes por la pesadez. En la carrera de sistema nos lleva casi un año dominar completamente los fundamentos de las bases de datos relacionales, y este tema lleva casi un par de meses para dominarlo mas o menos bien.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 30/03/2011, 01:35
Avatar de memoadian
Colaborador
 
Fecha de Ingreso: junio-2009
Ubicación: <?php echo 'México'?>
Mensajes: 3.696
Antigüedad: 15 años, 4 meses
Puntos: 641
Respuesta: relacion n:m

si me imagino, yo solo lo he estudiado una semana, por eso soy una birria, en fin gracias, igual yo solo tengo un proyecto en mi mente, por eso aprendo todo esto, que es tan divertido, y gente como tu es una gran ayuda.

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 12:30.