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.7 answers
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.
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.
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.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.
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)..