Pregunta

Tengo que almacenar eventos programados (como, por ejemplo, horarios de clase) que se pueden organizar de forma semanal, diaria o mensual. Los eventos pueden ocurrir, por ejemplo, todos los lunes y miércoles, o cada segundo jueves del mes. ¿Hay alguna manera de almacenar esta información en un RDBMS que se adhiera a 3NF?

EDITAR: Esto no es tarea; Estoy construyendo algo con un amigo para nuestra propia edificación y lo queremos en 3NF.

Para ser específicos, estoy tratando de almacenar los horarios de misas y confesiones en las parroquias de RC. Estos se pueden programar de muchas maneras, como todos los domingos a la hora x o cada martes / jueves a una hora diferente. A veces es solo el tercer viernes del mes, y otros solo se ofrecen en un momento determinado una vez al año. No solo necesito almacenar esta información, sino consultarla, para poder obtener rápidamente una lista completa de los horarios disponibles en el próximo día o semana o lo que sea.

Supongo que, estrictamente hablando, 3NF no es un requisito, pero sería más fácil para nosotros si lo fuera, y es mejor corregirlo de inmediato que cambiar nuestro esquema más adelante.

¿Fue útil?

Solución

Sí, he resuelto este problema con mi compañero de trabajo de la siguiente manera:

CREATE TABLE [dbo].[Schedule](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [StartDate] [datetime] NOT NULL,
    [EndDate] [datetime] NULL
)

CREATE TABLE [dbo].[ScheduleInterval](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [ScheduleID] [int] NOT NULL,
    [ScheduleIntervalUnitID] [int] NOT NULL,
    [Interval] [smallint] NOT NULL
)

CREATE TABLE [dbo].[ScheduleIntervalUnit](
    [ID] [int] NOT NULL,
    [Name] [varchar](50) NULL
)

INSERT INTO ScheduleIntervalUnit (ID, Name)
SELECT '1' AS [ID], 'Day' AS [Name] UNION ALL
SELECT '2' AS [ID], 'Week' AS [Name] UNION ALL
SELECT '3' AS [ID], 'Month' AS [Name] 

Un horario abarca un período de tiempo y los intervalos ocurren dentro de ese período de tiempo. La unidad de intervalo de programación determina la duración del intervalo (días como en `` cada dos '' (2) o `` cada tercio '' (3) etc.), semana (día de la semana, como lunes, martes, etc.) y mes (del año calendario). Con esto, puede realizar consultas y lógica en su base de datos para recuperar horarios.

Si sus programaciones necesitan una mejor resolución, hasta horas, minutos, segundos, observe la implementación de Unix de cron . Originalmente comencé por esa ruta, pero descubrí que lo anterior es un enfoque mucho más simple y fácil de mantener.

Un único período de fecha / hora, como un semestre escolar definido que comienza el 9 de septiembre y termina el 4 de noviembre, puede contener múltiples horarios (por lo tanto, todos los lunes para la clase de arte y `` cada dos días '' para Phys Ed, pero usted ' ¡Necesitaré hacer más trabajo para considerar las vacaciones y los fines de semana!).

Otros consejos

Para registrar las reglas para " repetición periódica " ;, puede inspirarse en crontab , excepto que, por supuesto, no necesita restricciones de minutos y horas, sino día de la semana, día del mes y similares. Dado que podría haber más de un (p. Ej.) Día de la semana en el programa, para fines de NF querrá tablas intermedias típicas que se utilizan para representar muchas o muchas relaciones, es decir, una con solo dos claves foráneas por fila (una para la tabla principal de eventos) , uno a una tabla de días de la semana), y de manera similar, por supuesto, para los días del mes y similares.

Presumiblemente, cada evento programado también tendría una duración, una categoría, tal vez una ubicación, un nombre o una descripción descriptiva.

" Qué normal " es la forma (una vez que se ha ocupado de los "conjuntos" con la relación de muchos-muchos mencionada anteriormente) depende principalmente de si estos diversos atributos dependen unos de otros y, por ejemplo, si cada evento en una determinada categoría tiene el misma duración, querrás tener una tabla auxiliar separada con id, categoría y duración, y usar claves externas en esta tabla en lugar de repetir la información emparejada. Pero por lo que dices, no veo ninguna violación intrínseca de las reglas de forma normal, salvo por esas posibilidades de dependencia (que no son inherentes a lo poco que ha especificado sobre la programación de eventos).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top