Avatar billede -zonic- Nybegynder
03. marts 2010 - 15:08 Der er 7 kommentarer og
2 løsninger

Kalender databasedesign med åbningstider?

Hej,

Hej,

Jeg sidder og roder med noget kalender system i php, hvor der skal være nogle åbningstider på denne kalender... Disse kan både være faste, men også variable fra uge til uge.. og mit spørgsmål er hvordan dette gøres på den bedste måde, i forhold til performance med databasen?

Man kan lave hver dato med åben og lukke tid, men hvis man nu planlægger en uge, vil man så med fordel kunne "kopiere" denne således man bruger de samme åbningstider i flere uger..? eller skal dette laves i seperate linjer i databasen?

Er der nogle der har et forslag til hvordan dette håndteres bedst i databasen?

NB.. som det foregår nu, så giver hvert klokkeslet(hver celle i databasen) et timestamp som input, og skal derefter returnere hvorvidt der er åbent eller ej.


på forhånd tak!
03. marts 2010 - 19:38 #1
Jeg er ikke helt klar over hvor du vil hen.  Din sidste saetning kunne tyde paa at du har en tabel i en database, og fra resten af spoergsmaalet vil jeg gaette paa at tabellen har (mindst) tre felter, dato med datatype DATE, aabningstid med datatype TIME, og lukketid ligeledes med datatype DATE.  Tabellen har en raekke (dato, aabningstid, lukketid) for hver dato et stykke ud i fremtiden.  Yderligere forstaar/gaetter jeg at du har en applikation (saasom en hjemmeside) hvor folk kan spoerge om der er aabent paa et bestemt tidspunkt ved i en form at fylde en dato og et tidspunkt ind.  Naar folk saa submitter formen sendes der en SQL forespoergsel til databasen, og fra resultatet af forespoergslen angiver om der paa den paagaeldende dag og tidspunkt er aabent.  Er det alt sammen korrekt?  Hvordan lyder dit SQL statement?

Og hvad er det saa du vil lave anderledes?  Vil du gerne undgaa at skulle fylde aabnings- og lukketider i tabellen for hver dag?

Svaret afhaenger af hvad strukturen er i dine aabnings- og lukketider, hvor tit du aendrer aabnings- og lukketid, og hvor laenge ud i fremtiden aabnings- og lukketider skal vaere tilgaengelige.

Det nemmeste ville jo vaere hvis du havde faste aabnings- og lukketider de forskellige ugedage, for eksempel mandag til torsdag 8.00 til 17.00, fredag 8.00-20.00, loerdag 8.00-13.00 og soendag lukket, dog saaledes at du kan lave om og for eksempel bestemme at fra 1 april vil du foerst aabne klokken 12.00 paa mandage og til gengaeld holde aabent soendage fra 0900-1200.  Hvis du kan strukturere det saaledes ville du bestemt kunne rationalisere databasen.

Hvis du paa den anden side vil vaere fri til at aendre aabningstider fra dag til dag uden noget moenster er der naeppe noget alternativ til for hver enkelt dag at give aabnings- og lukketider.

Lad mig faa din reaktion/svar paa ovenstaaende.  Saa kan vi kikke paa at finde en loesning.
Avatar billede -zonic- Nybegynder
04. marts 2010 - 10:40 #2
Hej Christian, og tak for dit indlæg!

Jeg prøver at præcisere mig lidt - jeg har lavet et kalenderview der er baseret på en uge... dvs. den går fra mandag til søndag horisontalt, og vertikalt starter dagene fra eks. kl 8 - kl 20.

Når calenderen genereres har jeg lavet følgende funktion:


function getOpenHours($x = 0) {
        $date1 = date('n-j-Y',$x);
        $date1 = split('-',$date1);
        $date = mktime(0,0,0,$date1[0],$date1[1],$date1[2]);
        $date2 = date('Y-m-d',$x);
        $query = parent::query("SELECT dato, open, close FROM min_tabel WHERE dato='$date2'");
        while($res = mysqli_fetch_object($query)) {
            $dOpen = strtotime($res->dato . ' ' . $res->open);
            $dClose = strtotime($res->dato . ' ' . $res->close);
        }
        if($x >= $dOpen && $x <= $dClose) {
            $r = true;
        } else {
            $r = false;
        }   
        return $r;
    }


dvs. for hver celle får jeg et timestamp ind ($x) i denne funktion der så tester om der skal være åbent eller lukket.

Nu til udfordringen:
jeg tager en klinik med to healere som eksempel. Disse har hver deres kalender, hvor de skal taste deres arbejdstider. Disse kan være forskellige fra uge til uge.. det kunne være en slags arbejdstider i de lige uger og andre i ulige... eller det kunne være arbejde hver 1.søndag i måneden - måske kunne det være 10 uger med én slags arbejdstid, og så 8 uger med noget andet...

Spørgsmålet er så, hvordan bygger jeg det databasearkitektorisk mest korrekt op, således jeg ikke hæmmer performance og jeg stadig holder BCNF... ? :-)

jeg har ikke kodet noget i databasen andet end lidt test, hvor jeg har en dato (date), en open(time) og en close (time).  jeg tror egentlig det er fint nok, spørgsmålet er bare hvordan jeg håndterer det med "arbejdsplaner" hvor de skal gentages... Altså, skal der, når man planlægger laves én linje for alle arbejdstider - dvs. 365 om året, eller hvordan skal det gribes an?

håber det gav et bedre indblik i hvad jeg mener :-)
04. marts 2010 - 12:13 #3
Jeg blev lidt klogere - den der forespoerger databasen er dig, og formaalet er at traekke data ud til at danne kalenderviews.  Er det ogsaa dig der fylder data i databasen, efter input fra healerne?

