[firebase-br] Pontuação por Niveis AJUDA

Eduardo C ecostas em gmail.com
Qui Abr 29 16:16:01 -03 2010


Oi.

Acabei de ler as mensagens e não parei para pensar, por isso me
desculpem se estiver colocando bobagem. Mas me parece que uma solução
simples talvez fosse criar uma hierarquia de baixo para cima. Por
exemplo, se ninguém me indicou, não há ninguém acima de mim. Se eu
tenho pai, ou seja, acabei de ser indicado por alguém, devo ver se
tenho avô, supondo que cada nó nessa estrutura tenha somente um nó
pai, e assim sucessivamente. Em uma primeira simplificação, eu poderia
ter duas tabela assim:
pontos (nodo, total-de-pontos) e
espalhamento  (nodo, nodo-ascendente, nível-de-ascendência,
numero-de-pontos). As chaves poderiam ser, respectivamente, (nodo) e
(nodo, nodo-ascendente) e as atualizações seriam algo como
update pontos inner join espalhamento on pontos.nodo=espalhamento.nodo
set total-de-pontos = total-de-pontos + espalhamento.numero-de-pontos
where pontos.nodo="eu"

ou seja, em uma operação atualizarei todos os meus ascendentes
diretamente afetados. O trabalho extra será somente na inclusão de um
nodo na tabela pontos, pois será necessário já verificar quais são
seus ascendentes mas acredito que ninguém vá mudar de pai ou avô,
exceto em caso de teste de DNA ;)

Naturalmente, o número de pontos poderia estar em uma tabela adicional
bonificacao (nível-de-ascendência, numero-de-pontos), o que
facilitaria a manutenção, por exemplo, se os nodos-pai passarem a
ganhar um ponto a mais.

Se, depois de algum tempo, decidirem bonificar um nível a mais,
bastará procurar em Espalhamento os nodos com nivel-de-ascendencia =
N, achar os respectivos pais (nivel-de-ascendencia=1) e inserir em
Espalhamento, ou seja, os nodos que tinham menos de N ascendentes não
serão afetados, alguns nodos com N ascendentes também não serão
afetados por não terem mais um ascendente e os demais nodos passarão a
ter N+1 ascendentes.

Como disse no início, me desculpem se não entendi o problema ou falei
bobagem, pois não parei para pensar e estou atendendo clientes nesse
momento. E também pela falta de formalidade na solução.

Eduardo

Em 29 de abril de 2010 14:40, Alysson Azevedo <agalysson em gmail.com> escreveu:
> Sim, eu concordo que é mais elegante a maneira do rodrigo, mas ainda assim
> deve se avaliar a possivel extenção do sistema de pontuação vs a
> simplicidade de fazer criar os 5 campos...
>
> em um, vc podera almentar pra 6, 10, 1000 niveis... mas com o inconveniente
> de ter que selecionar o primeiro nivel, somar os pontos dele e pegar o cod
> do segundo nivel e depois selecionar o segundo, atualizar e conseguir o
> terceiro.... dependendo de como está o banco, pode ser um pouco chato...
>
> ja no outro, vc terá os 5 niveis no mesmo record, faltando apenas os
> updates...
> e num precisa verificar em qual nivel vai gravar...
> a ideia é que os 5 niveis pais de um registro é repectivamente o id, pai1,
> pai2, pai3 e pai4 do indicador...
>
> agora, cabe ao Robson decidir com qual opção ele se indentifica...
> --
>
> Alysson Gonçalves de Azevedo
> (11) 8491-7730
>
> (\(''^_^ )/)
>
> "Se realmente deseja ter alguma coisa nesta vida, você deve trabalhar para
> consegui-la. Agora, silêncio! que eu quero ouvir os números da loteria...."
> - Homer Simpson
>
>
> Em 29 de abril de 2010 14:22, Alexandre Sousa
> <dave.malkavian em gmail.com>escreveu:
>
>> Rapaz, eu ficaria com a idéia do Rodrigo. É mais expansível.
>>
>> Você poderia colocar uma trigger para verificar a quebra dos 5 níveis,
>> mantendo a regra de negócios atual mas permitindo que a qualquer momento
>> possa ser expandida.
>>
>> Na tabela bastaria colocar um código que se relaciona com um registro da
>> própria tabela (auto-relacionamento), tipo:
>>
>> CREATE TABLE CLIENTES(
>>  CODIGO integer not null,
>>  NOME varchar(50),
>>  .
>>  .
>>  .
>>  CODIGO_INDICADOR integer)
>>
>> Se o código indicador é nulo, esse cara é uma raiz. Senão, foi indicado por
>> alguém. Basta um algoritmo recursivo como o Rodrigo mencionou para montar a
>> árvore toda.
>>
>> A implementação no sistema inclusive fica mais fácil, afinal vc não
>> precisará verificar em qual dos 5 campos vc vai gravar: basta inserir um
>> novo registro com o código indicador preenchido.
>>
>> Para calcular a pontuação basta ver a altura da árvore. Pelo que percebi
>> existe um padrão à medida que se aumenta um nível.
>>
>> []'s
>> Alexandre Sousa
>>
>> ----- Original Message ----- From: "Alysson Azevedo" <agalysson em gmail.com>
>> To: "FireBase" <lista em firebase.com.br>
>> Sent: Thursday, April 29, 2010 2:04 PM
>> Subject: Re: [firebase-br] Pontuação por Niveis AJUDA
>>
>>
>>
>> Rodrigo, essa ideia é boa, pois permite que um pai filhos, netos e etc sem
>> limites...
>> mas no caso do amigo ali, onde é necessario especificamente tenha 5 niveis,
>> o seu metodo fica um pouco exagerado...
>> sem contar o trampo que vai dar pra calcular os pontos de cada um...
>> se criando 5 campos, igual allan disse, pra calcular ficaria um simples
>> update para cada id que estao nos 5 campos..
>> acho que é mais simples e igualmente eficaz...
>> --
>>
>> Alysson Gonçalves de Azevedo
>> (11) 8491-7730
>>
>> (\(''^_^ )/)
>>
>> "Se realmente deseja ter alguma coisa nesta vida, você deve trabalhar para
>> consegui-la. Agora, silêncio! que eu quero ouvir os números da loteria...."
>> - Homer Simpson
>> ______________________________________________
>> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
>> Para saber como gerenciar/excluir seu cadastro na lista, use:
>> http://www.firebase.com.br/fb/artigo.php?id=1107
>> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>>
>> ______________________________________________
>> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
>> Para saber como gerenciar/excluir seu cadastro na lista, use:
>> http://www.firebase.com.br/fb/artigo.php?id=1107
>> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use: http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>




Mais detalhes sobre a lista de discussão lista