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

consultas con relaciones many-to-many ?

Estas en el tema de consultas con relaciones many-to-many ? en el foro de Bases de Datos General en Foros del Web. Buenas. Estoy estudiando/repasando un poco bases de datos. Para crear relaciones many-to-many entre dos tablas A y B se suele crear una tercera tabla C ...
  #1 (permalink)  
Antiguo 22/08/2014, 07:50
 
Fecha de Ingreso: enero-2008
Mensajes: 136
Antigüedad: 16 años, 2 meses
Puntos: 1
consultas con relaciones many-to-many ?

Buenas.

Estoy estudiando/repasando un poco bases de datos.
Para crear relaciones many-to-many entre dos tablas A y B se suele crear una tercera tabla C (llamada pivot table, joint table o de otras maneras) con campos de A y de B. Y se crean relaciones 1-to-many entre esa tabla C con A y entre C y B.
Eso lo he visto en algún texto y en video.

Pero lo que no encuentro es como usar luego esas tablas.

Por ejemplo si tenemos información que relaciona a los padres con sus hijos y a los alumnos con sus hijos (pudiendo tener cada padre varios hijos y cada hijo varios padres (divorciados)) ...
¿Qué consulta usariamos en SQL para saber que padres tiene un niño?
¿Qué consularía usaremos para saber que hermanos tiene un niño?
¿Alguna solución más simple?

Por ejemplo

Padres, Hijos:
Pepe, Josito
Pepe, Anita
Maria, Josito
Sofia, Anita
Sofia, Vicentito
Manolo, Vicentito

(nombres iguales en este caso son la misma persona).

Esta pregunta la hago en la sección de SQL Server pero me sirve también una respuesta para MySQL, Access, etc...
Cualquier otro ejemplo me sirve igual.

saludos.
  #2 (permalink)  
Antiguo 22/08/2014, 08:47
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: consultas con relaciones many-to-many ?

Supongo que esa es la tabla que obtienes de unir los datos de padres, hijos y relacion digamos que tu esquema esta de esta manera:

Código SQL:
Ver original
  1. CREATE TABLE #padres
  2. (
  3. id INT IDENTITY(1,1),
  4. nombre VARCHAR(30)
  5. )
  6.  
  7. CREATE TABLE #hijos
  8. (
  9. id INT IDENTITY(1,1),
  10. nombre VARCHAR(30)
  11. )
  12.  
  13. CREATE TABLE #relacion
  14. (
  15. id_padre INT,
  16. id_hijo INT
  17. )
  18.  
  19. INSERT INTO #padres VALUES ('Pepe')
  20. INSERT INTO #padres VALUES ('Sofia')
  21. INSERT INTO #padres VALUES ('Manolo')
  22. INSERT INTO #padres VALUES ('Maria')
  23.  
  24. INSERT INTO #hijos VALUES ('Josito')
  25. INSERT INTO #hijos VALUES ('Anita')
  26. INSERT INTO #hijos VALUES ('Vicentito')
  27.  
  28. INSERT INTO #relacion VALUES (1,1)
  29. INSERT INTO #relacion VALUES (1,2)
  30. INSERT INTO #relacion VALUES (4,1)
  31. INSERT INTO #relacion VALUES (2,2)
  32. INSERT INTO #relacion VALUES (2,3)
  33. INSERT INTO #relacion VALUES (3,3)
  34.  
  35. SELECT t1.nombre,t3.nombre FROM #padres AS t1
  36. LEFT JOIN #relacion AS t2 ON (t2.id_padre=t1.id)
  37. LEFT JOIN #hijos AS t3 ON (t2.id_hijo=t3.id)

Claro que TU tienes que llenar la tabla de relaciones ya que no existe una forma magica para que se llene ;)

Aqui esta para sql server :)
saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Última edición por Libras; 22/08/2014 a las 08:59
  #3 (permalink)  
Antiguo 22/08/2014, 09:01
 
Fecha de Ingreso: enero-2008
Mensajes: 136
Antigüedad: 16 años, 2 meses
Puntos: 1
Respuesta: consultas con relaciones many-to-many ?

Voy a estudiar un rato esa sentencia SQL.
Mientras tanto ¿Cómo evitas que aparezca el nombre de un niño como hermano de sí mismo?

saludos
  #4 (permalink)  
Antiguo 22/08/2014, 09:25
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: consultas con relaciones many-to-many ?