Der er et antal healere (du siger to, men det skal vel kunne virke hvis antallet aendrer sig?)  Hver healer bestemmer sine egne aabnings- og lukketider og de kan vaere forskellige fra dag, for eksempel mandag 1 maj fra 8 til 2, tirsdag 2 maj fra 9 til 5, mandag 8 maj fra 12 til 16 o.s.v.  Skulle systemet kunne virke hvis en healer bestemmer sig for en middagspause saaledes at der er aabent fra 10-12 og fra 14-16? 

Du maa saa noedvendigvis i databasetabellen, ud over dato, aabnings- og lukketid have en healer-id (eller have adskillige tabeller, en for hver healer, men det er vist ikke BCNF.)

Jeg vil under alle omstaendigheder mene at du skal designe databasen efter dataernes logiske struktur og i foerste omgang gleme alt om hvordan du tilfaeldigvis vil have dataerne trukket ud og presenteret.  Du skulle jo noedig til at bygge databasen om hvis du i morgen kommer i tanker om en bedre presentation eller at du vil traekke andre ting ud, for eksempel en oversigt over totale aabnings-timer den forloebne maaned.  Jeg vil mene at du skal have disse tabeller:

HEALER
healerid, navn, .......

AABNINGSPERIODE
dato, healerid, aabningstid, lukketid.

Det vil virke for et 'ubegraenset' antal healere og for en healer der har adskillige aabningsperioder paa en dato, for eksempel 1 maj, healer1, fra 10-12 og 1 maj, healer1, fra 14-16. Jeg kan ikke see nogen mulighed for, i databasen, at modellere aabningsuger der kan genbruges.  Hvis det skal vaere maa det ligge i applikationen.

Naar foerst databasen paa plads saa kan du begynde at designe din applikation.  Vil du vise en ugekalender for hver healer?  (Det bliver vel rodet at proeve at faa aabningstider for mere end en healer i et kalenderview.)  I saa fald skal din funktion modtage en healerid og den skal med i din query saa som "...WHERE dato = '$date2' AND healerid = $id".

For at tillade mere end en aabningstid per dag skal "if($X>=$dOpen...." med ind i while-loekken.  Du laver en forespoergsel paa aabningstider for en healer for en dag, og det kan resultere i mere end et resultat.  Saa i while ($res...) slaar du for det foerste resultat aabnings- og lukketider op og tester for true eller false, og saa ser while-loekken efter om der er endnu et (eller flere) resultater som saa testes for true eller false.

Jeg tillader mig at oprette dette som et svar idet jeg haaber det vil vaere nyttigt.  Hvis der er ting jeg har misforstaaet saa fortael det, saa skal jeg kikke paa det endnu en gang.
Avatar billede -zonic- Nybegynder
04. marts 2010 - 13:04 #4
hej igen,

tak for dit svar... desværre var det ikke helt det jeg ledte efter... :-)

jeg har ikke problemer med hvordan jeg skal kode det hele, det er udelukkende min databasestruktur jeg gerne vil lave rigtig første gang... så hvis jeg nu siger følgende.



Finn Hansen:

mandag    8-16        pause 13  - 13.30
tirsdag      8-17        pause 13  - 13.30
onsdag    8-18        pause 13  - 13.30
torsdag    8-20        pause 13  - 13.30
fredag      8-16        pause 13  - 13.30
lørdag      8-14       
søndag      intet

plan for uge: 1,2,4,5,6,8,12,24,25,28,30



hvordan vil du lave strukturen i db'en?
i seperate linjer for hver dag med noget fælles id? eller en linje for hver uge etc. etc. etc.?

Spørgsmålet er, hvordan håndterer jeg disse planer bedst?
04. marts 2010 - 13:46 #5
Nu hopper vi for meget rundt og der bliver ved med at komme nye oplysninger op.  Du vil nu have ugenumre paa ogsaa, og du synes nu at antyde at helerne vil annoncere aabningstider saa meget som 30 uger i forvejen hvor jeg forstood fra dine tidligere indlaeg at de kunne aendre dem fra uge til uge.

Men min mening er, nu du spoerger om den, hvad jeg sagde ovenfor, at du i databasen skal bevare grundoplysningerne, det vil sige en record, per healer, for hver aabningsperiode, det vil sige dato, aabningstid, og lukketid.  For eksempel

1 maj 2010, 0800, 1300
1 maj 2010, 1330, 1600

Derefter skal du i applikationen traekke de data ud du for hver presentation skal bruge og at du med samme database kan aendre presentation og foretage andre typer forespoergsler.

Hvis du kan anvende min mening til noget saa er det godt.  Hvis du ikke kan bruge det til noget saa beklager jeg og haaber du faar andre indlaeg.
Avatar billede -zonic- Nybegynder
04. marts 2010 - 17:07 #6
hmm.. jeg synes egentlig ikke der er kommet nye informationer - jeg har bare uddybet hvad jeg vil :-)

men dvs. du vil anbefale at alle datoer får hver deres linje...?

og hvordan vil du så samle referencerne?

hvis jeg nu, feks. planlægger alle lige uger til at være det samme, men pludselig skal ændre én, så er der jo noget reference halløj... eller hvis jeg vil slette alle de lige uger.. så er det jo noget lettere at kunne slette alle på én gang...
04. marts 2010 - 19:31 #7
Nej jeg stoppede.  Jeg var aabenbart ikke i stand til at hjaelpe.  Jeg begik en fejl ved at begynde paa et spoergsmaal der forekom mig saa uklar fra begyndelsen af.
Avatar billede -zonic- Nybegynder
05. marts 2010 - 10:00 #8
okay... hvis du vil have lidt point for din tid, så smid et svar..
Avatar billede -zonic- Nybegynder
05. marts 2010 - 10:01 #9
hov...det havde du jo gjort :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester