Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Amigo de um amigo em PHP/MySQL?


A resposta é que eles não estão fazendo seleções em uma tabela de amigos, eles provavelmente estão usando uma tabela de eventos de notícias desnormalizada. Implementamos um feed de notícias semelhante ao Facebooks no DoInk.com, veja como fizemos:

Existe a noção de um "NewsEvent" que possui um tipo, um iniciador (um id de usuário) e um usuário alvo (também um id de usuário). (Você também pode ter colunas adicionais para outras propriedades relevantes para o evento ou participar delas)

Quando um usuário publica algo em outro mural de usuários, geramos um evento como este:
INSERT INTO events VALUES (wall_post_event, user1, user1)

Ao visualizar o perfil de user1, você selecionaria todos os eventos em que user1 é o iniciador ou o destino. É assim que você exibe o feed do perfil. (Você pode criar eventos sofisticados e filtrar eventos dependendo do seu modelo de privacidade. Você pode considerar fazer isso na memória por motivos de desempenho)

Exemplo:
SELECT * FROM events WHERE initiator = user1 or target = user1 //to see their profile feed

SELECT * FROM events WHERE initiator IN (your set of friend ids) //to see your newsfeed

Quando você quiser ver o feed de notícias de todos os eventos relativos aos seus amigos, você pode fazer uma consulta selecionando todos os eventos em que o iniciador está em seu conjunto de amigos.

Evite implementações com sub-seleções, dependendo da complexidade, elas não serão dimensionadas.