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
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-). |