El día 9 de mayo de 2011 10:10, <[email protected]> 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
-
Enviado a la lista de correo pgsql-es-ayuda ([email protected])
Para cambiar tu suscripción:
http://www.postgresql.org/mailpref/pgsql-es-ayuda