Digamos para sacar los hijos de maria y pepe(usando el ejemplo)

Código SQL:
Ver original
  1. --Aqui sacas los nombres, pero Josito se repite porque es hijo de pepe y maria,aunque anita nada mas es hija de pepe ???? raro verdad :P
  2. SELECT t3.nombre FROM #padres AS t1
  3. LEFT JOIN #relacion AS t2 ON (t2.id_padre=t1.id)
  4. LEFT JOIN #hijos AS t3 ON (t2.id_hijo=t3.id)
  5. WHERE t1.nombre IN ('pepe','maria')
  6.  
  7. --Aplicando un distinct nada mas obtenemos 2 nombres que son Josito y Anita
  8. SELECT DISTINCT t3.nombre FROM #padres AS t1
  9. LEFT JOIN #relacion AS t2 ON (t2.id_padre=t1.id)
  10. LEFT JOIN #hijos AS t3 ON (t2.id_hijo=t3.id)
  11. WHERE t1.nombre IN ('pepe','maria')
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 22/08/2014, 19:49
 
Fecha de Ingreso: enero-2008
Mensajes: 136
Antigüedad: 16 años, 2 meses
Puntos: 1
Respuesta: consultas con relaciones many-to-many ?

Hola y gracias.
En el viejo portátil de mi novia no puedo poner SQL Server pero he conseguido más o menos ejecutarlo con algunos cambios online en la web w3schools.
La principal duda que me surge es ¿Por qué usas joins y no solamente where?
¿Quiero decir, para indicar relaciones no deberíamos usar foreign keys?
  #6 (permalink)  
Antiguo 25/08/2014, 08:13
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: consultas con relaciones many-to-many ?

Cita:
Iniciado por skanskan Ver Mensaje
Hola y gracias.
En el viejo portátil de mi novia no puedo poner SQL Server pero he conseguido más o menos ejecutarlo con algunos cambios online en la web w3schools.
La principal duda que me surge es ¿Por qué usas joins y no solamente where?
¿Quiero decir, para indicar relaciones no deberíamos usar foreign keys?
Las relaciones como las mencionas se manejan a nivel de DDL, cuando se trabaja con DML entonces es necesario usar joins
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #7 (permalink)  
Antiguo 25/08/2014, 16:48
 
Fecha de Ingreso: enero-2008
Mensajes: 136
Antigüedad: 16 años, 2 meses
Puntos: 1
Respuesta: consultas con relaciones many-to-many ?

Hola.
Acabo de googlear DDL y DML y creo entender que con ello simplemente te refieres a que los "foreign key" sólo se usa al crear las tablas y no al hacer queries después. Pero es que en tu ejemplo no has usado ninguna al definirlas, por eso lo decía.
  #8 (permalink)  
Antiguo 26/08/2014, 07:35
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: consultas con relaciones many-to-many ?

Cita:
Iniciado por skanskan Ver Mensaje
Hola.
Acabo de googlear DDL y DML y creo entender que con ello simplemente te refieres a que los "foreign key" sólo se usa al crear las tablas y no al hacer queries después. Pero es que en tu ejemplo no has usado ninguna al definirlas, por eso lo decía.
Aaaaa si te explicas te entiendo, porque no lo use en mi ejemplo?? la verdad porque no quise :P jejejejejejeje, y porque son datos de ejemplo, en un ambiente donde realmente se van a validar las relaciones claro que lleva las FK
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #9 (permalink)  
Antiguo 26/08/2014, 08: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: consultas con relaciones many-to-many ?

Cita:
Iniciado por skanskan Ver Mensaje
Hola.
Acabo de googlear DDL y DML y creo entender que con ello simplemente te refieres a que los "foreign key" sólo se usa al crear las tablas y no al hacer queries después. Pero es que en tu ejemplo no has usado ninguna al definirlas, por eso lo decía.
Estimado: Las FK son la forma en que en las bases de datos relacionales defnes qué relacion hay entre entidades o tablas, para luego usar esas relaciones para las consultas.
¿De dónde sacaste que luego no las usas?

AL determinar una FK, estás definiendo también una dependencia funcional entre datos, y una restricción de consistencia que evitará que falten datos en el esquema de dependencias. En pocas palabras, las FK son el corazón del modelo relacional, y fundamentales apra la generacion de consultas.

Si el tema de consistencia e integridad no te ha quedado claro, te recomienod enfáticamente que estudies los fundamentos del modelo relacional, antes de rposeguir desarrollos, a fin de evitarte enormes problemas futuros.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 26/08/2014 a las 08:21
  #10 (permalink)  
Antiguo 26/08/2014, 10:19
 
Fecha de Ingreso: enero-2008
Mensajes: 136
Antigüedad: 16 años, 2 meses
Puntos: 1
Respuesta: consultas con relaciones many-to-many ?

Hola.
Si tengo claro que las FK sirven para asegurar la integridad, para hacer cosas como impedir que borres algo que está referenciado en otro sitio, para actualizar en cascada, para crear una correspondencia uno a uno entre campos, etc.
Pero lo que me gustaría es ver como afecta esto (y como se usa) a las consultas, cuando ya has creado las tablas y has definido las relaciones, ¿y luego qué?.

saludos.
  #11 (permalink)  
Antiguo 26/08/2014, 10:41
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: consultas con relaciones many-to-many ?



Pues simplemente las usas para generarlos JOIN basados en esas relaciones... Francamente me cuesta ver por qué te plantea dudas.

Si tienes una tabla A(a_id, a_x, a_y, a_z) y otra B(a_id, b_x, b_y, b_z), donde hay una manifiesta relación de 1:N entrew A y B, determinada por el campo "A_ID", un JOIN que te devuelva las que se relacionan sería simplemente:
Código SQL:
Ver original
  1. SELECT A.*, B.*
  2. FROM A INNER JOIN B ON A.a_id = B.a_id
Y las que están en A pero no en B:
Código SQL:
Ver original
  1. SELECT A.*, B.*
  2. FROM A LEFT JOIN B ON A.a_id = B.a_id
  3. WHERE B.a_id IS NULL

Además, el hecho de que existan FK genera mejoras de performance, desde el momento en que los DBMS habitualmente manejan esa dependencia como índices, que tienen impacto directo en los planes de consulta que se generan internamente.
Cualquier búsqueda basada en índice de FK ers mucho más eficiente que una busqueda sin usarlos.

Esto es sólo una parte de las ventajas que tienen y los usos de las FK.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #12 (permalink)  
Antiguo 26/08/2014, 15:28
 
Fecha de Ingreso: enero-2008
Mensajes: 136
Antigüedad: 16 años, 2 meses
Puntos: 1
Respuesta: consultas con relaciones many-to-many ?

1
¿Pero se podría hacer esa misma consulta, con el mismo resultado, sin haber usado la FK?
¿Sólo afectará entonces al rendimiento y a la hora de poblar las tablas?
En mi ejemplo de hijos y padres por ejemplo, Puedo hacer todo tipo de consultas sin haber definido FK, y saber cosas como que padres tiene un hijo.


2
En tu ejemplo has puesto:

WHERE t1.nombre IN ('pepe','maria')

pero para eso tengo que escribir esos nombres en la propia consulta.
¿Cómo hago para que los vaya cogiendo "en tiempo de ejecución" de una lista o de los generados de otro sitio?
Por ejemplo, ¿Cómo generas una tabla en la que apareza para cada niño todos los hermanos que tiene, sin que aparezca su propio nombre?

Usando elementos de batch de DOS sería algo así
for %f in hijos do SELECT hijos.nombre AS s1 WHERE s1 <> %f

¿como hago algo así con sql?.
O hablando de otros lenguajes de programación habría que usar dos bucles o foreach...

Última edición por skanskan; 27/08/2014 a las 04:18
  #13 (permalink)  
Antiguo 27/08/2014, 14:37
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: consultas con relaciones many-to-many ?

1.-Exacto, como bien te dije en DML(querys) no ocupas las FK, las FK son solo para la parte de DDL
2.-Aqui pongo los padres pero se puede generar lo que necesitas, pero en el ejemplo que manejo nada mas estan los padres(general) no se cuales son pareja y cuales solteros correcto? asi que digamos que agregamos una columna id pareja(solo para ejemplo) y podemos obtener esto:

Código SQL:
Ver original
  1. CREATE TABLE #padres
  2. (
  3. id INT IDENTITY(1,1),
  4. nombre VARCHAR(30),
  5. id_pareja INT
  6. )
  7.  
  8. CREATE TABLE #hijos
  9. (
  10. id INT IDENTITY(1,1),
  11. nombre VARCHAR(30)
  12. )
  13.  
  14. CREATE TABLE #relacion
  15. (
  16. id_padre INT,
  17. id_hijo INT
  18. )
  19.  
  20. INSERT INTO #padres VALUES ('Pepe',1)
  21. INSERT INTO #padres VALUES ('Sofia',1)
  22. INSERT INTO #padres VALUES ('Manolo',2)
  23. INSERT INTO #padres VALUES ('Maria',2)
  24.  
  25. INSERT INTO #hijos VALUES ('Josito')
  26. INSERT INTO #hijos VALUES ('Anita')
  27. INSERT INTO #hijos VALUES ('Vicentito')
  28.  
  29. INSERT INTO #relacion VALUES (1,1)
  30. INSERT INTO #relacion VALUES (1,2)
  31. INSERT INTO #relacion VALUES (4,1)
  32. INSERT INTO #relacion VALUES (2,2)
  33. INSERT INTO #relacion VALUES (2,3)
  34. INSERT INTO #relacion VALUES (3,3)
  35.  
  36. SELECT
  37. DISTINCT t1.id_pareja,t3.nombre
  38.  FROM #padres AS t1
  39. LEFT JOIN #relacion AS t2 ON (t2.id_padre=t1.id)
  40. LEFT JOIN #hijos AS t3 ON (t2.id_hijo=t3.id)
  41. WHERE t1.id IS NOT NULL

Y la traduccion de tu batch:

Código BASH:
Ver original
  1. for %f in hijos do SELECT hijos.nombre AS s1 WHERE s1 <> %f

seria:

Código SQL:
Ver original
  1. SELECT distint nombre FROM #hijos

Como comentario, no puedes aplicar la misma logica de programacion en una base de datos, esta cambia...ojo con eso.....
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #14 (permalink)  
Antiguo 27/08/2014, 15:02
 
Fecha de Ingreso: enero-2008
Mensajes: 136
Antigüedad: 16 años, 2 meses
Puntos: 1
Respuesta: consultas con relaciones many-to-many ?

Hola
Es que ese
Código:
SELECT distint nombre FROM #hijos
lo que hace es que elimina los repetidos pero comparandolos entre sí, no con el hermano original.

Por ejemplo. Si tengo como hermanos
Manolo, Maria, Jose y Vicente y otro Vicente.
Me daría como hermanos de Manolo
Maria, Jose, un sólo Vicente y al propio Manolo.
  #15 (permalink)  
Antiguo 27/08/2014, 16:14
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: consultas con relaciones many-to-many ?

la verdad no entiendo tu pregunta........que quieres decir con hermano original??? como se quien es el hermano original??? tienes alguna estructura de base de datos o nada mas estas preguntando al vuelo y pensando de manera cognositiva???
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #16 (permalink)  
Antiguo 28/08/2014, 06:06
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: consultas con relaciones many-to-many ?

Estás mirando las cosas como programador, y debes analizarlo desde la visión del DBA o de arquitectura de datos. Son lógicas diferentes.

Vamos a hacer algunas aclaraciones para evitar confusiones:
Cita:
Iniciado por skanskan Ver Mensaje
1
¿Pero se podría hacer esa misma consulta, con el mismo resultado, sin haber usado la FK?
¿Sólo afectará entonces al rendimiento y a la hora de poblar las tablas?
En mi ejemplo de hijos y padres por ejemplo, Puedo hacer todo tipo de consultas sin haber definido FK, y saber cosas como que padres tiene un hijo.
Poderse, se puede, como ya te dijeron. La pregunta es si esa query será eficiente ("performante" se suele decir), o si al menos segura. Y la respuesta es no mucho.
La idea de una FK es que se pueda, por medio de un atributo de una entidad, establecer de forma unívoca una relación. Esto quiere decir que la información que se devuelva sea consistente e íntegra, y para ello los datos a relacionar deben ser seguros.
¿Puedes hacer una relación entre dos instancias de una tabla, si los datos no son seguros? ¿Si pueden darse ambigüedades en cuanto a alguna respuesta?
No. Por definición de lo que es una PK, sólo debe identificar a un único registro en todo el universo de representaciones, y siendo la FK una referencia a una PK, esa relación debe existir, ser válida y única.
¿Con qué otra cosa que no sea una relación de FK/PK lo haces en este modelo?

Simple: Con ninguna.

