Devo usar uma tabela separada para armazenar usuários online ou devo apenas usar campos adicionais na tabela de membros existentes?

StackOverflow https://stackoverflow.com/questions/1445617

  •  22-07-2019
  •  | 
  •  

Pergunta

Eu estou trabalhando em um sistema online que permite aos usuários interagir socialmente e, claro, será importante para ser capaz de identificar os usuários que são na verdade online. Eu sei sobre HTTP sendo apátrida e eu sei sobre o uso de sessões, então eu vou precisar para alcançar este objetivo através da comparação do último tempo ativo de um usuário para um tempo de expiração arbitrária.

A minha pergunta final se resume a isto: eu deveria apenas adicionar alguns campos para a tabela de membros existentes (last_active_time, is_user_online, hide_online_status, etc) ou seria melhor ser o de manter esta informação em uma tabela separada meu pensamento inicial é usar a tabela existente para simplificar. Lado por nível de complexidade, quais são os benefícios / desvantagens de um contra o outro?

Foi útil?

Solução

Gostaria de manter isso dentro de uma tabela separada. Se você tem tem um milhão de usuários e você quer saber quem está online, você não quer ser a digitalização de que a mesa uma e outra vez para encontrar essa informação. Seu "online" da tabela será relativamente pequeno e você pode ter um trabalho que verifica periodicamente para aqueles que não vêm em no passado 5 minutos ou assim e, em seguida, simplesmente excluí-los da linha nada mesa e atualização necessária na tabela de membros para "last_seen"

Outras dicas

Criar uma nova tabela.

Em primeiro lugar, há a razão filosófica, o que é que um objeto (leia-se: tabela) deve ter um propósito. Isso fica embaçada muito em design lógico banco de dados, mas é um princípio bom no entanto.

Mas as verdadeiras razões são de design físico: em primeiro lugar, pode-se supor o número de usuários que serão registradas na qualquer momento a ser muito menos do que o número total de usuários, de modo que os requisitos de armazenamento será menor. E os requisitos de armazenamento mais baixos traduzir diretamente em carga reduzida no banco de dados, simplesmente porque você tem menos blocos para ler e atualizar.

Se você colocar esses dados em sua mesa principal, além disso, que esses blocos serão espalhados ao longo de um espaço muito mais amplo, e os conteúdos dos blocos continuamente aumentar e diminuir à medida que altera os dados.

E, finalmente, você provavelmente vai exigir alguns índices, por exemplo, para ver quem está on-line agora. E esses índices serão (1) ocupam ainda mais espaço, (2) criar ainda mais dispersos blocos sujos que têm de ser escrito fisicamente no disco, e (3) introduzir um ponto de atualização de contenção.

Eu acho que depende de quantos usuários você espera ter. Se não vão apenas para ser um par mil usuários, gostaria apenas de fazer o status online um atributo de um usuário, na tabela do usuário. Se não vão ser mais do que isso, então você vai querer uma tabela online_users, e manter essa informação lá, com uma chave estrangeira para a tabela de usuários principal. Para colher os benefícios (mencionado por cartazes acima), você vai querer uma tarefa para ser executada a cada poucas horas ou assim para remover usuários inativos da tabela online_users.

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