Tworzenie schematu bazy danych dla aplikacji kalendarza

Chcę napisać aplikację kalendarza. To naprawdę powtarzające się elementy, które rzucają klucz w pracach dla schematu DB. Chciałbym mieć jakiś wkład w to, jak to zorganizować.

Co jeśli użytkownik stworzy Zdarzenie i wprowadzi, że powtarza ono wszystkich w poniedziałek, w nieskończoność? Jak mogę to wszystko zapisać w bazie danych? Nie mogę tworzyć nieskończonych wydarzeń. Czy po prostu umieszczam tam tabelę, która zawiera odpowiednie informacje, abym mógł obliczyć, gdzie idą wszystkie wydarzenia? Jeśli tak, będę musiał je obliczyć za każdym razem, gdy użytkownik wyświetla nową część kalendarza. Co jeśli przeglądają strony przez miesiące, ale mają mnóstwo powtarzających się przedmiotów?

Ponadto, schemat musi obsługiwać, gdy użytkownik kliknie element i powie "Edytuj ten w sekwencji", a nie wszystkie elementy w sekwencji. Czy następnie rozdzielić jeden element z sekwencji?

Update 1

W ogóle nie patrzyłem na iCal. Żeby było jasne, myślę, że zapisanie informacji, które pozwalają obliczyć powtarzające się elementy, a rozdzielenie wszystkich, które różnią się od sekwencji, jest świetnym sposobem na przechowywanie go, aby móc go przenieść. Ale myślę, że w aplikacji byłoby to zbyt powolne, aby robić matematykę dat wszędzie.

Author: Anthony D, 2009-06-04

7 answers

Niedawno stworzyłem aplikację kalendarza i było to jedno z wielu wyzwań, przed którymi stanąłem.

W końcu wymyśliłem pół-hakerskie rozwiązanie. Utworzyłem kolumnę event_type. W tej kolumnie miałem albo: "dzienny"," tygodniowy"," miesięczny", albo"roczny". Miałem również kolumny start_date i end_date. Wszystko inne było obsługiwane w rzeczywistym kodzie zaplecza.

Nigdy nie próbowałem podzielić zdarzenia, jeśli użytkownik edytował tylko jedno zdarzenie. To nie było konieczne w tej sytuacji. Można jednak podzielić Zdarzenie, zmieniając end_date pierwszego, tworząc nowe zdarzenie z nową datą początkową i end_date oryginału, a wreszcie nowe zdarzenie dla tego, które właśnie wybrałeś do edycji. Proces ten zakończy się tworzeniem 3 zdarzeń.

Hack-owski, wiem. Nie mogłem wymyślić sprytnego sposobu, aby poradzić sobie z tym problemem w tym czasie.

 12
Author: JasonV,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-03 21:15:37

Zmagałem się z tym samym problemem, i właściwie bawiłem się pomysłem "tabeli pamięci podręcznej" sugerowanym powyżej, ale potem natknąłem się na alternatywę (sugerowaną tutaj), która nie wydaje się być jeszcze reprezentowana.

Zbuduj tabelę zawierającą wszystkie zdarzenia

EventID (primary key)
Description
StartDate
PeriodType - days, weeks, months, years
PeriodFreq - # of days, weeks, etc between events
EndDate
... other attributes that can be modified

Następnie dodaj tabelę dla WYJĄTKÓW do tych zdarzeń. Ta tabela używa klucza złożonego, składającego się z identyfikatora EventID, który jest mapowany do tabeli zdarzeń, oraz identyfikatora wystąpienia do wybrania konkretnego zdarzenia w serii.

EventID (key)
InstanceID (key)
InstanceDate - the modified date of the exception 
IsCancelled - a flag to skip this date when traversing the series
... other attributes that can be modified

Wydaje się, że tabela zdarzeń jest znormalizowana i unika rozdzielania serii w celu obsługi wyjątków.

 13
Author: Justin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-19 11:05:07

Dlaczego nie użyć kalendarza Google jako bazy danych dla tej aplikacji kalendarza, opierając się na API Kalendarza Google do przechowywania i pobierania wydarzeń kalendarza?

Calendar API to REST API, do którego można uzyskać dostęp za pośrednictwem jawnych wywołań HTTP; API udostępnia większość funkcji dostępnych w interfejsie Google Calendar Web, dzięki czemu aplikacja kalendarza może być tak samo funkcjonalna, jak Kalendarz Google (dużo funkcjonalności!!!).

Twoja aplikacja potrzebuje tylko zaimplementuj OAuth 2.0 Dla interfejsów API Google, które można ułatwić za pomocą pojedynczej usługi logowania, takiej jak Auth0, aby zapewnić odpowiednie tokeny dostępu. Następnie aplikacja kalendarza może używać tych tokenów w połączeniu z interfejsem API kalendarza, aby zapewnić bezproblemowe przechowywanie i pobieranie wydarzeń kalendarza w formacie JSON.

Użytkownicy tworzą wydarzenia w ramach własnego " nowego kalendarza."Ten kalendarz jest udostępniony w formie konta Gmail dedykowanego tej aplikacji- the konto Gmail aplikacji .

Zasadniczo Kalendarz Google staje się Twoją bazą danych, dzięki czemu możesz mieć konto gmail aplikacji nie tylko przechowywać wszystkie wydarzenia aplikacji, ale także umożliwić przeglądanie i edycję tych wydarzeń za pomocą intuicyjnego interfejsu.

 4
Author: Brendorien,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-05 10:44:47

Przytrzymaj element powtarzający się w tabeli zdarzeń jako normalny, ale oznaczony jako powtarzający się z odpowiednimi datami rozpoczęcia/ zakończenia.

Jeśli użytkownik modyfikuje pojedynczą instancję spotkania, po prostu utwórz nowe zdarzenie, być może z 'parentId' równym ID zdarzenia powtarzającego się.

Zbuduj logikę, która powoduje, że kalendarz nadpisuje wszystkie powtarzające się zdarzenia w danym dniu zdarzeniami z pasującymi identyfikatorami nadrzędnymi.

Twoje pytanie o wydajność to w zasadzie stara prędkość vs. problem z przechowywaniem. Naprawdę nie sądzę, aby wymagane obliczenia przekroczyły zapotrzebowanie na miejsce do przechowywania tak wielu terminów. Wystarczy poczytać o optymalizacji baz danych-indeksowaniu itp.

 2
Author: ChristianLinnell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-03 21:21:07

Czy mógłbyś połączyć dwa światy z tabelą" cache", w której wstępnie obliczasz następne X dni zdarzeń?

Więc trzy tabele:

recurring_event_specs
one_time_events
cached_recurring_events

Dla dowolnej części kalendarza w ciągu X dni od dnia dzisiejszego, Twoje zapytanie zostanie połączone one_time_events i cached_recurring_events.

Wtedy będziesz musiał wykonać obliczenia daty w locie, jeśli użytkownik spróbuje spojrzeć na Część kalendarza więcej niż X dni w przyszłości. Wyobrażam sobie, że można znaleźć sane X, który obejmowałby większość normalnych użyj.

Tabela cached_recurring_events musi być aktualizowana za każdym razem, gdy użytkownik dodaje nowe powtarzające się zdarzenie - i ewentualnie raz dziennie w trybie offline, przez zadanie cron/zaplanowane zadanie. Ale tylko w dniach, w których nie zostało utworzone żadne nowe powtarzające się wydarzenie.

 2
Author: Ben Dunlap,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-03 21:32:13

Najlepszym sposobem na to jest zapisanie łańcucha wzorca powtarzania opartego na standardach (iCal).. i pozostaw puste, jeśli jest to pojedyncze wydarzenie. Istnieje kilka interfejsów API, które mogą analizować wzorzec powtarzania i tworzyć obiekty zdarzeń, które można powiązać z elementami interfejsu użytkownika.... żadne z wystąpień nigdy nie musi być przechowywane w bazie danych, tylko początkowe Zdarzenie (Zdarzenie)..

 0
Author: Daniel Bardi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-16 05:33:59

Nie możesz zapisać wydarzeń dziennie z czasem rozpoczęcia i zakończenia? Wygeneruje wiele danych dla zdarzeń, które dzieją się codziennie (może to nie jest relacyjne), ale ułatwi zadawanie zapytań i będzie można wprowadzać wyjątki(np. miejsce zdarzenia spłonęło lub pracownicy uderzają). Aby wygenerować dni na wydarzenie, proponuję zaimplementować to w front-endzie wywodzącym się z jakiegoś wzorca ICal-owskiego.

 0
Author: Pepster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-23 09:05:12