[PHP/MYSQL] databasestructuur voor uitgebreide kalender

Pagina: 1
Acties:

Onderwerpen


  • Proxikill
  • Registratie: Mei 2007
  • Laatst online: 18-09 18:42
Ik heb momenteel een kalender waarop aanwezigheden bevestigd kunnen worden, files met trainingsinhoud aan een dag gekoppeld kunnen worden en trainers hun aanwezigheid op een training kunnen invoeren.
Dit alles is doorheen enkele jaren uit een eenvoudige kalender ontstaan en is dus iedere keer op een iets andere manier geschreven.

Nu beginnen er stilaan enkele lastige problemen te ontstaan doordat er niet altijd rekening is gehouden met alle mogelijke omstandigheden. Zo is het mogelijk te kiezen of je per maand of per week een file wil uploaden, maar indien je na x tijd ven gedachte veranderd en wil wisselen loopt het eigenlijk al mis. Er wordt slechts gebruik gemaakt van 1 flag waarmee aangegeven wordt voor welke periode er geüpload wordt, welke zich in de tabel trainingen bevindt. Deze omzetten heeft dus ook effect op files die in het verleden zijn geüpload en dat is niet de bedoeling.
Verder zijn er ook nog hard-coded enkele lapmiddeltjes ingevoerd. Zo zijn er 3 zwemtrainingen per week voorzien, en alle data staat hiervan in 1 file. Bij het uploaden kijk ik dus in de database naar alle rijen waar er als type "Zwemmen" vermeld staat en koppel ik deze file aan de 3 trainingen. Dit is niet zo netjes, dus daar zou ik ook een oplossing voor willen.

Verder worden er verschillende manieren gebruikt om een bepaald rij aan een bepaalde training op een bepaalde dag te koppelen. Er komt een keer de datum terug; een keer de week en het jaar van de training in een aparte kolom en een keer diezelfde info op week_jaar manier. Ook daar zou ik een rechte lijn in willen brengen.

Alles begint met een goede structuur op in de database, maar daar geraak ik wat mee in de knoop. Omdat ik niet weer met allerlei lapmiddelen wil beginnen had ik graag jullie feedback gehad.

Momenteel heb ik volgende databasestructuur:

trainingen
Kolominfo
id
dowday of week
typezwemmen/fietsen/lopen/...
locatieplaats
beginbeginuur
endeinduur
upload_trainingenperiode waarvoor een training geüpload wordt, 1=week; 2=maand


trainingen_upload
Kolominfo
tidID van overeenkomstige training
docnaam van de file
nrweeknr_jaar of maandnr_jaar. Wordt gebruikt om vanuit een kalender de juiste file te zoeken


trainingen_aanw
Kolominfo
id
trainingID van de overeenkomstige training
lidID van het overeenkomstige lid
wweek van training waarop je aanwezig bent
yjaar van training waarop je aanwezig bent
status0=afwezig, 1=aanwezig


trainers_aanw
Kolominfo
lidID van het overeenkomstige lid
trainingID van de overeenkomstige training
datumdatum van aanwezigheid (yyyy-mm-dd)



aflassingen
Indien er een record gevonden wordt voor een training op een bepaalde dag wil dit zeggen dat ze is afgelast
Kolominfo
id
trainingID van de overeenkomstige training
datumdatum van aanwezigheid (yyyy-mm-dd)
opmerkingbijkomende info



Als oplossing voor de problemen heb ik het volgende al bedacht:
  1. Notatie van data: alles naar yyy-mm-dd formaat brengen.
  2. Files aan trainingen koppelen: hier ben ik aan het denken om volgende kolommen voor te gebruiken
    trainingen_upload
    Kolomidtrainingfiledatum
    infoID van overeenkomstige trainingFilenameDatum van de training

    Tijdens het uploaden zou ik dan vinkjes aanbieden om aan te duiden voor welke trainingen je upload. Eventueel kan ik dat nog iets vereenvoudigen door categorieën te gebruiken? Wat wel vaststaat is dat de periode waarvoor een file moet dienen zou op dit niveau geen effect meer mogen hebben. Kan ik dan best bij het uploaden voor iedere dag dat er die week/maand training is een nieuw record maken?
  3. Bijkomstigheid: ik zou graag als soort subcategorie van een training groepen maken, zodat mensen niet voor een training aanmelden, maar voor een bepaalde groep op een training. Bij de tabel waarop de aanwezigheden opgeslagen worden moet er dus eigenlijk gewoon de groep opgeslagen worden. Daarvoor zie ik volgende tabel:
    trainingen_groepen
    Kolomidtraininggroep
    infoID van overeenkomstige trainingNaam van de groep

  • moozzuzz
  • Registratie: Januari 2005
  • Niet online
Dit subforum is hier eigenlijk nie tvoor bedoeld, maar ik vermoed dat de modjes dit wel zullen verplaatsen naar /86.

Zonder ervaring in de materie zou ik gevoelsmatig kiezen voor:

