Re: [OT] - Estrategia de tablas (red social -muchos a muchos-).

From: Marcos Matamala <marcos(at)betazeta(dot)com>
To: yapt(at)technovell(dot)com
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: [OT] - Estrategia de tablas (red social -muchos a muchos-).
Date: 2011-05-09 15:33:58
Message-ID: BANLkTimQ=8vk-eGxEyYCefB3RJYdN=9Xxg@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

El día 9 de mayo de 2011 10:10, <yapt(at)technovell(dot)com> escribió:
> Hola a todos,
>
> estoy haciendo algo parecido a lo que sería una red social de contactos.
>
> Es decir, Juan conoce a Pepe, Pepe conoce a Pedro, Andrés conoce a Pedro,
> etc.. etc..    Creo que sería una especie de relación muchos-a-muchos...
>
> En lo que estoy un poco perdido es en como representar esta relación en
> tablas de base de datos y su consistencia.  PostgreSQL en este caso (aunque
> podría ser cualquier otra).
>
> Se admiten ideas teórico-prácticas de todo tipo.
>
> Se me ocurre, algo así:
>
> Tabla 1
> -------
> idUsuario (PK)
> NombreUsuario
>
> Tabla 2
> -------
> IdUsuario (PK)
> IdUsuarioConocido (PK)
>
> Los problemas que me encuentro:
> **** 1.- Debo mantener "manualmente" (con triggers, rules o como sea) dobles
> entradas.
>
> Es decir, si Pepe conoce a Juan, debo hacer:
>
> Tabla 2 (idUsuario / IdUsuarioConocido)
> * Pepe -> Juan
> * Juan -> Pepe (esta debo crearla yo vía triggers o similar).
> (también debo mantener los DELETES/UPDATES, etc..).

No necesariamente por que puedes preguntar

WHERE IdUsuario = <ID> OR IdUsuarioConocido = <ID>

>
>
> **** 2.- Si P, conoce a J .... y J, conoce a K.... entonces P conoce a K
> ¿ Donde parar con esta consulta ?
> ¿ Como efectuarla de forma optima ?
>
> Bueno, de momento está todo muy verde y todavía tengo que mirar esto a
> fondo, pero si alguien ha hecho cosas parecidas.... Cualquier idea es buena.

Si consideras un solo registro que represente amistad(en ambos
sentidos) no tendrás estos problemas.

Ejemplo:

create table person(id bigserial primary key, name varchar(36) not null unique);
create table person_friend(id bigserial primary key, person_one bigint
references person(id), person_two bigint references person(id));

insert into person(name) values('sr. perro'),('sr. gato'),('sra. gallina');
insert into person_friend(person_one, person_two) values((select id
from person where name = 'sr. perro'), (select id from person where
name = 'sr. gato'));

select person.name, friend.name as amigo from person, person_friend,
person friend where (person.id = person_friend.person_one AND
friend.id = person_friend.person_two) or (person.id =
person_friend.person_two and friend.id = person_friend.person_one);

--
Marcos Matamala Fernández
Desarrollador Web

Betazeta Networks
Av. Providencia 929, Piso 4, Santiago, Chile
Fono: +56 (2) 6552215
www.betazeta.com

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2011-05-09 16:13:51 Re: [OT] - Estrategia de tablas (red social -muchos a muchos-).
Previous Message Álvaro Hernández Tortosa 2011-05-09 15:12:36 Re: [OT] - Estrategia de tablas (red social -muchos a muchos-).