Pergunta

Eu estou tentando criar um sistema de pontos no meu programa semelhante ao estouro de pilha ou seja, quando o usuário faz alguma boa ação (atividade) suas / seus pontos são aumentadas. Eu estou querendo saber qual é a melhor maneira de ir sobre como implementar esta em termos de db esquema + lógica.

Eu posso pensar de três opções:

  1. Adicionar um campo extra chamados pontos na tabela de usuários, e toda vez que um usuário faz alguma coisa, adicioná-lo a esse campo (mas isso não vai ser capaz de mostrar uma atividade do tipo)
  2. Crie uma função que será executado toda vez que o usuário faz boa ação e calcula a partir do zero o valor e atualiza o campo pontos
  3. Calcular cada vez usando uma função sem qualquer campo pontos.

O que é a melhor maneira de fazer isso? Obrigado pelo seu tempo.

Foi útil?

Solução

Pessoalmente, gostaria de usar a segunda opção para abordar este problema.

A primeira funcionalidade limites de opção, então eu eliminar isso imediatamente.

A terceira opção é ineficiente em termos de desempenho - é provável que você estará buscando esse número muito , e, se o seu programa é qualquer coisa como stackoverflow, talvez mostrando (cálculo) que o número muitas vezes por exibição de página / acção.

Para mim, a segunda opção é uma solução híbrida decente. Normalmente, I ódio ter dados duplicados no meu sistema (ações e pontos, em vez de um ou outro), mas neste caso, um campo inteiro é um pequeno quantidade de espaço por usuário que você economiza um muito de tempo para recalcular os valores desnecessariamente.

Temos que, às vezes, o espaço de armazenamento de dados comercial para desempenho ou vice-versa, e eu diria que # 2 é um trade-off que beneficia muito da aplicação.

Outras dicas

Isso depende muito do número de cálculos esperado que você vai enfrentar. Na verdade, tão aparentemente usa um método que é semelhante ao seu) abordagem 1, por motivos de desempenho que eu assumir.

Isso também impede que salta nos números se a mudança fatores (como itens que concedeu pontos, ou aqui no respostas até que se tornam wiki comunidade apagados, mudanças nas regras de ponto, acções externas, tais como juntar outra conta aqui no SO etc. )

Se uma solução recalc (2) é o que você quiser, você pode implementar um cache "inteligente", limpando o valor (definindo-o como NULL o que significaria "sujo") cada vez que uma modificação ponto pode ter lugar, e re -computing-lo quando ele é NULL, usando o cache de outra forma. Você poderia também (como uma medida de auto-correção quando as coisas não-explícitas aconteceu) limpar os valores depois de uma hora, um dia ou o que você acha abetos de modo que um recalc é forçado depois de um certo tempo, independentemente do estado "sujo" .

Gostaria de ir para 1 e 2 (executado no cron em cada minuto ou assim).

Assim que: - campo extra agiria como um cache para a quantidade de pontos. -. A função para calc os pontos poderia ser uma única consulta sql que recalcular os pontos para todos os usuários de uma vez para ganhar um pouco de velocidade

Eu acho que recalcular o campo cada vez que ponto é recebido seria um exagero.

Pessoalmente, eu iria com a primeira opção, e adicionar uma tabela "ações" para manter o controle de seu histórico de atividades.

Quando um usuário faz algo bom, que recebem uma entrada na tabela "Actions", com a ação e alguns valor de ponto. O valor do ponto pode vir de outra tabela, ou algum arquivo de configuração. Esse mesmo valor é adicionado ao registro do usuário.

Em qualquer ponto no tempo, você poderia resumir as ações e obter o total de usuários, mas para o desempenho, simplesmente atualizando quando você adicionar o registro de ação seria suficiente simples.

Como simples é o seu sistema de pontos vai ser? Acho algum tipo de logging / journalling é bom para que você possa controlar a atividade em um semanal / diariamente / mensal para todos os usuários

Confira http://code.google.com/p/userinfuser/

O seu código aberto e permite que você adicione pontos e crachás para a sua aplicação. Tem Java, Python, PHP e ligações Ruby.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top