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

Producto cartesiano y JOIN

Estas en el tema de Producto cartesiano y JOIN en el foro de Mysql en Foros del Web. Buenos días, tengo una duda. Yo siempre he relacionado las tablas cuando es necesario relacionar la PK con la FK con lo que son llamados ...
  #1 (permalink)  
Antiguo 15/03/2011, 10:40
 
Fecha de Ingreso: marzo-2011
Ubicación: Veracruz
Mensajes: 92
Antigüedad: 13 años, 1 mes
Puntos: 3
Pregunta Producto cartesiano y JOIN

Buenos días, tengo una duda.

Yo siempre he relacionado las tablas cuando es necesario relacionar la PK con la FK con lo que son llamados productos cartesianos, no se si haya alguna ventaja con usar JOIN o cual es la diferencia, dejo aqui un ejemplo:

Tengo 3 tablas

TABLA1(id PK,nombre)
TABLA2(id PK,nombre,id_tabla1 FK)
TABLA3(id PK,nombre,id_tabla2 FK)

si quiero saber los registros de la tabla3 que le pertenecen a la tabla1 hago lo siguiente:

SELECT tabla1.id,tabla2.id,tabla3.id,id_tabla1,id_tabla2, tabla1.nombre,tabla2.nombre,tabla3.nombre FROM tabla1,tabla2,tabla3 WHERE idtabla2=tabla2.id AND id_tabla2=tabla1.id;

De que manera pued hacer eso con JOIN y cual sería la ventaja o diferencia.

Gracias.
  #2 (permalink)  
Antiguo 15/03/2011, 10:43
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 3 meses
Puntos: 89
Respuesta: Producto cartesiano y JOIN

El JOIN es infinitamente más eficiente, además de tener las variantes como LEFT JOIN y RIGHT JOIN que te dan mucho juego.

Código SQL:
Ver original
  1. SELECT *
  2. FROM tabla1
  3. INNER JOIN tabla2 ON
  4. tabla1.id = tabla2.id_tabla1
  5. INNER JOIN tabla3 ON
  6. tabla2.id = tabla3.id_tabla2
  #3 (permalink)  
Antiguo 15/03/2011, 11:03
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: Producto cartesiano y JOIN

Cita:
Yo siempre he relacionado las tablas cuando es necesario relacionar la PK con la FK con lo que son llamados productos cartesianos,
La respuesta ya te la ha dado Heimish2000, pero me intriga tu mención de los productos cartesianos y la relación que haces con las FK. Me da la impresión que hay un error de conceptos.
¿Podrías explicar como relacionas tú las dos cosas?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 15/03/2011, 11:08
 
Fecha de Ingreso: marzo-2011
Ubicación: Veracruz
Mensajes: 92
Antigüedad: 13 años, 1 mes
Puntos: 3
Respuesta: Producto cartesiano y JOIN

Ok muchas gracias. Le voy a dar una buena leida a JOIN en mysql. Y en que casos me puede servir lo que yo hacía? Saludos.
  #5 (permalink)  
Antiguo 15/03/2011, 11:12
 
Fecha de Ingreso: marzo-2011
Ubicación: Veracruz
Mensajes: 92
Antigüedad: 13 años, 1 mes
Puntos: 3
Respuesta: Producto cartesiano y JOIN

Cita:
Iniciado por gnzsoloyo Ver Mensaje
La respuesta ya te la ha dado Heimish2000, pero me intriga tu mención de los productos cartesianos y la relación que haces con las FK. Me da la impresión que hay un error de conceptos.
¿Podrías explicar como relacionas tú las dos cosas?
Mi interpretación de producto cartesiano es "multiplicar" las tablas que van separadas por "coma" despues del FROM mostrando solo los datos dependiendo las condiciones despues de WHERE.

Es decir, que me muestre todos los campos que seleccione(SELECT) de ciertas tablas (FROM). No se si me explico, por favor corrígeme si estoy en un error.
  #6 (permalink)  
Antiguo 15/03/2011, 11: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: Producto cartesiano y JOIN

Básicamente, si, pero por definición un producto cartesiano es un producto de conjuntos (A * B). En bases de datos se considera la peor forma de consulta, porque lo que se hace es combinar cada registro de la tabla A con cada uno de los registros de la tabla B, más allá del filtro aplicado en las condiciones del WHERE.
Esta situación da lugar a tablas virtuales (o derivadas) inmensas inútilmente cargadas, que no pueden optimizarse porque las condiciones de optimización no están en la definición de esa junta, sino en el WHERE.
En el caso de MySQL, éste realiza la combinación emparejando campos que tengan el mismo nombre, eventualmente el mismo tipo, pero esto hace que puedan emparejarse campos cuyos dominios sean completamente incompatibles, lo que puede dar lugar a resultados erróneos. Esta situación se suele producir cuando en dos tablas hay campos del mismo nombre, dedicados a datos completamente diferentes (la ociosidad de los programadores tiene a generar estas cosas).
En lugar de eso, el INNER/LEFT/RIGHT JOIN realiza un matching (coincidencia) entre las tablas en el momento de la lectura, haciendo la comparación sólo con los campos indicados en el ON, lo que redunda en lecturas mucho más reducidas y rápidas, que pueden optimizarse recurriendo a índices. En ese sentido (Heimish2000 ya te lo menciona), el INNER JOIN es inmensamente más eficiente.

El uso de las FK no es obligatorio para usar JOIN, o la coma (sintacticamente equivalente según el manual), o bien el INNER JOIN, de hecho se puede hacer de cualquier forma. El sentido de una FK es en realidad la de mantener la consistencia e integridad, no las consultas en sí.

Resumiendo: Un producto cartesiano es algo que se debe evitar, siempre, ya que resulta completamente ineficiente. Usa INNER JOIN.
__________________
¿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 15/03/2011, 12:01
 
Fecha de Ingreso: marzo-2011
Ubicación: Veracruz
Mensajes: 92
Antigüedad: 13 años, 1 mes
Puntos: 3
Respuesta: Producto cartesiano y JOIN

Muchas gracias. Excelente explicación.

Etiquetas: cartesiano, join, producto
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.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 08:40.