Debo almacenar fechas o periodicidad de las reglas en mi base de datos cuando la construcción de una aplicación de calendario?

Estoy construyendo un sitio web de calendario (ASP.NET MVC) aplicación (creo que la versión simple de outlook) y quiero empezar a apoyar los eventos de calendario de que se periódica (mensual, anual, etc)

ahora estoy almacenar fechas reales en mi pero yo quería averiguar si, con la recurrencia, ¿tiene sentido seguir para almacenar fechas (con algunas evidentes de corte), o debo almacenar las opciones de periodicidad y generar las fechas sobre la marcha.

Me puse a pensar cómo outlook, google mail, etc ¿este o cualquier otro servicio que apoya recurrentes, los elementos del calendario.

Hay alguna sugerencia sobre esto?

InformationsquelleAutor leora | 2010-11-21

7 Kommentare

  1. 47

    Separar los datos en dos partes: la «canónica» de los datos (la regla de repetición) y «servir» (generada fechas de sólo lectura a un lado de la regeneración). Si la canónica de cambios de datos, la regeneración de la «porción» de datos en ese punto. Infinito recurrencias, mantener un cierto número de casos y generar más si se ejecuta (por ejemplo, si el usuario ve en su calendario para el año 2020).

    Si había infinito a la velocidad del procesador, que solo necesitan de la canónica de datos, pero en la realidad, haciendo de la fecha/tiempo de procesamiento para todas las reglas de periodicidad en cada vista de página es probable que sea demasiado tiempo… por lo que el comercio fuera de algunas de almacenamiento (y la complejidad) para salvar de que se repite el cálculo. Almacenamiento suele ser bastante barato, en comparación con el cálculo requerido para un gran número de eventos. Si usted sólo la necesidad de guardar las fechas de los eventos, que es realmente muy barato, usted puede fácilmente usar un 4 byte entero para representar una fecha y, a continuación, generar un completo fecha/hora a partir de que, suponiendo que el recidivas son todos en función de la fecha. Para basado en el tiempo de recurrencia (por ejemplo, «cada tres horas»), se podría completo UTC instantes – 8 bytes que representan abajo a una muy buena resolución, por el tiempo como es probable que usted necesite.

    Usted necesita tener cuidado sobre el mantenimiento de validez si una reunión periódica de los cambios hoy, que no cambia cuando se ha sucedido en el pasado… por lo que probablemente quiere también han canónica de datos de sólo lectura acerca de cuando las recurrencias que realmente ocurrió. Obviamente no quieren que se mantenga el pasado para siempre, por lo que probablemente quiere «recoger la basura» eventos de más de un par de años, dependiendo de sus limitaciones de almacenamiento.

    Usted también puede necesitar la capacidad de añadir notas y excepciones (por ejemplo, «la reunión no se producen hoy en día debido a un día festivo» o «se trasladó a las 4pm») para cada ocurrencia de la base. Que se convierte en realmente divertido cuando se cambia la recurrencia – si cambia de «todos los lunes» a «cada martes» no a mantener las excepciones o no? ¿Cómo se puede incluso coincidir con las excepciones cuando usted cambia de «cada día» a «cada semana»? Estas no son preguntas que están directamente sobre almacenamiento – pero el almacenamiento de decisiones afectarán a lo fácil que es implementar cualquier política que decidir.

    • Dulce, esta es la primera vez que de la lectura/a notar una respuesta por Jon Skeet para mis propios fines 🙂 disculpad el offtopic-ness.
  2. 8

    Será necesario controlar por separado eventos y sucesos.

    EVENTO SABIO:
    Para los eventos, se deberán almacenar recurence reglas (que puede ser un rrule como especificado por rfc5545 pero también de un conjunto explícito de fechas como el rdate en rfc5545), sino también excepciones (ver exdate de rfc5545 y posiblemente exrule como en rfc2445).
    Usted también tendrá que mantener un seguimiento de los cambios en las reglas:
    Cambios en rdate, exdate no son un problema cuando se producen en el futuro y a ser ignorados por las fechas pasadas.
    Los cambios en la regla son más difíciles de impactar anteriores acontecimientos. Mi preferencia personal es agregar una propiedad específica para el antiguo y el nuevo la regla para especificar sus respectivas fechas de inicio y fin de validez.

    si el evento tiene una duración limitada en el tiempo (decir, CONTAR o HASTA que la propiedad están presentes) se debe almacenar su inicio y final en la tabla para permitir la fácil consulta de eventos (especialmente cuando se busca apariciones fuera de su precalculados de la ventana de tiempo (ver más abajo), puede ayudar a reducir el número de eventos para los que el cálculo se debe rehacer).

    APARICIONES SABIO:
    para ocurrencias debe almacenar instancias dentro de los predeterminados de la ventana actual (es decir +/- 6 meses o 12 meses y se calculan sobre una base regular) y mantener registros de este para permitir la re-cálculo si los usuarios quieren ver aún más en el futuro (por problemas de rentabilidad). usted debería considerar también la posibilidad de calcular el índice de RECURRENCIA-ID) para ayudar a los más fáciles de encontrar de la siguiente ocurrencia.

    menos en el back-end, pero más en el front-end debe también mantener un seguimiento de tzid cambios para preguntar al usuario si un evento que estaba programado en un determinado tzid si es la intención de permanecer en la zona horaria de esto necesita ser actualizado (piensa en alguien en la isla de Samoa, que había programar una reunión el viernes, Dic. 30 de 2011, antes de que el país decidió que este día no existen), del mismo modo, usted puede preguntarse si un evento que ocurre durante el horario de verano está destinado a suceder nunca» o «pasar dos veces» (más sobre este tema aquí)

    Nota:
    puede que desee considerar la posibilidad de un apoyo más allá de lo que está definido en rfc5545 en términos de recurence reglas y también agrega soporte para los religiosos recurrente reglas ( ver USNO introducción a los calendarios o en la impresión «Cálculos Calendáricos» (Tercera Edición) de
    E. Reingol y N. Dershowitz).

    Desde que usted se pregunte acerca de la implementación existente, usted puede comprobar fácilmente el esquema de base de datos de sunbird (sqlite) o de la Apple open source Calendario y los Contactos del Servidor, una lista más completa de los actuales proyectos de código abierto para servidores caldav (que es, probablemente, un subconjunto de lo que usted está buscando) está disponible aquí)

  3. 7

    Tuve que construir un sistema que funcionaba con la programación y nos hicieron ambas cosas. He aquí lo que había

    • un conjunto de tablas que mantienen un seguimiento de la programación.
    • una tabla que mantiene un seguimiento de las instancias anteriores de la programación(cuando en realidad ocurrió)
    • una tabla en la que se siguió la pista de la última y la próxima instancia (cuando el siguiente punto es debido a que se producen sobre la base de la última vez) Usted no necesita esta tabla, pero lo hemos utilizado, porque de lo contrario sería estar constantemente calcular si un elemento debe estar ocurriendo ahora

    Con la programación, las cosas pueden llegar a ser realmente complicado, porque hay que recordar que en cualquier punto en el tiempo, el horario puede cambiar. También, un elemento puede ser debido, cuando su aplicación no se está ejecutando, y cuando se inicia de nuevo, usted necesita saber cómo identificar pasado debido elementos.

    También, nos aseguramos de que las tablas que mantienen un seguimiento de la programación real se quedó solo. La razón de esto es que aquellos eran los más complejos conjunto de tablas en el sistema y queremos ser capaces de utilizarlos de manera que puedan ser utilizados por diferentes cosas que necesita programación. Como el envío de administración de correos electrónicos, envío de notificaciones, y el servidor de mantenimiento como la limpieza de los archivos de registro.

  4. 3

    Definitivamente, me gustaría utilizar la segunda opción. El uso de diferentes opciones de periodicidad, la tienda por separado y calcular sobre la marcha. Almacenar todas esas fechas sería de una gran variedad de datos que no es necesario.

    Aquí es una buena respuesta para complementar su pregunta.

    Estructura de datos para almacenar los eventos que se repiten?

    También, como una nota de lado. He empezado a guardar todo como hora UTC, de modo que usted tiene una base de referencia común si alguna vez necesita utilizar múltiples zonas horarias.

    • si se almacena por separado de la fecha para cada repetición de cada usuario que tiene una recurrencia, puede convertirse en una gran cantidad de datos en un apuro.
    • +1 favoreciendo el almacenamiento de recurrencia. Pensar acerca del caso de uso cuando un usuario se mueve de una instancia de un evento recurrente: ella tiene la opción de solicitar el traslado a todos los eventos, todos los eventos posteriores, sólo este evento, etc.
  5. 1

    Usted necesita para almacenar algunas de ellas seguro. El usuario puede editar uno de los eventos, dejando a los demás sin tocar (probablemente conoció a la pregunta: «¿desea editar todos los eventos recurrentes o solo este?», en algunos calendarios, es decir. Windows Mobile).

    Usted también puede almacenar los eventos del pasado y no se eliminarán cuando el usuario elimina el evento recurrente.

    Si almacena todos los demás o generarlas es un detalle de implementación. Yo prefiero a generar, si es posible.

    En cualquier caso, usted querrá tener algunos de IDENTIFICACIÓN de los eventos recurrentes se almacenan con cada evento, además de algunos bandera que le indica si el evento fue modificado más tarde. O en la más complicada de enfoque, un indicador para cada propiedad de evento diciendo, si su valor predeterminado (desde el evento recurrente) o si fue modificado para este caso particular. Necesitará esta información cuando el usuario decide modificar el evento recurrente.

  6. 0

    He tenido un problema similar en una aplicación de internet que me hizo hace un par de años (puede que haya una manera mejor ahora 🙂 ). Yo quería incluir un programador que tenían toda la funcionalidad de eventos recurrentes, manejar el tiempo, días, semanas, meses, años, y las excepciones, para que yo pudiera tener reglas como:

    1) Todos los Días a las 10am exceptuados los miércoles

    2) Cada 2 horas, con un máximo de 4 iteraciones por día

    3) Cada Primer lunes del Mes

    etc..

    Almacenar las fechas/tiempos era posible, pero inflexible. En cada iteración de tu evento cambia cuando el «máximo» sería. Y cuán lejos te ves?

    Al final me escribió una costumbre de la clase de programación que puede leer y escribir en una cadena. Esta fue la cadena que se almacenan en la base de datos y, a continuación, una simple función puede ser llamada para saber cuándo es la próxima aparición es.

    • pero necesito más que la próxima aparición
    • pero un bien escrito el horario de clase pueden hacer eso. Dada la fecha actual se puede calcular el siguiente caso, el de después de que ad-infinitum. La entrada a su when() función debe ser «ahora», y puede devolver el siguiente ocurrencia de la fecha. Dado que se puede calcular la cantidad que quieras ya sea por la alimentación de la fecha dada, de vuelta en when() o por la función de dar una secuencia completa de nuevo.
  7. 0

    Tenga en cuenta que la mayoría de las respuestas se inclinan hacia el ahorro de los datos generados. Pero asegúrese de que usted considere el caso de uso.

    De vuelta en los días en que mis servidores se vieron limitadas por io con una gran cantidad de cpu sin hacer nada. Hoy en día se han ssd (si usted puede permitirse el lujo de aquellos que, de lo contrario su izquierda con un viejo spinning hd) pero tenga en cuenta que el número de núcleos, se ha incrementado también.

    La cosa buena acerca de este tipo de cálculos es que se puede dividir fácilmente y dar a sus muchos núcleos o incluso a un par de hoteles de servidores en una red local. A menudo más barato que la configuración de una nosql clúster o ir a la completa base de datos de clúster manera.

    Y alternativa podría ser también un cache, caché de sólo la vista del calendario, no hay necesidad de hacer todos los cálculos cada vez que no ha cambiado nada.

    Pero como dije depende de su caso de uso. No sólo siga las respuestas anteriores, pero hacer sus propios cálculos si usted tiene el tiempo de tomar una decisión.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea