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

[SOLUCIONADO] Como solucionar una combinación de datos en una auto relación

Estas en el tema de Como solucionar una combinación de datos en una auto relación en el foro de Bases de Datos General en Foros del Web. Estimados, desde ya muchas gracias por su tiempo. Tengo el siguiente problema, estoy desarrollando una especie de red social y tengo una auto relación de ...
  #1 (permalink)  
Antiguo 24/08/2015, 12:31
 
Fecha de Ingreso: marzo-2013
Ubicación: Montevideo
Mensajes: 3
Antigüedad: 11 años, 8 meses
Puntos: 0
Como solucionar una combinación de datos en una auto relación

Estimados, desde ya muchas gracias por su tiempo.

Tengo el siguiente problema, estoy desarrollando una especie de red social y tengo una auto relación de la tabla usuarios consigo misma donde se define la relación "amigo".

El problema es que la auto relación es N a N debido a que un usuario pude tener N amigos y un "amigo" puede serlo de N usuarios.

El problema surje cuando se forma la tabla amigo:

| Id_user | Id_amigo |
| Juan | Pedro
| Pedro | Juan

Me quedan esa combinaciones duplicadas y no debería quedar asi. Juan puede ser amigo de Pedro, Pablo, etc pero no deberia repetirse la dupla Pedro->Juan cuando enumere los amigos de Pedro.
  #2 (permalink)  
Antiguo 24/08/2015, 12: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: Como solucionar una combinación de datos en una auto relación

Técnicamente no son relaciones "duplicadas", porque la clave se define por el par integro (a, b), donde (b, a) es su reflexión, pero compone una clave distinta.
Se trata de comprender que no puedes mirar la estructura de datos con ojos de programador, sino de arquitecto de datos. Lo que a ojos del programador es un error, puede ser correcto para la Base de Datos...

No hay duplicidad.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 24/08/2015, 12:40
 
Fecha de Ingreso: marzo-2013
Ubicación: Montevideo
Mensajes: 3
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Como solucionar una combinación de datos en una auto relación

Ok, muchas gracias, yo estaba dandole vueltas al asunto, porque no me parecia una solución correcta. Pero tienes razon.

Saludos.
  #4 (permalink)  
Antiguo 25/08/2015, 00:26
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 12 años, 7 meses
Puntos: 31
Respuesta: Como solucionar una combinación de datos en una auto relación

Necesitas ambos registros. Porque cuando necesites a los amigos de Pedro no vas a buscar en todos los registros para ver en cuales está incluido Pedro. Vas a ir al registro Pedro y de ese registro vas a sacar a todos los amigos.

Por otra parte, visto desde el punto de vista del programador también tiene su lógica.

Cada registro apunta a los amigos que un usuario tiene. Pero que una persona sea amiga de otra no significa que la otra tenga que serlo de la una.

En el siguiente registro:

| Id_user | Id_amigo |
| Juan | Pedro

se demuestra que Pedro es considerado amigo por Juan. Pero no tiene por qué ser algo mutuo. Puede que Juan no sea considerado como amigo por Pedro.

Actualmente en las redes sociales tipo Facebook, cuando Juan manda una solicitud de amistad a Pedro y este la acepta se hace un enlace mutuo, ambos se vinculan mutuamente como amigos Es decir: Juan es amigo de Pedro y Pedro de Juan sin importar quién mandó la invitación y quién la aceptó. Es lo más cómodo, y normalmente si Juan no es considerado amigo por Pedro este no aceptaría la invitación. Por lo que si la acepta es de suponer que Juan es considerado amigo por Pedro. Sin embargo... no tiene por qué ser así.

Y como puede no ser así, por eso es necesario confirmarlo mediante un registro nuevo:

| Id_user | Id_amigo |
| Pedro | Juan

Como te digo, es lo que suele pasar en las redes sociales. Sin embargo, también podría haber una red social en el que Juan siguiese los pasos de Pedro, leyese todas sus publicaciones, etc. Sin embargo en esa red social podría no ser mutuo, y Pedro no siguiese los pasos de Juan. Es decir... Juan considera amigo a Pedro pero Pedro no a Juan. Y por eso Juan sigue las noticias de Pedro pero Pedro no sigue las noticias de Juan. Y eso es lo que pasa exactamente en Facebook con las páginas no personales de Facebook, es decir... Juan se apunta como seguidor de Coca-Cola Facebook, y todo lo que publique Coca-Cola Facebook a él le saldrá en su muro para él leerlo. Igual que cuando Pedro también publica algo en su muro. Sin embargo, cuando Juan publique algo en su muro no se verá reflejado en ninguna pare de Coca-Cola Facebook. El usuario que lleve esa página no leerá lo que ha publicado Juan.

Se me ocurre que en una red social (No se si Facebook tiene esa opción) Pueda, a parte de la relación amistad mutua (como la de Facebook: Si Juan es amigo de Pedro ->Pedro es amigo de Juan) también podría existir la opción se seguir a un usuario. Es decir... el usuario A puede seguir al usuario B sin la confirmación de que pueda hacerlo por parte del usuario B. Sin embargo, también sería aconsejable que de alguna manera el usuario B pueda publicar para todo el mundo o solo para sus amigos. Bien en las opciones generales para todas las publicaciones, bien como opción individual dentro de cada publicación.

En ese caso SI podría existir un registro:
| Id_user | Id_amigo |
| Juan | Pedro

pero no existir:
| Id_user | Id_amigo |
| Pedro | Juan

En este caso podría hacerse por medio de 2 tablas. Una de amistad (en la que si existen ambos registros) y otra de seguidores (en la que solo existe 1 de los 2 registros). Y dependiendo de que el usuario publique solo para los amigos o para todos, publicará a los que se incluyen en la tabla amistad o a los de las 2.

Última edición por Kritik; 25/08/2015 a las 00:37

Etiquetas: auto, combinación, solucionar, 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 07:03.