Fórum - como controlar posts vistos? - PHP - Portugal-a-Programar
Fórum - como controlar posts vistos?
By socopo,
February 24, 2011 in PHP
Este foi um problema que me surgiu num projecto o ano passado e ainda hoje não sei ao certo qual a melhor maneira de o resolver.
Neste projecto implementei um fórum criado por mim de raiz mas não implementei a 100% esta "feature" porque achei que guardar os dados das visualizações dos tópicos pelos utilizadores iria originar uma grande carga de dados. P.e. tenho uns 500 utilizadores e já foram feitos 3000 tópicos então essa tabela para guardar os nº de posts vistos num tópico por cada utilizador iria ter 1500000(500*3000) de entradas o que é uma coisa absurda no meu ponto de vista.
O que eu implementei foi apenas guardar os tópicos já vistos e só nesses é que iria ter atenção para informar o utilizador que tem algo lá que ainda não viu.
Gostava de saber se alguém conhece uma técnica melhor ou se realmente a que falei aqui é a mais usada/recomendada.
P.s. Não tenho interesse em códigos nem em CMS. Só quero mesmo a opinião/fundamento/informação porque eu até já entreguei o projecto a algum tempo atrás.
Acho que não há grande volta a dar a isso. A informação tem de se guardada nalgum lado, e qualquer que seja a maneira, quantos mais tópicos e utilizadores tiveres, mais registos vais ter. Das melhores coisas que podes fazer é criar apenas os registos quando são efectivamente visualizados, e não um estado visto/não visto.
No melhor caso, em que tens 500 utilizadores, e 3000 posts, assumindo que ninguém se interessa pelo fórum, e a única pessoa que visualiza os posts é o próprio, vais ter 3000 registos. No pior caso, basicamente todos vêem tudo, e é o número que concluíste (500*3000).
As bases de dados normalmente estão preparadas para grande volumes de dados. Para acelerar as coisas, podes usar índices, e ter a base de dados convenientemente relacional, para que apenas necessites dos ID's de utilizadores/posts.
Obrigado a ambos pelas respostas, não sei como não encontrei essa discussão na altura podia ter ajudado.
Portanto a conclusão que chego é que a solução que arranjei ainda tá melhor que as que se usa por aí. Pelo menos as que estão referidas nessa discussão.
Guardar como lido só quando o tópico é lido e guardar o nº de posts desse tópico. Pensei que a minha solução não resolvia tudo mas afinal resolve basta ver se o utilizador tem registado a visualização nesse tópico e comparar o nº de posts q foi visto e o total no momento, se não tiver registado ainda n viu.
Acho que a minha solução tá muito boa em comparação com essas mesmo! O que acham? Se não perceberam digam que eu tento explicar melhor porque agora não tenho muito tempo
Essa hipótese já foi discutida em termos semelhantes, mas o acesso ao tópico é restrito. Basicamente quando um user acedia a um tópico pela primeira vez, é como se estivesse a subscrevê-lo. A viabilidade disto varia conforme o caso.
Sim, e é basicamente isso que se pretende. Saber que tópicos ainda não vi e dos quais já vi se há mensagens/posts novos.
Já reparei que nem todos os fóruns se preocupam com isto, p.e. este em que estamos apenas "vigião" os fórums totais e os tópicos onde estou.
Acho que não há nada a acrescentar, esperava que alguém surgisse com uma solução surreal que me deixasse por não me ter ocorrido eheh. Mas já agora uma coisa que não me tinha ocorrido também é usar a cache que ao inicio me pareceu genial mas agora já não sei até que ponto poderia ajudar. Talvez guardar os totais de posts nos tópicos e o nº de posts vistos?
Nota- A solução que usei é basicamente o mesmo que o uso de timestamp (acho eu) para comparar o do ultimo post feito com o ultimo que eu vi (que registado quando vejo um tópico)
O link que postei anteriormente tem lá uma alternativa ao comum uso de timestamps, para saber as mensagens que um user viu dentro de um tópico. Mais uma vez, é viável dependendo dos casos. Não há uma boa solução para o assunto (e.g. leve e completa).
Assim de repente... também acho viável "vigiar" os timestamps dos objectos alterados, fazendo "subir" o timestamp de um objecto alterado. Entenda-se por objecto:
resposta -> topico -> categoria -> forum
Quando uma resposta é adicionada/alterada, sobe recursivamente o timestamp até ao forum. Na proxima visita é comparar os timestamps do user pelos timestamps dos objectos alterados... se se quiser indicar as respostas/tópicos "alterados", devolve um dataset maior, se se quiser indicar apenas as categorias que o user visitou e que foram "alteradas" devolve um dataset mais pequeno...
Quando uma resposta é adicionada/alterada, sobe recursivamente o timestamp até ao forum.
Isso dá problemas. Só interessam os timestamp dos níveis inferiores, e.g. posts. Da maneira que estás a dizer, ou do que entendi dela, se abrisses um tópico por ler, ele marcava as secções hierarquicamente acima como lidas, que é o que acontece no SMF e eu não gosto por nada. O resultado é que se tivesses 2 tópicos por ler, ao leres um deles a secção ficava marcada como lida quando tal era falso.
Sim o mais realista é mesmo só marcar os posts. E quando queres saber se um tópico tá lido vais ver o total de posts. Deve haver umas técnicas para diminuir a carga tanto de memória como de querys. Por exemplo, ocorreu-me agora, q ao guardar o nº de posts lidos (como nos meus exemplos anteriores) quando é feito um post, actualizar o campo total de posts no tópico com um trigger. Isto diminuía um pouco a carga das querys mas por outro lado não sei até que ponto podia dar problemas com mais que um post no mesmo segundo.. Acho que também é rara a situação e deve haver um queue ou algo para n haver "colisões".
Outra coisa, imagina que entrei hoje neste fórum pela primeira vez e tem tópicos já antigos com mais de um ano. Até que altura consideras que os topos devem estar "por ler", visto que de certeza não vou desenterrar todos os tópicos antigos.
Este sem duvida é um problema interessante e acredito que a solução optima será qualquer coisa complexa
P.S. Não liguem muito pq contrariei-me um bocado :smoke: já é efeito do sono
2 meses, por aí.
Da maneira que estás a dizer, ou do que entendi dela, se abrisses um tópico por ler, ele marcava as secções hierarquicamente acima como lidas, que é o que acontece no SMF e eu não gosto por nada. O resultado é que se tivesses 2 tópicos por ler, ao leres um deles a secção ficava marcada como lida quando tal era falso.
Não... estou a dizer para marcar o timestamp no topico se se criar um post, e não quando se lê. Quando o user lê, atualiza-se o timestamp no dataset do user. Na proxima visita, compara-se os timestamps, e elimina-se do dataset do user os topicos que não foram alterados à mais de x tempo, para que na proxima visita a comparação entre os datasets seja menor. Não sei se me faço entender...
Aquilo que indiquei é util se a estratégia for mostrar ao user mais do que os tópicos que ele visitou, ou seja, mostrar os tópicos não lidos/alterados que pertencem apenas ás categorias dos tópicos já lidos.
Um algoritmo adequado para resolver um problema é sempre inerente à estrutura de dados utilizada... um forum pode ser uma tabela de posts, ou uma arvore... experimenta colocar esta questão na categoria algoritmia e lógica... eles devem ter mais alguma solução...