2009-06-19 10 views
6

Muszę przechowywać zaplanowane wydarzenia (np. Np. Czasy lekcyjne), które można organizować co tydzień, codziennie lub co miesiąc. Zdarzenia mogą występować, powiedzmy, w każdy poniedziałek i środę lub co drugi czwartek miesiąca. Czy istnieje sposób przechowywania tych informacji w RDBMS, który przylega do 3NF?W jaki sposób można reprezentować zaplanowane zdarzenia w RDBMS?

EDYCJA: To nie jest praca domowa; Buduję coś z przyjacielem dla własnego budowania i chcemy go w 3NF.

Dokładniej, staram się przechowywać harmonogramy mszy i spowiedzi w parafiach RC. Można je zaplanować na wiele sposobów, na przykład w każdą niedzielę o godzinie x lub co wtorek/czw, w innym czasie. Czasami jest to tylko trzeci piątek miesiąca, a inne są oferowane tylko raz w roku raz w roku. Muszę nie tylko przechowywać te informacje, ale także je przesyłać, aby szybko uzyskać wyczerpującą listę dostępnych czasów następnego dnia, tygodnia lub czegoś innego.

Przypuszczam, że ściśle mówiąc 3NF nie jest wymogiem, ale byłoby dla nas łatwiej, gdyby było i lepiej jest go poprawić z nietoperza niż zmienić nasz schemat później.

+0

Na dłuższą metę naprawdę nic dobrego nie zrobi, aby zamieścić na forum zadania związane z zadaniami domowymi. Czy masz w ogóle jakąś myśl? Jak daleko się dostałeś? –

+1

Chociaż może to być praca domowa, to z pewnością nie będzie to praca domowa. Nie wydaje mi się szczególnie właściwe, aby zadać pytanie oznaczeniu zadania domowego, chyba że oczywiście tak jest, plus to * jest * problemem z interesującymi rozwiązaniami. –

+0

... to powiedziane, jest to z pewnością duplikat, po prostu nie mogę znaleźć innych ... –

Odpowiedz

2

Tak Mam rozwiązać ten problem z moim współpracownikiem w następujący sposób:

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] 

Harmonogram obejmuje długość czasu i interwały nastąpić w ciągu tego czasu. Jednostka interwału harmonogramu określa długość przedziału (dni jak w "co drugi" (2) lub "co trzeci" (3) itd.), Tydzień (dzień tygodnia, taki jak poniedziałek, wtorek itp.), Oraz miesiąc (roku kalendarzowego). Korzystając z tego, możesz przeprowadzać zapytania i logikę w bazie danych w celu pobrania harmonogramów.

Jeżeli spodziewają się potrzeba lepszej rozdzielczości - aż do godziny, minuty, sekundy - spojrzeć na realizację Unix cron. Początkowo podążałem tą trasą, ale uznałem powyższe za bardziej uproszczone i łatwiejsze w utrzymaniu.

Pojedyncza data/czas - np. Zdefiniowany semestr szkolny rozpoczynający się 9 września i kończący się 4 listopada - może zawierać wiele harmonogramów (tak w każdy poniedziałek dla zajęć plastycznych i "co drugi dzień" dla Phys Ed - ale Ty ") Będę musiał zrobić więcej pracy, aby wziąć pod uwagę wakacje i weekendy!).

+0

gdzie są wymienione wyjątki i typy na tydzień/miesiąc? –

2

Aby zapisać reguły dotyczące "okresowych powtórzeń", możesz czerpać inspirację z formatu crontab, z wyjątkiem oczywiście, że nie potrzebujesz ograniczeń na minuty i godziny, ale raczej na dzień tygodnia, dzień miesiąca i lubić. Ponieważ w harmonogramie może znajdować się więcej niż jeden (np.) Dzień tygodnia, dla celów NF będziesz potrzebował typowych tabel pośrednich używanych do reprezentowania wielu do wielu relacji, tj. Jednego z tylko dwoma kluczami obcymi w rzędzie (jeden do głównego stołu wydarzeń , jeden do tabeli dni powszednich) - i podobnie oczywiście w przypadku dni w miesiącu i tym podobnych.

Prawdopodobnie każde zaplanowane wydarzenie będzie miało również czas trwania, kategorię, być może lokalizację, opis lub opis.

"Jak normalna" jest forma (gdy zajmiesz się "zestawami" z wieloma relacjami wymienionymi powyżej) zależy głównie od tego, czy i jak te różne atrybuty są od siebie zależne - na przykład, czy Zdarzenie w danej kategorii ma ten sam czas trwania, będziesz potrzebować oddzielnej tabeli pomocniczej z identyfikatorem, kategorią i czasem trwania, a także użyć kluczy obcych w tej tabeli zamiast powtarzać sparowane informacje. Ale z tego, co mówisz, nie widzę żadnego wewnętrznego naruszenia zasad normalnej formy, z wyjątkiem takich możliwości zależności (które nie są nieodłącznie związane z tym, co napisałeś na temat planowania zdarzeń).

+0

Dzięki. Już myślałem o prawie takim rozwiązaniu, chociaż prawdopodobnie użyłbym enum (jestem na postgresie) niż stolik w dni powszednie. Jak już wspomniałem powyżej, wydarzenia z pewnością nie będą miały tego samego czasu trwania. Być może, powinny one mieć arbitralne czasy trwania. – astine

+0

Proponuję również model Cron. I nie martw się o normalizację - nie wszystkie struktury danych są relacyjne. Z mojego doświadczenia wynika, że ​​możesz użyć innych metod niż SQL do zmaterializowania rzeczywistych instancji elementów planowanych. Zamiast przechowywać arbitralne czasy, może przechowywać datę rozpoczęcia i zakończenia. – dkretz