Cursussen (naam, algemene info, ...)
Trainingsmomenten (cursusid, specifieke datum/uur, afgelast J/N, opmerkingen, ...)
Training_aanwezigheden (trainingsmomentid + uid)
Trainers (uid, etc)
Documenten (docid, name etc, trainingsmoment)

Het verhaal vd documenten is niet zo helder, maar gezien die aan één of meerdere moment(en) hangen beantwoord ik wellicht je vraag over mijn mening;^)

Bij creatie cursus maak je meteen ook automagisch x aantal lege trainingsmomenten aan.

Categorien kan je op twee manieren oplossen, ofwel manueel door een type/cat toe te voegen aan cursussen of wel door het wat moeilijker te doen via extra tabel categorien.

  • Proxikill
  • Registratie: Mei 2007
  • Laatst online: 18-09 18:42
Verdorie, ik heb inderdaad het foute subforum genomen! Excuses daarvoor!

Jij zou dus trainingsmomenten voor iedere moment een nieuwe rij geven? Wordt het op lange termijn dan niet ontzettend groot? 5 trainingen/week *52 is al grofweg 250 rijen, voor 1 jaar. Indien het systeem dan over een langere periode gebruikt wordt, waarbij er een archief wordt bijgehouden zijn het al wel veel rijen...

Ik denk dat ik voor categorieën zou opteren voor een extra tabel. Dat heeft toch het voordeel dat je nadien toch enkele zaken extra kan toevoegen vind ik.

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 16:05

MueR

Admin Tweakers Discord

is niet lief

Proxikill schreef op donderdag 22 september 2011 @ 13:10:
Verdorie, ik heb inderdaad het foute subforum genomen! Excuses daarvoor!
Maak de volgende keer maar gewoon een Topic Report (Afbeeldingslocatie: http://tweakimg.net/g/forum/images/icons/icon_hand.gif)
Jij zou dus trainingsmomenten voor iedere moment een nieuwe rij geven? Wordt het op lange termijn dan niet ontzettend groot? 5 trainingen/week *52 is al grofweg 250 rijen, voor 1 jaar. Indien het systeem dan over een langere periode gebruikt wordt, waarbij er een archief wordt bijgehouden zijn het al wel veel rijen...
Dat is niet groot. Zodra je over miljoenen records praat wordt het "aardig". Bij een honderd miljoen wordt het "groot". Een database kan daar prima mee werken, daar worden ze voor gemaakt namelijk.

Anyone who gets in between me and my morning coffee should be insecure.


  • Proxikill
  • Registratie: Mei 2007
  • Laatst online: 18-09 18:42
[quote]MueR schreef op donderdag 22 september 2011 @ 13:17:
[...]

Maak de volgende keer maar gewoon een Topic Report ([afbeelding])
[quote]
Valt het op dat ik geen alledaagse forumgebruiker ben op T.net? Heb er achter aan het zoeken geweest, maar merk nu pas dat ik niet bij de reacties moet kijken, maar bij het topic zelf. Weeral wat bijgeleerd!
MueR schreef op donderdag 22 september 2011 @ 13:17:
[...]

Dat is niet groot. Zodra je over miljoenen records praat wordt het "aardig". Bij een honderd miljoen wordt het "groot". Een database kan daar prima mee werken, daar worden ze voor gemaakt namelijk.
Da's ongeveer een archief van 4000 jaar, zover gaat zelfs de bibliotheek niet :)
Het heeft natuurlijk wel voordelen dat er per training een aparte rij bestaat. Zo is ook het eventueel verplaatsen naar een andere dag een pak eenvoudiger.

Het wordt me allemaal duidelijk nu, bedankt voor de info!
Zou ik dan best met een cron werken die zorgt dat er steeds 1 maand vooruit trainingen verschijnen?

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Proxikill schreef op donderdag 22 september 2011 @ 12:49:
Als oplossing voor de problemen heb ik het volgende al bedacht:
  1. Notatie van data: alles naar yyy-mm-dd formaat brengen.
Onzin. Gebruik gewoon een DateTime veld en gebruik de DateTime functies van je RDBMS om te zoeken op een bepaalde week oid. In je presentatielaag kun je prima een weeknummer weergeven terwijl de onderliggende datum een exacte dag bevat. Het lijkt me sowieso verstandig de daadwerkelijke datum (+tijd) op te slaan van de trainingen. Zie ook Getallen en talstelsels FAQ (en dan vooral punt 9 en 11)
Proxikill schreef op donderdag 22 september 2011 @ 14:16:
Zou ik dan best met een cron werken die zorgt dat er steeds 1 maand vooruit trainingen verschijnen?
Waarom zet je niet alle trainingen (voor zover bekend) tot en met st. Juttemis vast in de DB :? Je kunt toch gewoon met een where eventdate < dateAdd(dd, 30, Now()) alle events voor de komende 30 dagen opvragen en met een beetje spelen met deze clause kun je alle gewenste overzichten van elke gewenste datum (of zelf bereiken van - tot) genereren. Al staan er trainingen in van 2019; die zie je pas als je ze queryed/queriet/kweeried opvraagt :+

[ Voor 31% gewijzigd door RobIII op 22-09-2011 15:01 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1