Ahora bien, si puedes relacionar dos instancias de dos entidades sin usar las FK, pero esa identificación es segura y consistente, te comento que no estás ante otra forma de relacionar ambas tablas. Estás ante la misma forma de relacionarlas, pero eso se denomina "clave alternativa", y está dentro del modelo.
El hecho concreto es que una instancia de na entidad puede tener N formas de ser identificada unívocamente, pero sólo una se define como PK. Las otras podrían ser usadas como claves UNIQUE, que en algunos DBMS se admiten para uso como FK (MySQL, por ejemplo), porque cumplen la premisa de ser identificadores únicos no nulos.

¿Se entiende?

Lo que sí se puede asegurar es que usar otros campos no claves, pero de valor único, como relación en un JOIN no es eficiente, pero dependerá de lo que se esté consultando.

Cita:
Iniciado por skanskan Ver Mensaje
2
En tu ejemplo has puesto:

WHERE t1.nombre IN ('pepe','maria')

pero para eso tengo que escribir esos nombres en la propia consulta.
¿Cómo hago para que los vaya cogiendo "en tiempo de ejecución" de una lista o de los generados de otro sitio?
Por ejemplo, ¿Cómo generas una tabla en la que apareza para cada niño todos los hermanos que tiene, sin que aparezca su propio nombre?
Para eso existen las subconsultas en el WHERE, los auto-JOIN y otros recursos que aparecen en los manuales, y se aprenden con la experiencia. Escribir consultas no es poner "SELECT * FROM ... WHERE...". Trabajar con SQL es muchísimo más complejo que eso.

Cita:
Iniciado por skanskan Ver Mensaje
Usando elementos de batch de DOS sería algo así
for %f in hijos do SELECT hijos.nombre AS s1 WHERE s1 <> %f

¿como hago algo así con sql?.
O hablando de otros lenguajes de programación habría que usar dos bucles o foreach...
No razones como programador cuando estés trabajando con BBDD. La lógica que se usa para resolver las consultas no es la misma que para resolver un proceso.
Esto no es una fantasía ni una exageración, sino las primeras palabras que los profesores de BBDD en la universidad te dicen, y la experiencia me ha enseñado que tienen razon.
Trabajar con estructuras de datos, y esquemas de BBDD, no es lo mismo que trabajar con procesos y programación en lenguajes.
Tienes que aprender a dejar de lado lo que haces programando para entender la lógica de datos, y no pretender "adaptar" algo de un lenguaje en SQL.
No aplica.

En cualquier caso, lo que preguntas es perfectamente posible... pero no se escribe con esos recursos, y la sintaxis puede cambiar según uses SQL Server, MySQL, Oracle u otro DBMS.
Oracle, por ejemplo, tiene consultas recursivas donde encontrar el árbol completo de relaciones padre/hijo de múltiples niveles, excluyendo al propio usuario, es una única query, de no más de cuatro o cinco lineas. En cambio MySQL no lo tiene, y hay que hacerlo de otra forma.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #17 (permalink)  
Antiguo 28/08/2014, 06:21
 
Fecha de Ingreso: enero-2008
Mensajes: 136
Antigüedad: 16 años, 2 meses
Puntos: 1
Respuesta: consultas con relaciones many-to-many ?

gnzsoloyo, gracias por tu detalladísima explicación.
En realidad no pienso como un programador, de hecho no lo soy, sólo era una manera de explicarlo, para ser más concreto con un ejemplo.
Pues nada, a ver si practico un poco y ya os comento o incluso os pongo aquí mi código final.

Lo de las FK ya me ha quedado un poco más claro. Es que no sabía si las FK servían tamibén para algo así como "propagar" o linkar las consultas automáticamente, recurrencias automáticas, pero veo que no, que eso hay que especificarlo todo explicitamente y que las FK sólo sirven para construir las tablas y mejorar el rendimiento.

Y volviendo a mi ejemplo, que se me ocurrió viendo un video tutorial de youtube,...
para tener una relación many-to-many de padres, hijos, hermanos,etc. en realidad no hace falta tener 3 tablas, con una sola bastaría.
  #18 (permalink)  
Antiguo 28/08/2014, 06:43
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: consultas con relaciones many-to-many ?

