Que estabelece um esquema de base de dados para um pedido de calendário

quero escrever uma aplicação de calendário. É realmente itens recorrentes que lançam uma chave nos trabalhos para o esquema DB. Gostaria de saber como organizar isto.

E se um utilizador cria um evento e introduz que repete toda a gente na segunda-feira, para sempre? Como poderia guardar tudo isso na base de dados? Não posso criar eventos infinitos. Será Que eu simplesmente colocar uma tabela lá que contém a informação relevante para que eu possa calcular para onde todos os eventos vão? Se assim fosse, teria de calcular eles cada vez que o usuário vê uma nova parte do calendário. E se eles pagarem através dos meses, mas eles têm uma tonelada de itens recorrentes?

Além disso, o esquema precisa de ser tratado quando um utilizador clica num item e diz "edite este na sequência" nem todos os itens na sequência. Divido então o único item da sequência?

actualizar 1

Ainda não olhei para o iCal. Para ser claro, eu acho que salvar a informação que lhe permite calcular os itens recorrentes, e separar qualquer que seja diferente da sequência é uma ótima maneira de armazená-la para ser capaz de transferi-la. Mas eu acho que em uma aplicação, isso seria muito lento, para fazer a matemática de encontro por todo o lado.

Author: Anthony D, 2009-06-04

7 answers

Recentemente criei uma aplicação de calendário e este foi um dos muitos desafios que enfrentei. Acabei por arranjar uma solução semi-hack-ish. Criei uma coluna event_type. Nessa coluna, eu tinha: "diário", "semanal", "mensal", ou "anual". Também tive uma data inicial e uma coluna final. Tudo o resto foi tratado no código da infra-estrutura. Nunca tentei dividir um evento se um utilizador editasse apenas um evento. Não era necessário na situação. No entanto, poderá dividir um evento alterando a data final do primeiro, criando um novo evento com uma nova data de início e a data final do original e, finalmente, um novo evento para o que acabou de editar. Este processo acabaria por criar 3 eventos. Hack-ish, eu sei. Não consegui pensar numa maneira inteligente de lidar com este problema na altura.
 12
Author: JasonV, 2009-06-03 21:15:37

Tenho estado a debater-me com o mesmo problema, e estava a brincar com a ideia da "tabela de cache" sugerida acima, mas depois deparei-me com uma alternativa (sugerida aqui) que parece ainda não ter sido representada.

Construir uma tabela contendo todos os Eventos

EventID (primary key)
Description
StartDate
PeriodType - days, weeks, months, years
PeriodFreq - # of days, weeks, etc between events
EndDate
... other attributes that can be modified

Depois adicione uma tabela para excepções a estes eventos. Esta tabela usa uma chave composta, composta do EventID que mapeia para a tabela de eventos, e um ID de instância para escolher o particular evento da série.

EventID (key)
InstanceID (key)
InstanceDate - the modified date of the exception 
IsCancelled - a flag to skip this date when traversing the series
... other attributes that can be modified

Parece manter a tabela de eventos normalizada, e evita a divisão de séries para lidar com exceções.

 13
Author: Justin, 2012-05-19 11:05:07

Porque não usar o Calendário Google como base de dados para esta aplicação de calendário, baseando-se na API do Calendário Google para armazenar e recuperar eventos de calendário?

A API do calendário é uma API de descanso que pode ser acedida através de chamadas HTTP explícitas; a API expõe a maioria das funcionalidades disponíveis na interface web do Calendário Google, para que a sua aplicação do calendário possa ter tantas funcionalidades como o Calendário Google (muitas funcionalidades!!!).

A sua aplicação só necessita de implemente o OAuth 2.0 para o Google APIs, que pode ser facilitado através de um serviço de sinal único como Auth0 para fornecer os tokens de acesso apropriados. Em seguida, sua aplicação de calendário pode usar estes tokens em conjunto com a API de calendário para fornecer armazenamento e recuperação sem descontinuidades de eventos de calendário em um formato JSON.

Os utilizadores criam eventos dentro do seu próprio "Novo Calendário"."Este calendário é partilhado consigo sob a forma de uma conta gmail dedicada a esta aplicação - a conta gmail da aplicação .

Basicamente, o Google Calendar torna-se a sua base de dados, em que você pode ter a conta do gmail da aplicação não só armazenar todos os eventos da sua aplicação, mas também permitir-lhe ver e editar estes eventos com uma interface intuitiva.

 4
Author: Brendorien, 2016-07-05 10:44:47

Mantenha o item recorrente na tabela de eventos como normal, mas assinalado como recorrente com as datas de início/ fim apropriadas.

Se o utilizador modificar uma única instância da nomeação, basta criar um novo evento, talvez com um 'parentId' igual ao id do evento recorrente.

Construir a lógica que faz com que o calendário sobreponha quaisquer eventos recorrentes num determinado dia com eventos com IDs-mãe correspondentes.

A tua pergunta sobre o desempenho é basicamente a velha velocidade. vs. armazenamento. Eu realmente não acho que o cálculo requerido excederia a exigência de espaço para armazenar tantos compromissos. Basta ler sobre a otimização de banco de dados - indexação etc.
 2
Author: ChristianLinnell, 2009-06-03 21:21:07
Poderia fazer a ponte entre os dois mundos com uma tabela de" cache", na qual você pré-calcula os próximos X dias de eventos?

Então, três tabelas:

recurring_event_specs
one_time_events
cached_recurring_events

Para qualquer parte do calendário no prazo de X dias de hoje, a sua consulta irá unir one_time_events e cached_recurring_events.

Então você só teria que fazer cálculos de data em tempo real se o usuário tentasse olhar para uma parte do calendário mais de X dias no futuro. Eu imagino que você poderia encontrar um X são que cobriria a maioria do normal usar.

A tabela cached_recurring_events teria de ser actualizada sempre que um utilizador adiciona um novo evento recorrente -- e possivelmente uma vez por dia desligado, por uma tarefa de cron-job/agendada. Mas só nos dias em que não foi criado nenhum novo evento recorrente.

 2
Author: Ben Dunlap, 2009-06-03 21:32:13

A melhor maneira de fazer isto é armazenar uma cadeia de padrões baseada no padrão de recorrência (iCal).. e deixa em branco se for um único evento. Existem algumas APIs que podem processar o padrão de recorrência e criar objetos de eventos que você pode se ligar aos elementos UI.... nenhuma das ocorrências precisa ser armazenada na base de dados, apenas o evento inicial (ocorrência)..

 0
Author: Daniel Bardi, 2010-09-16 05:33:59
Não podias guardar os eventos por dia com o início e o fim da hora? Ele irá gerar um monte de dados para eventos que acontecem todos os dias (talvez ir não-relacional para isso), mas vai tornar mais fácil a consulta e será possível fazer exceções (por exemplo, o local do evento incendiado, ou os funcionários são impressionante). Para gerar os dias para o evento eu sugeriria para implementar isso no front-end derivado em algum padrão ICal-ish.
 0
Author: Pepster, 2014-05-23 09:05:12