ustify>Capa SQl 33

Clique aqui para ler todos os artigos desta edição

Modelando redes sociais – Parte 2

 

Este artigo aborda a modelagem de uma rede social, como as redes virtuais de sites de relacionamentos do Orkut e do MySpace. Esta segunda parte apresentará as operações de contagem de amigos diretos e indiretos de um perfil assim como a operação que permite a contagem dos amigos em comum entre dois perfis.

As operações apresentadas neste artigo foram implementadas em stored procedures utilizando a linguagem Transact-SQL, que é a linguagem de programação do SQL Server 2000/2005. O código fonte apresentado neste artigo pode ser facilmente adaptado para outros bancos de dados ou linguagens de programação.

Recapitulando a modelagem

Na primeira parte do artigo sobre redes sociais, apresentado na SQL Magazine número 40, as principais tabelas que armazenam os dados de uma rede social genérica foram apresentadas. Para facilitar a compreensão das operações descritas nesta segunda parte, uma recapitulação das tabelas utilizadas será apresentada. No modelo de redes sociais proposto, a tabela Perfil armazena os usuários cadastrados na rede. Os detalhes pessoais de cada usuário são armazenados na tabela Detalhes, que possui um relacionamento 1-1 com a tabela Perfil por meio das colunas ID_DETALHE. A tabela Amigos armazena o relacionamento entre dois perfis, por meio das colunas ID_PERFIL_A e ID_PERFIL_B. Para representar um relacionamento entre dois perfis é necessário que duas linhas sejam inseridas na tabela Amigos: uma linha armazena o perfil de quem fez o convite na coluna ID_PERFIL_A e a outra linha armazena quem recebeu o convite na coluna ID_PERFIL_B. A coluna APROVADO da tabela Amigos deve conter o valor 1 (verdadeiro) para ambas as linhas que representam o relacionamento.

Contando os amigos

Uma operação comum em uma rede social é a contagem direta de amigos de um perfil. O termo direto, neste contexto, se refere aos amigos que foram autorizados para fazer parte do conjunto de amigos de um determinado perfil. Os demais amigos são chamados de amigos indiretos, ou seja, são agregados por serem ‘amigos dos amigos’. Veremos como fazer para descobrir os amigos diretos e, na seqüência, como descobrir quais são os amigos indiretos de um perfil.

A contagem de amigos diretos é utilizada para atualizar a coluna QTD_AMIGOS da tabela Perfil, pois quando uma nova linha é inserida ou removida nesta tabela é necessário atualizar a quantidade de amigos diretos. Na primeira parte deste artigo foi dito que o valor para esta coluna pode ser obtido com uma instrução simples de contagem sobre a tabela Amigos, porém deve-se evitar executar esta instrução por questões de desempenho. Para obter um melhor desempenho, basta incrementar em um o valor da coluna QTD_AMIGOS toda vez que um perfil autorizar um novo amigo. Quando um perfil deixa de ser amigo ou é excluído, todos os seus amigos diretos devem reduzir em um a quantidade de amigos.

Para contar a quantidade de amigos diretos de um perfil basta executar uma instrução SELECT na tabela Amigos filtrando e agregando pela coluna ID_PERFIL. Pode-se também obter uma listagem mais detalhada de todos os amigos diretos por meio do uso de joins entre as tabelas Perfil e Amigos. A Listagem 1 apresenta a stored procedure chamada ST_QTD_AMIGOS_DIRETOS que recebe o ID_PERFIL como parâmetro e, dependendo do valor fornecido ao parâmetro TIPO_RETORNO, retorna a quantidade de amigos ou a listagem completa.

 

/* ESTA PROCEDURE RETORNA A QUANTIDADE DE AMIGOS DIRETOS DE UM PERFIL */

CREATE PROCEDURE ST_QTD_AMIGOS_DIRETOS @ID_PERFIL INT, @TIPO_RETORNO BIT

AS

BEGIN

         /* CASO O PARÂMETRO @TIPO_RETORNO FOR 0, RETORNA APENAS A QUANTIDADE */

         IF @TIPO_RETORNO = 0

                  SELECT COUNT(*) AS QTD

                  FROM AMIGOS

                  WHERE ID_PERFIL_A = @ID_PERFIL

                  AND APROVADO = 1

                  GROUP BY ID_PERFIL_A

         ELSE

         /* CASO O PARÂMETRO @TIPO_RETORNO FOR 1, RETORNA MAIS INFORMAÇÕES*/

                  SELECT A.ID_RELACIONAMENTO

                        , A.ID_PERFIL_A

                        , P.NOME_PERFIL

...

Quer ler esse conteúdo completo? Tenha acesso completo