Pergunta

Eu tenho que armazenar eventos programados, (como horários de aula dizer, por exemplo) que podem ser organizadas em uma base semanal, diária ou mensalmente. Os eventos podem ocorrer, por exemplo, toda segunda-feira e quarta-feira, ou a cada segunda quinta-feira do mês. Existe uma maneira de armazenar essas informações em um RDBMS que adere a 3NF?

EDIT: Esta não é a lição de casa; Estou construindo algo com um amigo para nossa edificação e queremos que ele nos 3NF.

Para ser mais específico, eu estou tentando armazenar os horários para a massa vezes e confissão em paróquias RC. Estes podem ser agendadas em um inferno de um monte de maneiras, como todos os domingos em x tempo ou cada Ter / Qui em um horário diferente. Às vezes é apenas a terceira sexta-feira do mês, e outros são oferecidos apenas em um determinado momento, uma vez por ano. Eu preciso não só armazenar essas informações, mas consulta-lo, para que eu possa obter rapidamente uma lista abrangente de horários disponíveis no dia seguinte ou uma semana ou algo assim.

Suponho que 3NF estritamente falando não é um requisito, mas seria mais fácil para nós se fosse e é melhor para obtê-lo corrigir fora do bastão do que mudar nosso esquema mais tarde.

Foi útil?

Solução

Sim, eu ter resolvido este problema com o meu colega de trabalho da seguinte maneira:

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] 

programação abrange um um comprimento de tempo e intervalos de ocorrer dentro desse período de tempo. A unidade de intervalo de programação determina o comprimento do intervalo (dias como em "todas as outras" (2) ou "cada terceiro" (3), etc.), semana (dias da semana, tal como Segunda-feira, Terça, etc), e mês (do ano civil). Usando isso, você pode realizar consultas e lógica contra o seu banco de dados para recuperar horários.

Se seus horários precisam de melhor resolução - até horas, minutos, segundos - olhar para a implementação Unix de cron. Eu originalmente começou por esse caminho, mas encontrou o acima para ser uma abordagem muito mais simples e de fácil manutenção.

A extensão única data / hora - como um semestre letivo definido a partir 09 de setembro e termina 04 de novembro - pode conter vários horários (assim toda segunda-feira para a classe de arte, e "todos os outros dias" para Phys Ed - Mas você vai necessidade de fazer mais trabalho para considerar feriados e fins de semana!).

Outras dicas

Para gravar as regras para "repetição periódica", você poderia ter inspiração de crontab 's formato, exceto, é claro que você não precisa de restrições de minutos e horas, mas sim o dia da semana, dia do mês, e similares. Desde mais de um (por exemplo) da semana poderia ser na programação, para fins de NF você vai querer mesas típicas intermédia utilizada para representar muitos para muitos relacionamentos, ou seja, um com apenas duas chaves estrangeiras por linha (um para a mesa principal de eventos , uma a uma tabela de dias úteis) - e da mesma forma, claro, para os dias do mês, e assim por diante

.

Presumivelmente, cada evento programado, então, também têm uma duração, uma categoria, talvez um local, um nome ou descrição descrição.

"Como normal" é a forma (uma vez que você tenha tomado cuidado dos "conjuntos" com o relacionamento muitos-muitos mencionados acima) depende principalmente de se e como estes vários atributos dependem uns dos outros - por exemplo, se todos os eventos em uma determinada categoria tem a mesma duração, você vai querer ter uma mesa auxiliar separado com id, categoria e duração, e usar chaves estrangeiras para esta tabela, em vez de repetição a informação emparelhado. Mas pelo que você diz que eu não vejo nenhuma violação intrínseca de regras de forma normal, exceto por tais possibilidades de dependência (que não são inerentes o pouco que você tenha especificado sobre a programação de eventos).

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