Domanda

Devo memorizzare eventi programmati, (ad esempio l'orario delle lezioni, ad esempio) che possono essere organizzati su base settimanale, giornaliera o mensile. Gli eventi possono accadere, diciamo, ogni lunedì e mercoledì o ogni secondo giovedì del mese. C'è un modo per archiviare queste informazioni in un RDBMS che aderisce a 3NF?

EDIT: non si tratta di compiti a casa; Sto costruendo qualcosa con un amico per la nostra edificazione e lo vogliamo in 3NF.

Per essere precisi, sto provando a memorizzare i programmi per i tempi di massa e confessione nelle parrocchie RC. Questi possono essere programmati in molti modi, ad esempio ogni domenica alle ore x o ogni martedì / giovedì in un momento diverso. A volte è solo il terzo venerdì del mese e altri sono offerti solo in un determinato momento una volta all'anno. Ho bisogno non solo di archiviare queste informazioni, ma di interrogarle, in modo da poter ottenere rapidamente un elenco completo di orari disponibili il giorno o la settimana successiva o qualsiasi altra cosa.

Suppongo che il 3NF in senso stretto non sia un requisito, ma sarebbe più facile per noi se fosse ed è meglio toglierlo dal pipistrello piuttosto che cambiare il nostro schema in seguito.

È stato utile?

Soluzione

Sì, ho risolto questo problema con il mio collega nel modo seguente:

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] 

Una pianificazione copre un periodo di tempo e gli intervalli si verificano entro tale periodo di tempo. L'unità di intervallo di pianificazione determina la durata dell'intervallo (giorni come in "ogni altro" (2) o "ogni terzo" (3) ecc.), Settimana (giorno della settimana, come lunedì, martedì, ecc.) e mese (dell'anno solare). Usandolo puoi condurre query e logica sul tuo database per recuperare pianificazioni.

Se i tuoi programmi necessitano di una migliore risoluzione, fino a ore, minuti, secondi, guarda l'implementazione Unix di cron . Inizialmente ho iniziato su questa strada, ma ho trovato che un approccio molto più semplicistico e mantenibile.

Un singolo intervallo di date / ore, ad esempio un semestre scolastico definito che inizia il 9 settembre e termina il 4 novembre, può contenere più pianificazioni (quindi ogni lunedì per la lezione di arte e "ogni altro giorno" per Phys Ed - ma tu " dovrò fare più lavoro per considerare le vacanze e i fine settimana!).

Altri suggerimenti

Per registrare le regole per la "ripetizione periodica", potresti trarre ispirazione da crontab , tranne per il fatto che non sono necessari vincoli su minuti e ore, ma piuttosto giorno della settimana, giorno del mese e simili. Dal momento che più di un (es.) Giorno della settimana potrebbe essere nel programma, per scopi NF vorrete tipiche tabelle intermedie utilizzate per rappresentare molte o molte relazioni, cioè una con solo due chiavi esterne per riga (una alla tabella principale degli eventi , uno a una tabella dei giorni feriali) - e allo stesso modo ovviamente per i giorni del mese e simili.

Presumibilmente ogni evento programmato avrebbe quindi anche una durata, una categoria, forse un luogo, un nome o una descrizione descrizione.

" Come normale " è la forma (una volta che ti sei preso cura dei "set" con le molte relazioni di cui sopra) dipende principalmente dal fatto che e come questi vari attributi dipendono l'uno dall'altro, ad esempio se ogni evento in una determinata categoria ha il stessa durata, ti consigliamo di disporre di una tabella ausiliaria separata con ID, categoria e durata e utilizzare chiavi esterne in questa tabella anziché ripetere le informazioni associate. Ma da quello che dici non vedo alcuna violazione intrinseca delle regole di forma normale, salvo per tali possibilità di dipendenza (che non sono inerenti a quel poco che hai specificato sulla pianificazione degli eventi).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top