Comunidad de diseño web y desarrollo en internet online

Cómo relacionar 1 tabla con N tablas

Citar            
MensajeEscrito el 06 Abr 2012 02:58 am
Hola buen día,

Tengo un ligero problema a la hora de definir mi base de datos y espero que me puedan auxiliar, les explico mi situación...

Tengo una tabla llamada "grupos" que se relaciona con 1 de varias tablas que pueden ser "liga1", "liga2" y "liga3" cada una de estas tablas tiene campos diferentes o relaciones con otras tablas por lo que NO puedo crear solo 1 tabla general llamada "liga".

Entonces definiendo un poco la cardinalidad de relación, tengo que N "grupos" pertenecen a 1 "liga", el detalle es que si pongo la llave foránea (id_liga) en la tabla "grupos" NO sé si pertenece a "liga1", "liga2" o "liga3".

Realmente llevo varias horas dándole vueltas a la base de datos y no encuentro la solución, ojalá me puedan ayudar... Gracias!

Por carlosgxs

1 de clabLevel



 

firefox
Citar            
MensajeEscrito el 06 Abr 2012 03:33 am
Puedes crear una tabla "ligas" que tenga los campos en común que tienen liga 1, 2 y 3, luego le pones un campo que diga tipo_liga (que puede ser 1, 2 y 3), a demás tiene como llave primaria id_liga. Tienes a parte las tres tablas con los campos exclusivos de cada tipo de liga. El id liga de cada uno de los tres lo toma de "ligas" como llave foranea.

Al hacer la consulta entonces, tendrías que averiguar primero qué tipo de liga es, consultando de la tabla "ligas" y luego decidir en qué tipo de liga vas a buscar el resto de la información.

Espero eso te ayude, es un poco dificil resolver este tipo de problemas sin tener los requerimientos. Saludos!

Por Lexas

1207 de clabLevel

7 tutoriales

Genero:Femenino   Desarrollador de GAIA Premio_Secretos

Ilustración y desarrollo de software

firefox
Citar            
MensajeEscrito el 06 Abr 2012 04:05 am
Gracias por tu respuesta Lexas.

Voy a tomar en cuenta tu sugerencia, pero el problema que veo es que "liga1" está relacionada con otras tablas que "liga2" y "liga3" no. La "liga2" está relacionada con otras tablas que "liga1" y "liga3", así sucesivamente. Creo que con esto tendría registros en otras tablas con "NULL".

Seguiré intentando, a veces es necesario un cambio de perspectiva... Agradezco mucho tu respuesta, saludos!

Por carlosgxs

1 de clabLevel



 

firefox
Citar            
MensajeEscrito el 06 Abr 2012 01:53 pm
En la tabla pivote (que es lo que te sugiere Lexas) agrega un campo que indique a qué tabla se refiere el id. Es lo mismo que llevar tu DB a la tercera forma normal.

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 06 Abr 2012 04:18 pm

carlosgxs escribió:

Gracias por tu respuesta Lexas.

Voy a tomar en cuenta tu sugerencia, pero el problema que veo es que "liga1" está relacionada con otras tablas que "liga2" y "liga3" no. La "liga2" está relacionada con otras tablas que "liga1" y "liga3", así sucesivamente.


Exacto, las tablas liga1, 2 y 3 tendrán sus propios campos con las relaciones que necesite. La tabla intermedia solo tiene los campos que tienen las tres tablas, eso te ayuda a reducir redundancia, si no tienen nada en común, solo pon el id de la liga y el tipo de liga, que es el campo que hace referencia a una de las otras tres tablas. :)

Por Lexas

1207 de clabLevel

7 tutoriales

Genero:Femenino   Desarrollador de GAIA Premio_Secretos

Ilustración y desarrollo de software

firefox
Citar            
MensajeEscrito el 07 Abr 2012 03:23 pm

Por Inyaka

Claber

3176 de clabLevel

9 tutoriales
2 articulos

Genero:Masculino   Desarrollador de GAIA

Programador y fotógrafo

chrome
Citar            
MensajeEscrito el 07 Abr 2012 07:35 pm

Inyaka escribió:

http://www.cristalab.com/tutoriales/consulta-sql-a-mas-de-dos-tablas-con-join-c77632l/


Eso no implicaría tener una sola tabla de ligas con muchos campos nulos y un campo extra que diga "tipo de liga"?

Por Lexas

1207 de clabLevel

7 tutoriales

Genero:Femenino   Desarrollador de GAIA Premio_Secretos

Ilustración y desarrollo de software

firefox
Citar            
MensajeEscrito el 07 Abr 2012 09:45 pm

Lexas escribió:

Inyaka escribió:

http://www.cristalab.com/tutoriales/consulta-sql-a-mas-de-dos-tablas-con-join-c77632l/


Eso no implicaría tener una sola tabla de ligas con muchos campos nulos y un campo extra que diga "tipo de liga"?


tablas:

Código MySQL :

A(id,a1,a2,a3) // id es int autonumerico
B(id,b1,b2,b3)
a2b(id,id_a,id_b)


consulta

Código MySQL :

SELECT * FROM a
INNER JOIN a2b ON a2b.id_a =  a.id
INNER JOIN   b  ON  a2b.id_b = b.id

Por Inyaka

Claber

3176 de clabLevel

9 tutoriales
2 articulos

Genero:Masculino   Desarrollador de GAIA

Programador y fotógrafo

chrome
Citar            
MensajeEscrito el 07 Abr 2012 10:50 pm

Inyaka escribió:



tablas:

Código MySQL :

A(id,a1,a2,a3)
B(id,b1,b2,b3)
a2b(id,id_a,id_b)


