[DB] Recurring events calendar

Pagina: 1
Acties:

  • megamuch
  • Registratie: Februari 2001
  • Laatst online: 29-01 20:14

megamuch

Tring Tring!

Topicstarter
Ik moet een alerter systeem maken waarbij mensen een alert ontvangen op de door hun aangegeven interval.

Ik krijg dus opdrachten als:

- 2x per dag alleen op ma en do van 21-10-2006 t/m 18-02-2007 om 12 en 18 uur
- 3x Dagelijks voor 3 weken om 10, 12 en 17 uur
- 1x per week voor 4 maanden op maandag om 21 uur

etc.

Het uitrekenen van de tijdstippen om een alert te sturen, en het versturen van de alert is geen probleem.

Ik heb alleen geen flauw idee hoe je dit nou netjes in een DB zou zetten. En na 2 uur prutsen, heb ik nog steeds geen flauw idee. Google op recurring events, levert dezelfde vragen op, maar weinig code samples.

Heeft hier iemand een ideetje om me op weg te helpen?

Verstand van Voip? Ik heb een leuke baan voor je!


  • whoami
  • Registratie: December 2000
  • Laatst online: 21:01
hmm, misschien beter in SE&A

prg->se&a

Verder: vertel eens aan wat je zelf al gedacht hebt ?

Zowiezo wil je per event dat recurrent is, kunnen bijhouden op welk tijdstip het opnieuw moet uitgevoerd worden etc...
Waarom dus geen tabel maken 'RecurringProperties' oid, die je koppelt aan je events, en waarin je dus de recurrency eigenschappen van dat event in bijhoudt ?

[ Voor 81% gewijzigd door whoami op 19-07-2006 12:58 ]

https://fgheysels.github.io/


  • megamuch
  • Registratie: Februari 2001
  • Laatst online: 29-01 20:14

megamuch

Tring Tring!

Topicstarter
offtopic:
SE&A, had ik moeten weten


Wat had ik zelf al bedacht: Nou vrij weinig. Normaal heb ik niet zo'n probleem met een basic DB layout, maar hier komt er echt niets uit. Ga ik bij invoer van een opdracht uitrekenen wanneer de events allemaal voorkomen en deze stuk voor stuk in de DB gooien (platte tabel met opdrachten).

De oplossing die jij aandraagt, een tabel met recurringProperties is prima. Alleen zie ik dan weer niet in op welke manier (lees welke data typen) je voor je columns zou kunnen gebruiken voor bijv "2x per dag alleen op ma en do van 21-10-2006 t/m 18-02-2007 om 12 en 18 uur".

In feite heb je altijd een startdatum en een bepaalde interval waarop een alert verzonden moet worden. Het moeilijkste is even om die interval op en nette manier op te slaan.

offtopic:
wtf zwangerschapstesten @ google ads ?

[ Voor 20% gewijzigd door megamuch op 19-07-2006 13:10 . Reden: voorbeedje aangepast ]

Verstand van Voip? Ik heb een leuke baan voor je!


Verwijderd

megamuch schreef op woensdag 19 juli 2006 @ 13:06:
offtopic:
SE&A, had ik moeten weten

"2x per dag alleen op ma en do van 21-10-2006 t/m 18-02-2007 om 12 en 18 uur".
Simpel toch. Je properties zijn hier 'hours (12 en 18), weekdays (ma t/m zo), en een start/end date' . Voor terug kerende evenementen bestaat onder unix een programma genaamd 'cron'. Dat maakt gebruik van een flexibel configuratiebestandje waarin je dat soort dingen heel mooi in kunt stellen. Als je nou van de velden in dat crontab bestand database velden maakt ben je volgens mij al een heel eind op weg. Google even op 'crontab'.

  • megamuch
  • Registratie: Februari 2001
  • Laatst online: 29-01 20:14

megamuch

Tring Tring!

Topicstarter
Verwijderd schreef op woensdag 19 juli 2006 @ 13:31:
[...]


Simpel toch. Je properties zijn hier 'hours (12 en 18), weekdays (ma t/m zo), en een start/end date' . Voor terug kerende evenementen bestaat onder unix een programma genaamd 'cron'. Dat maakt gebruik van een flexibel configuratiebestandje waarin je dat soort dingen heel mooi in kunt stellen. Als je nou van de velden in dat crontab bestand database velden maakt ben je volgens mij al een heel eind op weg. Google even op 'crontab'.
Crontab ben ik mee bekend. Het probleem is ook niet het uitvinden van wanneer een event getriggerd moet worden. Daar kom ik wel uit. Waar ik meer mee zit, is de juiste db structuur.

