← PHP

Script em PHP para estatísticas de ganhos

Lida 8512 vezes

Offline

Gonçalo Martins 
Membro
Mensagens 229 Gostos 0
Troféus totais: 26
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

Em relação às 2 soluções, não sei qual delas a mais eficiente/rápida.

Mas a 2ª parece-me problemática, quando tentares por uma aplicação/site a usa-la.

Problemas de vejo na segunda solução:

- Deixas de ter vários inserts por dia, passas a ter vários updates...
o problema dele não está nos inserts está nos selects que se podem tornar extremamente longos
Citar
- Tens que ter lógica implementada, para ver se é o 1º acesso do dia, para saber se fazes um update ou insert..
http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

Citar
- Do que me parece, não podes fazer querys a BD, pelo menos de forma natural
    -Saberes a media de ganhos de o utilizador num dia. <- (MODIFICA A TABELA E INTRODUZ + 1 LINHA -NUMERO CLIQUES que incrementa)
    -Saberes o utilizador com mais ganhos... etc
    -Não podes fazer nenhum select que use os ganhos, para fazer ordenação, condições etc...

- Ficas com menos linhas, para teres selects mais rápidos, mas isso obriga a que tenhas que implementar lógica e processamento sobre os resultados do select que fizeres no site, em php ou o que for...
dai lhe ter dito que para estas coisas, deveria implementar cache! a tua opção, com o tempo irá gerar muitas linhas na tabela é sempre pior que calculos e intrepertação da string. (mas sem certezas, testes e + testes)



mas isto é estranho... entao com o facto de ter ou nao aprovar ganhos realmente aquilo é tiro no pé, nessa coluna dos segundos.ganhos nao se deveria editar mas sim so utilizar o concat do mysql....

se tem dados para aprovar provavelemente estes dados deveriam ficar inacessiveis até serem aprovados num formato de tabela difrente... este sim na forma | id | iduser | segundo | ganho

quando este dados fossem aprovados pelo admin seria introduzidos com o concat na outra tabela e seria eliminada esta linha


a minha solução +-normalizada ficaria assim
1) idn | nome
2) idg | idn | ganhos | cliques | dia
3) ids | idg | segundo | ganho <-começaria a crescer com o tempo select a demorar tempo - nao me parece que algo como o analytics utilize algo assim para cada guardar info relativa a cada visitante de cada site... ;)
4) tabela de ganhos temporarios
ou
3 ids | idg | segundo | ganho | aprovado

mas sim reconheço que este caminho poderá ter problemas.... mas qual será o "pior mal"? cabe a programador saber o que o programa requer e optar pela opção mais rápida. Testes e mais testes...
Offline

Gonçalo Martins 
Membro
Mensagens 229 Gostos 0
Troféus totais: 26
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

Estive a pensar na coisa...
tabela normalizada = maior velocidade de escrita , menor velocidade de leitura
tabela desnormalizada = maior velocidade de leitura, menor de escrita

o que nos leva a um problema a introdução dos dados a velocidade razoavel, e uma leitura tambem razovel... temos que optimizar a coisa e tentar ter o melhor dos dois mundos...

1) idnome | nome | outros dados utilizador
2) idganho | idnome | data | ganho | cliques | timestamp - ganho
3) idnome | dia | hora/segundo | ganho

*todos os INSERtS de novos dados serão realizados à tabela 3) introduzindo uma nova linha. são dados temporarios onde será necessária aprovação.

* x em x tempo (ou quando os dados são aprovados -  se for automatico pode ser um script a correr asicronamente no servidor), ocorre o UPDATE OU criação de linha na tabela 2) e o DELETE das linhas em 3), de forma a impedir o crescimento da tabela.

* utilizar cache quando fazes alguma operação de php com a ultima coluna da tabela 2)
Offline

Manuel Moreira 
Membro
Mensagens 228 Gostos 0
Feedback +1

Troféus totais: 20
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 100 Posts 50 Posts

Está a tornar-se interessante esta discussão...

Sem mais demoras vou levantar mais um pouco a ponta do véu acerca da aplicação que usará essas tabelas.

Irão existir de facto apenas 2 tabelas:

- a dos utilizadores e todos os seus dados
- a do registo de ganhos

Porque não uma terceira com os ganhos a aprovar? Estes serão rastreados por outro site. Portanto o tamanho e até existência dessa terceira tabela não se coloca.

Adiante, a tabela dos ganhos apenas terá registados ganhos confrmados (aliás, manualmente confirmadíssimos), por isso, cada registo que lá for concatenado, já estará confirmado e não necessitará de alterações futuras (só em caso muito excepcionais que por agora não preconizo).

Mais, com php consigo perfeitamente extrair da linha dos ganhos de cada dia os dados que preciso. Por exemplo:

IDuser | data | timestamp1 - valor do ganho1 - tipo de ganho1 # timestamp2 - valor do ganho2 - tipo de ganho2...

Um user regista ganhos pela primeira vez num dia? Crio uma linha nesta tabela e no formato referido.

O user regista mais que um ganho no mesmo dia? Pesquiso se já há alguma linha criada no dia em causa e havendo concateno os dados ao 3º campo.

Para o user ver os ganhos desse dia, select à tabela para esse dia e retorno o resultado com ajuda de um "explode" e fazendo a soma dos ganhos. E tenho selects rápidos.

Para ver que ganhos foram registados pelo user num mês, Select outra vez e ...

Ou seja, parece-me viável esta estrutura e permite não só ter uma base de dados de tamanho "normal" como também permite ao user ter os dados á sua frente de forma rápida.

Do lado do backoffice, não me parece que se levantem grandes problemas de gestão dos utilizadores e dos seus ganhos.

JTK o meu problema é já ter criado uma tabela que demorava "horas" a fazer selects para ver por exemplo os ganhos de um mês para cada utilizador, pois tinha a estrutura do tipo: IDuser | IDganho | hora | valor do ganho. Ou seja, para  cada ganho tinha uma nova linha na tabela. Logo, tinha selects muito lentos e já para não falar que esta tabela com o tempo ficaría enorme.

Daí que ache que esta estrutura proposta pelo Gonçalo seja a mais adequada para mim. Não quer dizer que em outros casos a tua proposta não seja boa. Mas, no meu caso e eu como ninguém sei aquilo que se adequa mais ao meu problema, penso ser esta a melhor solução.

Mas, estou aberto a soluções diferentes, ou não teria colocado este tópico em discussão :)

De novo, obrigado pela colaboração de todos.

PS: Do lado do backoffice, algo que queria preservar era a hora e até segundo exacto a que é registado um ganho e com este formato saberei sempre isso com a ajuda do timestamp e também saberei que tipo de ganho foi registado e o seu valor. Tudo no campo 3: "timestamp1 - valor do ganho1 - tipo de ganho1".


Cumps
MM