Cita:
Y volviendo a mi ejemplo, que se me ocurrió viendo un video tutorial de youtube,...
para tener una relación many-to-many de padres, hijos, hermanos,etc. en realidad no hace falta tener 3 tablas, con una sola bastaría.
En principio, si. Es lo usual hacer una única tabla, donde tienes una FK que apunta a la propia tabla, con la condición que debe ser nulable. Esto último debido a que no puedes referenciar eternamente todas las generaciones, sino que sería NULL aquel que corresponda a un padre/madre superior.
¿Se entiende?
Ese mismo esquema se usa para establecer la jerarquia de dependencias entre empleados, donde "jefe" es el que no depende de nadie.
En el caso de una estructura familiar, hay que recordar que puede existir padre y madre, por lo que podrían requerirse dos FK nulables apuntando a la misma tabla.

Nota: Ese esquema no sirve para establecer relaciones de amistad... Cuidado con eso. Se parecen, pero una red de relaciones requiere de al menos dos tablas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #19 (permalink)  
Antiguo 28/08/2014, 07:49
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: consultas con relaciones many-to-many ?

Cita:
Iniciado por skanskan Ver Mensaje
Y volviendo a mi ejemplo, que se me ocurrió viendo un video tutorial de youtube,...
para tener una relación many-to-many de padres, hijos, hermanos,etc. en realidad no hace falta tener 3 tablas, con una sola bastaría.
Claro con una sola basta, pero para fines de aprendizaje y como querias ver los datos usando FK era mejor usar 3 que no, si te hubiera puesto el ejemplo con una sola tabla hubieras entendido menos que lo que entendiste......
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #20 (permalink)  
Antiguo 28/08/2014, 08:01
 
Fecha de Ingreso: enero-2008
Mensajes: 136
Antigüedad: 16 años, 2 meses
Puntos: 1
Respuesta: consultas con relaciones many-to-many ?

Lo decía porque en algunos sitios dicen que las relaciones many-to-many se deben hacer con una tabla extra, pivote, pero veo que sólo es necesario a veces.

Y otra cosa.
Estaba leyendo eso que comentas de las autojoin, y mirando los ejemplos, junto a los que habéis puesto arriba.

Y veo que en ocasiones usáis
"FROM xxx JOIN yyy WHERE"
y a veces simplemente
"FROM xxx, yyy WHERE"
¿Qué ventaja tiene usar el JOIN?, ¿No es suficiente usar la separación por comas?
Entiendo que el JOIN me va a filtrar eliminando cosas pero así me parece más lioso que poniendo la condición en el Where o en el ON.
  #21 (permalink)  
Antiguo 28/08/2014, 08:32
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: consultas con relaciones many-to-many ?

Cita:
Y veo que en ocasiones usáis
"FROM xxx JOIN yyy WHERE"
y a veces simplemente
"FROM xxx, yyy WHERE"
¿Qué ventaja tiene usar el JOIN?, ¿No es suficiente usar la separación por comas?
Entiendo que el JOIN me va a filtrar eliminando cosas pero así me parece más lioso que poniendo la condición en el Where o en el ON.
La coma es un JOIN implícito, que en algunos DBMS tiene como exigencia que los campos a relacionar tengan exactamente el mismo nombre en ambas tablas. El problema es que en ocasiones los programadores se olvidan de eso, y usan nombres iguales para datos diferentes, lo que termina generando resultados falsos.
Otra consecuencia es que si no hay campos del mismo nombre se producen productos cartesianos, lo que es un espanto para la performance.
Normalmente cuando se usa coma se indica la relación en el WHERE, pero en muchos DBMS el WHERE se procesa luego de leer las tablas basados en el JOIN implícito, lo que termina haciendo que se lea un conjunto de datos muy grande antes de tomar sólo lo que el WHERE determine.

El uso de JOIN / INNER JOIN, es lo que se denomina JOIN explícito y requiere para funcionar bien la cláusula ON, donde se indica la relación de las tablas
Código SQL:
Ver original
  1. SELECT a, b, c, d
  2. FROM tabla1 T1 INNER JOIN tabla2 T2 ON T1.a_id = T2.a_id
En la mayoría de los DBMS, esa forma hace que el primer filtrado se realice a medida que los datos se leen, y antes de aplicar el WHERE, por lo que en realidad sólo lee los datos realmente útiles.
Es más eficiente en performance.

Todos los DBMS aceptan ambas formas (excepto algunas versiones viejas de Oracle), y la maoría de los tutoriales usan la coma porque toman sintaxis viejas y obsoletas, no por ser técnicamente inexactas.
Pero si quieres consultas eficiente, no uses coma. Usa JOINs explícitos.
__________________
¿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: access, mysql, relacion, relaciones, tabla
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 03:11.