Ik zat zelf te denken aan het volgende waarin is aangeven:

3x op elke maandag tussen 21 aug en 21 sept om 10 12 en 14 uur

code:
1
2
3
4
ID  event_ID    Startdate   Enddate     daysoweek   hours
1   1           2006-08-21  2006-09-21  ma          10
2   1           2006-08-21  2006-09-21  ma          12          
3   1           2006-08-21  2006-09-21  ma          14


Opzich geen gek idee dacht ik zelf. :)

Verstand van Voip? Ik heb een leuke baan voor je!


  • Antediluvian
  • Registratie: Maart 2002
  • Laatst online: 13-01 23:54
Even mijn hersenen aan het werk gezet en dit kwam er uit gerolt.
┌─────────────┐            ┌─────────────┐
│    Event    │            │ Recurrence  │
├─────────────┤1          n├─────────────┤
│ID           │───────────>│eventId      │
│startdate    │            │weekday      │
│enddate      │            │hour         │
└─────────────┘            └─────────────┘

Voorbeeld data
┌──┬──────────┬──────────┐ ┌───────┬────────┬─────┐
│ID│ startdate│   enddate│ │eventId│ weekday│ hour│
├──┼──────────┼──────────┤ ├───────┼────────┼─────┤
│ 1│21/06/2006│16/07/2006│ │      1│  Monday│12:00│
│ 2│03/07/2006│02/07/2007│ │      1│  Monday│18:00│
└──┴──────────┴──────────┘ │      1│Thursday│12:00│
                           │      1│Thursday│18:00│
                           │      1│  Sunday│12:00│
                           │      1│  Sunday│18:00│
                           └───────┴────────┴─────┘

  • megamuch
  • Registratie: Februari 2001
  • Laatst online: 29-01 20:14

megamuch

Tring Tring!

Topicstarter
Antediluvian schreef op woensdag 19 juli 2006 @ 13:53:
Even mijn hersenen aan het werk gezet en dit kwam er uit gerolt.
┌─────────────┐            ┌─────────────┐
│    Event    │            │ Recurrence  │
├─────────────┤1          n├─────────────┤
│ID           │───────────>│eventId      │
│startdate    │            │weekday      │
│enddate      │            │hour         │
└─────────────┘            └─────────────┘

Voorbeeld data
┌──┬──────────┬──────────┐ ┌───────┬────────┬─────┐
│ID│ startdate│   enddate│ │eventId│ weekday│ hour│
├──┼──────────┼──────────┤ ├───────┼────────┼─────┤
│ 1│21/06/2006│16/07/2006│ │      1│  Monday│12:00│
│ 2│03/07/2006│02/07/2007│ │      1│  Monday│18:00│
└──┴──────────┴──────────┘ │      1│Thursday│12:00│
                           │      1│Thursday│18:00│
                           │      1│  Sunday│12:00│
                           │      1│  Sunday│18:00│
                           └───────┴────────┴─────┘
Nog beter zelfs. Ff kijken of ik dit simpel kan implementeren. 1000 maal gracias!

Verstand van Voip? Ik heb een leuke baan voor je!


Verwijderd

Gaat prima werken wanneer je minimaal 1x per week een alert hebt, en wanneer die alerts altijd op dezelfde dagen/tijden moeten gebeuren. Maar...
- 2x per dag alleen op ma en do van 21-10-2006 t/m 18-02-2007 om 12 en 18 uur
- 3x Dagelijks voor 3 weken om 10, 12 en 17 uur
- 1x per week voor 4 maanden op maandag om 21 uur

etc.
Die "etc." is 't probleem. Wat als ze besluiten dat 't 1x per 2 weken op maandag moet, en dan nog een keer 2 dagen voor de einddatum?

Je zegt dat je 't moet implementeren, maar in hoeverre kun je beperkingen aan de wensen van je opdrachtgever opleggen? Zoals minimaal 1x per week, altijd op vaste dagen/tijden, enz.?
Ook wanneer die opdrachtgever er na 2 maanden achterkomt dat die beperkingen toch wel wat te beperkt zijn?
Als dat geen probleem is, dan is er niks aan het handje, maar anders zit je toch vast aan een entry per id/datum/tijd, en zul je die events-tabel door je programma moeten laten vullen.

Overigens is zo'n 'platte' aanpak ook nog niet zo slecht: wanneer de gebruiker z'n 'event schedule' heeft samengesteld is 't makkelijk om de afzonderlijke event-records aan te maken, periodiek kun je de al afgehandelde alerts opruimen, en je 'event alerter' hoeft alleen maar te checken op id/datum/tijd i.p.v. op id / "zit ik in die periode" / "is het de goede weekdag" / tijd.

  • megamuch
  • Registratie: Februari 2001
  • Laatst online: 29-01 20:14