consulta

Código MySQL :

SELECT * FROM a
INNER JOIN a2b ON a2b.id_a =  a.id
INNER JOIN   b  ON  a2b.id_b = b.id


Hmm quizá lo estoy entendiendo mal, pero me parece que eso crearía una relación muchos a muchos, entiendo que lo que se necesita es una relación uno a muchos, pero habiendo tres tipos de ligas diferentes, a los cuales varios grupos pueden pertenecer.

Por Lexas

1207 de clabLevel

7 tutoriales

Genero:Femenino   Desarrollador de GAIA Premio_Secretos

Ilustración y desarrollo de software

firefox
Citar            
MensajeEscrito el 08 Abr 2012 06:14 am
ops, 1 a n es distinto XD

Código MySQL :

A(id,a1,a2,a3,id_b)
B(id,b1,b2,b3)


consulta

Código MySQL :

SELECT * FROM a
INNER JOIN   b  ON  a.id_b = b.id


este tema esta relacionado con las llaves foreanas, en este caso id_b seria una Foreign Key

por cierto todo esto lo explico muy bien en el tutorial que linkie en un primer momento

Por Inyaka

Claber

3176 de clabLevel

9 tutoriales
2 articulos

Genero:Masculino   Desarrollador de GAIA

Programador y fotógrafo

chrome
Citar            
MensajeEscrito el 08 Abr 2012 06:55 pm
Pero es ono resuelve el problema de que el campo "liga" puede relacionarse a cualquiera de las 3 tablas de ligas. nnU

Por Lexas

1207 de clabLevel

7 tutoriales

Genero:Femenino   Desarrollador de GAIA Premio_Secretos

Ilustración y desarrollo de software

firefox
Citar            
MensajeEscrito el 09 Abr 2012 03:07 am
a simple vista me pareciera que la DB esta mal diseñada, de todos modos puedes hacer

Código MySQL :

SELECT * FROM a
LEFT JOIN   b1  ON  a.id_b1 = b1.id
LEFT JOIN   b2  ON  a.id_b2 = b2.id
LEFT JOIN   b3  ON  a.id_b3 = b3.id

Por Inyaka

Claber

3176 de clabLevel

9 tutoriales
2 articulos

Genero:Masculino   Desarrollador de GAIA

Programador y fotógrafo

chrome
Citar            
MensajeEscrito el 09 Abr 2012 04:20 am

Inyaka escribió:

a simple vista me pareciera que la DB esta mal diseñada, de todos modos puedes hacer

Código MySQL :

SELECT * FROM a
LEFT JOIN   b1  ON  a.id_b1 = b1.id
LEFT JOIN   b2  ON  a.id_b2 = b2.id
LEFT JOIN   b3  ON  a.id_b3 = b3.id


Cierto, no lo había pensado!, carlosgx, me parece que esta es la solución más óptima.

Por Lexas

1207 de clabLevel

7 tutoriales

Genero:Femenino   Desarrollador de GAIA Premio_Secretos

Ilustración y desarrollo de software

firefox
Citar            
MensajeEscrito el 09 Abr 2012 01:07 pm

Lexas escribió:

Inyaka escribió:

a simple vista me pareciera que la DB esta mal diseñada, de todos modos puedes hacer

Código MySQL :

SELECT * FROM a
LEFT JOIN   b1  ON  a.id_b1 = b1.id
LEFT JOIN   b2  ON  a.id_b2 = b2.id
LEFT JOIN   b3  ON  a.id_b3 = b3.id


Cierto, no lo había pensado!, carlosgx, me parece que esta es la solución más óptima.


de echo me parece que esto no es optimo, solo soluciona el problema puntual, lo optimo es diseñar bien la DB, mira por ejemplo la DB de Wordpress, donde la misma tabla post sirve para paginas, articulos, historial de cambios, etc...

Por Inyaka

Claber

3176 de clabLevel

9 tutoriales
2 articulos

Genero:Masculino   Desarrollador de GAIA

Programador y fotógrafo

chrome
Citar            
MensajeEscrito el 09 Abr 2012 04:07 pm

Inyaka escribió:



de echo me parece que esto no es optimo, solo soluciona el problema puntual, lo optimo es diseñar bien la DB, mira por ejemplo la DB de Wordpress, donde la misma tabla post sirve para paginas, articulos, historial de cambios, etc...


Así es, pero sin tener los requerimientos es imposible saber si separarlo en tres era necesario, así que, si nos pide solución para separarlo en tres, le damos solución para separarlo en tres, sea correcto o no.

Por Lexas

1207 de clabLevel

7 tutoriales

Genero:Femenino   Desarrollador de GAIA Premio_Secretos

Ilustración y desarrollo de software

firefox
Citar            
MensajeEscrito el 09 Abr 2012 04:39 pm

Lexas escribió:

Inyaka escribió:



de echo me parece que esto no es optimo, solo soluciona el problema puntual, lo optimo es diseñar bien la DB, mira por ejemplo la DB de Wordpress, donde la misma tabla post sirve para paginas, articulos, historial de cambios, etc...


Así es, pero sin tener los requerimientos es imposible saber si separarlo en tres era necesario, así que, si nos pide solución para separarlo en tres, le damos solución para separarlo en tres, sea correcto o no.

XD la verdad te respondí mas a ti que a carlosgxs, cuando uno responde dudas, las respuestas sirven a mas de 1 persona ;)

Por Inyaka

Claber

3176 de clabLevel

9 tutoriales
2 articulos

Genero:Masculino   Desarrollador de GAIA

Programador y fotógrafo

chrome

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.