Closed josircg closed 8 years ago
Na verdade as duas opções realizam o mesmo número de consultas, na primeira opção:
Na segunda opção:
O custo de processamento da segunda opção é menor, pois é um filtro a menos.
Acabei fazendo essa issue dentro desta: #78
1) Performance: o problema que vc não prestou atenção é no tamanho de cada dataset consultado:
No primeiro algoritmo, eu faço 2 acessos ao banco:
Na segunda opção: Eu tenho que varrer todos os TópicosOuvinte (Full Table Scan) fazendo um Join com Topico verificando em cada um deles se o número está menor que o outro. Não esquece que um usuário poderá participar de centenas de tópicos ativos.
A gente tem que ficar MUITO atento desde o início com as questões de performance pois esse sistema deverá ter um número muito grande de usuários e tópicos.
Segui a primeira ideia. Só para ficar documentado:
Uma das funções mais importantes para o usuário é que ele possa saber rapidamente quantas conversas ocorreram para um determinado grupo ou tópico.
Se coloque sempre no lugar do usuário: eu acabo de entrar no fórum e tenho uns 10 grupos inscritos. Quero saber quantos grupos tiveram alguma conversação. E quando entrar no grupo, quero saber quantos tópicos tiveram conversação.
1) sempre que o usuário entra no tópico, este deve marcado com lido para o usuário corrente.
2) Podemos fazer o controle pela data de último acesso ou comparando o número de mensagens antes e depois. Na primeira alternativa, o ideal é que tenhamos um método no tópico que retorne o número quantas mensagens foram trocadas desde a última vez que o usuário visitou o tópico.
A segunda opção seria fazer o controle pelo número de mensagens. quando o usuário entrar em um tópico eu registro o número de mensagem que ele leu. Ex.: 5. Mais tarde quando o usuário foi ver a lista de tópicos, eu pego o número de mensagem do tópico corrente menos o número de mensagens lidas pelo usuário, estas seriam as mensagens não lidas. Dessa forma não precisa ser feito o controle por datas, pois não vamos precisar saber quais a que ele leu ou não, apenas o número de não lidas.
A desvantagem em termos de performance dessa segunda alternativa é que eu terei SEMPRE que contar quantas mensagens existem em CADA grupo. Na primeira alternativa, eu não faço essa contagem. Eu simplesmente uso a data corrente X a data de último acesso do usuário, ou seja, acesso menos o BD.