megamuch

Tring Tring!

Topicstarter
Verwijderd schreef op woensdag 19 juli 2006 @ 22:22:
Gaat prima werken wanneer je minimaal 1x per week een alert hebt, en wanneer die alerts altijd op dezelfde dagen/tijden moeten gebeuren. Maar...

[...]
Die "etc." is 't probleem. Wat als ze besluiten dat 't 1x per 2 weken op maandag moet, en dan nog een keer 2 dagen voor de einddatum?

Je zegt dat je 't moet implementeren, maar in hoeverre kun je beperkingen aan de wensen van je opdrachtgever opleggen? Zoals minimaal 1x per week, altijd op vaste dagen/tijden, enz.?
Ook wanneer die opdrachtgever er na 2 maanden achterkomt dat die beperkingen toch wel wat te beperkt zijn?
Als dat geen probleem is, dan is er niks aan het handje, maar anders zit je toch vast aan een entry per id/datum/tijd, en zul je die events-tabel door je programma moeten laten vullen.

Overigens is zo'n 'platte' aanpak ook nog niet zo slecht: wanneer de gebruiker z'n 'event schedule' heeft samengesteld is 't makkelijk om de afzonderlijke event-records aan te maken, periodiek kun je de al afgehandelde alerts opruimen, en je 'event alerter' hoeft alleen maar te checken op id/datum/tijd i.p.v. op id / "zit ik in die periode" / "is het de goede weekdag" / tijd.
Het is altijd een vast patroon. Dus de afstand tussen bepaalde dagen en het aantal keer op die dag is altijd gelijk. Anders wordt het ook godsonmogelijk om een normaal formulier in te vullen.

Ik ben er bijna, alleen de invoer (dynamisch formulier opbouwen met javascript) wil nog niet echt.

Verstand van Voip? Ik heb een leuke baan voor je!


  • orf
  • Registratie: Augustus 2005
  • Laatst online: 20:50

orf

En hoe doe je met deze opzet elke 1e dag v/d maand?

  • megamuch
  • Registratie: Februari 2001
  • Laatst online: 29-01 20:14

megamuch

Tring Tring!

Topicstarter
orf schreef op vrijdag 21 juli 2006 @ 19:30:
En hoe doe je met deze opzet elke 1e dag v/d maand?
Enddate op hoogste waarde van timestamp (ergens in 2038) gooien. Overigens ga ik denk ik wel voor een platte tabel. Dan maar wat redundancy.

Ik ben nu alleen aan het rotzooien met een functie om elke $weekdag tussen $startDate en $endDate uit te rekenen. Als ik iets op maandag woensdag en donderdag wil laten recurren, is dat nog verdomd lastig om om te zetten in een functie.

Ik vond het geen goed plan om elke dag tussen $begin en $end te gaan vergelijken op $weekday. Dat is volgens mij een btje omslachtig. Iemand nog tips daarvoor?

Verstand van Voip? Ik heb een leuke baan voor je!


Verwijderd

Persoonlijk vind ik het gebruik van dagen van de week niet echt netjes. Het legt je inderdaad een beperking op en je kunt inderdaad niet zoiets instellen als iedere twee dagen. Ik zou persoonlijk gebruik maken van timestamps op de volgende manier.

+-------------+            +-------------+
|    Event    |            | Recurrence  |
+-------------| 1        n +-------------|  1
|id           |----------->|id           |------+
|starttime    |            |eventId      |      |
|endtime      |            |deltaTime    |<-----+
+-------------+            |next         |  0..1
                           +-------------+

Voorbeeld data
+------------------------------------------+  +--------------------------+
|id|          starttime|            endtime|  | id|eventId|deltaTime|next|
+--+-------------------+-------------------|  +---+-------+---------+----|
| 1|2006-07-25 16:00:00|2006-10-25 16:00:00|  |  1|      1|   259200|   1|
| 2|2006-07-24 00:00:00|2007-08-01 00:00:00|  |  2|      2|   172800|   3|
| 3|2006-07-24 00:00:00|2007-08-01 00:00:00|  |  3|      2|    86400|   4|
+------------------------------------------+  |  4|      2|   345600|   2|
                                              |  5|      3|  1209600|   5|
                                              |  6|      3| 31363200|   0|
                                              +--------------------------+

Event 1: iedere 3 dagen
Event 2: iedere maandag, woensdag en donderdag
Event 3: 1x per twee weken en een keer 2 dagen voor de einddatum

