Pergunta

Estou usando o Firebird 2.1 e estou procurando a melhor maneira de resolver esse problema.

Estou escrevendo um aplicativo de calendário. As entradas de calendário de diferentes usuários são armazenadas em uma grande tabela de calendário. Cada entrada do calendário pode ter um conjunto de lembrete - apenas um lembrete/entrada.

Estatisticamente, a mesa do calendário pode crescer para centenas de milhares de registros ao longo do tempo, enquanto haverá muito menos lembretes.

Preciso consultar os lembretes constantemente.

Qual é a melhor opção?

A) Armazene as informações dos lembretes na tabela de calendário (nesse caso, vou consultar centenas de milhares de registros para iSreminder = 1)

B) Crie uma tabela de lembretes separada que contém apenas o ID das entradas do calendário que têm lembretes e consulte as duas tabelas com uma operação de junção (ou talvez crie uma exibição sobre eles)

C) Posso armazenar todas as informações sobre lembretes na tabela de lembretes e, em seguida, consulte apenas esta tabela. A desvantagem é que algumas informações precisam ser duplicadas em ambas as tabelas, como para mostrar o lembrete, precisarei saber e armazenar o tempo de início do evento na tabela de lembretes - portanto, estou mantendo duas tabelas com os mesmos valores.

O que você acha?

E mais uma pergunta: a tabela de calendário conterá o calendário de vários usuários, separados apenas por um campo de Usuário. Como pode haver apenas 4-5 usuários, mesmo que eu coloque um índice nesse campo, sua seletividade será muito ruim - o que não é bom para uma tabela com centenas de milhares de registros. Existe uma solução alternativa aqui?

Obrigado!

Foi útil?

Solução

Existem vantagens e desvantagens nas três opções. O Whis é melhor depende dos detalhes que você não forneceu. Em geral, não se preocupe muito em selecionar três ou quatro entradas em cem mil, desde que os índices que você configurou permita a estratégia de recuperação correta. Se não entender a indexação, é provável que você esteja com problemas, independentemente das três opções que você faz.

Se fosse eu, eu iria com a opção B. Eu também armazenaria qualquer atributo de um lembrete na tabela para lembretes.

Tenha muito cuidado se você identificar um evento apenas pelo EventID ou por (UserID, EventID). Se você escolher o último, cabe a você usar uma chave primária composta para a tabela de eventos. Não se preocupe muito com as chaves primárias compostas, especialmente com o Firebird.
Se você declarar uma chave primária composta, esteja ciente de que o declarando (UserID, EventID) não terá as mesmas consequências que a declaração (eventID, userID). Eles são logicamente equivalentes, mas a estrutura do índice gerado automaticamente será diferente nos dois casos.

Por sua vez, isso afetará a velocidade de consultas como "Encontre todos os lembretes para um determinado usuário".

Novamente, se fosse eu, eu evitaria a escolha C. A introdução de redundância prejudicial em um esquema carrega consigo a responsabilidade por uma programação muito cuidadosa ao atualizar os dados. Caso contrário, você pode acabar com um banco de dados que armazena versões contraditórias do mesmo fato em diferentes locais do banco de dados.

E, se você realmente deseja saber o efeito sobre o desempenho, tente as três maneiras, carregue com dados de teste e faça seus próprios benchmarks.

Outras dicas

Eu acho que você precisa criar dados realistas e falsos do usuário e medir a diferença com algumas consultas típicas que você espera executar.

A indexação, a otimização de consultas e os tipos de resultados de consulta necessários podem fazer uma grande diferença; portanto, não é fácil dizer o que é melhor sem saber mais.

Ao escolher a opção (a) você deve

  • Forneça um índice em "Isreminder" (ou um índice combinado no Isreminder, UserID, o que quer que seja melhor para as perguntas pretendidas)
  • Certifique -se de que suas consultas use este índice

A Opção B é preferível a um se você tiver mais do que um sinalizador booleano para cada lembrete para armazenar (por exemplo, o número de minutos em que o usuário deve ser notificado antes do evento). No entanto, você deve adivinhar com que frequência em seu programa terá que ingressar nas duas tabelas.

Se puder, evite a opção C. Se você não quiser comparar todos os três casos, sugiro começar com A ou B, de acordo com as circunstâncias descritas, e provavelmente a solução que você escolher será rápida o suficiente, para que você não tem que se preocupar com os outros casos.

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