Pergunta

Eu estou trabalhando em um site com um banco de dados normalizado simples.

Há uma tabela chamada páginas e uma tabela chamada Views. Cada vez que uma página é visualizada, um registro único de que a visão é gravado na tabela Views.

Ao exibir uma página no site, eu uso um COUNT MySQL simples () para somar o número de visualizações para exibição.

O projeto de banco de dados parece bem, exceto para este problema:. Eu estou em uma perda para saber como recuperar o top 10 páginas mais vistas entre milhares

Devo desnormalizar tabela de páginas, adicionando uma coluna Pages.views para manter o número total de visualizações para cada página? Ou há uma maneira eficiente de consulta para as 10 páginas mais vistas?

Foi útil?

Solução

   SELECT p.pageid, count(*) as viewcount FROM 
   pages p
   inner join views v on p.pageid = v.pageid
   group by p.pageid
   order by count(*) desc   
   LIMIT 10 OFFSET 0;

Eu não posso testar isso, mas algo nesse sentido. Eu não armazenar o valor a menos que eu tenho que devido a restrições de desempenho (Eu só aprendi o termo "otimização prematura", e parece ser aplicável se você faz).

Outras dicas

Depende do nível de informação que você está tentando manter. Se você deseja gravar que viram quando? Em seguida, a mesa separada está bem. Caso contrário, uma coluna para Views é o caminho a percorrer. Também se você manter uma coluna separada, você verá que a tabela será bloqueado mais frequentemente uma vez que cada exibição de página tentará atualizar a coluna para sua linha correspondente.

Select pageid, Count(*) as countCol from Views
group by pageid order by countCol DESC
LIMIT 10 OFFSET 0;

Eu provavelmente incluir a coluna vistas na tabela de páginas.

Parece uma quebra perfeitamente razoável de normalização para mim. Especialmente desde que eu não posso imaginar que você apagar vistas de modo que você não esperaria a contagem para sair da pancada. A integridade referencial não parece super-crítica neste caso.

normalização de dados é tudo sobre a forma mais eficiente / menos redundantes para armazenar dados. Isso é bom para o processamento de transações, mas muitas vezes entra em conflito direto com a necessidade de obter de forma eficiente os dados novamente. O problema é geralmente dirigida por ter tabelas derivadas (índices, visualizações materializadas, tabelas cumulativos ...) com os dados mais acessíveis, pré-processados. O (um pouco datado) buzzword aqui é Data Warehousing.

Eu acho que você quer manter sua mesa Páginas normalizada, mas tem uma tabela extra com os totais. Dependendo de como recente aqueles contagem precisa ser, você pode atualizar a tabela quando você atualizar a tabela original, ou você pode ter um trabalho de fundo para recalcular periodicamente os totais.

Você também quer fazer isso apenas se você realmente correr em um problema de desempenho, que você não vai a menos que você tem um número muito grande de registros, ou um grande número de acessos simultâneos. Mantenha o seu código flexível para ser capaz de alternar entre ter a mesa e não tê-lo.

desnormalizar iria trabalhar neste caso. Sua perda é a sala de armazenamento extra utilizado pela coluna extra.

Alternativamente, você pode configurar uma tarefa programada para preencher esta informação numa base diária, sempre que o seu tráfego é baixa, período x de tempo.

Neste caso, você estaria perdendo a capacidade de saber instantaneamente suas contagens de páginas a menos que você executar essa consulta manualmente.

Desnormalização definitivamente pode ser empregada para aumentar o desempenho.

- Kris

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