Hiermee kun je meer gevallen afvangen zoals
  • iedere twee dagen en
  • iedere eerste maandag van de maand, al kan dat behoorlijk gecompliceerd worden (schrikkeljaar).

  • megamuch
  • Registratie: Februari 2001
  • Laatst online: 29-01 20:14

megamuch

Tring Tring!

Topicstarter
Verwijderd schreef op dinsdag 25 juli 2006 @ 14:53:
Persoonlijk vind ik het gebruik van dagen van de week niet echt netjes. Het legt je inderdaad een beperking op en je kunt inderdaad niet zoiets instellen als iedere twee dagen. Ik zou persoonlijk gebruik maken van timestamps op de volgende manier.

+-------------+            +-------------+
|    Event    |            | Recurrence  |
+-------------| 1        n +-------------|  1
|id           |----------->|id           |------+
|starttime    |            |eventId      |      |
|endtime      |            |deltaTime    |<-----+
+-------------+            |next         |  0..1
                           +-------------+

Voorbeeld data
+------------------------------------------+  +--------------------------+
|id|          starttime|            endtime|  | id|eventId|deltaTime|next|
+--+-------------------+-------------------|  +---+-------+---------+----|
| 1|2006-07-25 16:00:00|2006-10-25 16:00:00|  |  1|      1|   259200|   1|
| 2|2006-07-24 00:00:00|2007-08-01 00:00:00|  |  2|      2|   172800|   3|
| 3|2006-07-24 00:00:00|2007-08-01 00:00:00|  |  3|      2|    86400|   4|
+------------------------------------------+  |  4|      2|   345600|   2|
                                              |  5|      3|  1209600|   5|
                                              |  6|      3| 31363200|   0|
                                              +--------------------------+

Event 1: iedere 3 dagen
Event 2: iedere maandag, woensdag en donderdag
Event 3: 1x per twee weken en een keer 2 dagen voor de einddatum

Hiermee kun je meer gevallen afvangen zoals
  • iedere twee dagen en
  • iedere eerste maandag van de maand, al kan dat behoorlijk gecompliceerd worden (schrikkeljaar).
Waar staat die Next column voor?

Iedere 3 dagen heb ik reeds, dat werkt.
Wat ik op dit moment voor iedere 3 dagen doe is, startdate checken, enddate berekenen (kan max $count zijn, kan $enddate zijn, kan null zijn) en vervolgens alle dagen tussen $startdate en $enddate eruit halen. Die array filter ik dan weer door elke 3e key=>value uit de array te halen.

Dat werkt vrij goed. Maybe btje omslachtig, maar het werkt vrij goed en is snel zat.

Lastiger is op dit moment even een array te filteren die alle maandagen en dinsdagen tussen $start en $end bevat, waarbij het interval om de 2 weken ligt.

ik krijg met deze hitte echt geen regel code op het scherm. Simpel weg te warm.

Overigens ben ik de recurring events calendar van outlook aan het nabouwen. Dan weet je ongeveer waar ik heen wil.

Verstand van Voip? Ik heb een leuke baan voor je!


Verwijderd

megamuch schreef op dinsdag 25 juli 2006 @ 15:06:
[...]
Waar staat die Next column voor?
[...]
De next column bevat een verwijzing (foreign key) naar een andere rij uit de tabel Recurrence, hierdoor kan een cyclische herhaling worden gemaakt van een aantal 'asynchrone' acties.

Voorbeeld: bij event 2 (id = 2) wordt verwezen naar iedere maandag, woensdag en donderdag. In de Recurrence tabel zijn vervolgens drie rijen te vinden met eventId = 2. De eerste start op maandag (zie event tabel) met een deltaTime van 2 dagen (= 172800 seconden) waarbij next verwijst naar id = 3. Hier staat weer een vermelding van 1 dag (86400 seconden) en next verwijst naar id = 4. Deze heeft een deltaTime van 4 dagen (345600 seconden) en verwijst terug naar id = 2.

Cyclus: 
  2 (2 dgn) => 3 (1 dag) => 4 (4 dgn) =>
  2 (2 dgn) => 3 (1 dag) => 4 (4 dgn) =>
  2 (2 dgn) => 3 (1 dag) => 4 (4 dgn) => etc...


Door de startdatum (timestamp) te nemen en daar telkens de deta tijden bij op te tellen kun je eenvoudig berekenen wanneer er een event is (als ik je tenminste goed begrijp).

Het berekenen van de delta tijden kan misschien nog wel complex zijn, denk aan jaarlijks een verjaardag plannen... rekening houdend met bijvoorbeeld schrikkeljaren. Maar dat is volgens mij ook te doen.
Pagina: 1