Gå til innhold

Anbefalte innlegg

Hei

 

Jeg prøver å lage en database i Mysql, med flere tabeller.

Denne skal jeg bruke til å organisere arrangementer.

F.eks har vi arrangementleder, tekniker 1, tekniker 2, musiker 1, musiker 2, musiker 3, musiker 4.

Er det slik at jeg bør lage en tabell med brukere, en med arrangement, og en for hver oppgave?

Lenke til kommentar
Videoannonse
Annonse

Det er jo mange måter å gjøre dette på. Her er et lite forslag:

 

19128570580_cd9d5d6bcb_b.jpg

Her er Todo-tabellen en knytning som sier at en person utfører en bestemt oppgave på et bestemt arrangement, ulike oppgaver ligger i tabellen Oppgave og kan utføres av ulike personer på ulike arrangement. Todo-oppgavene har avhengighet mellom seg, slik at man kan bestemme at en oppgave ikke kan utføres før en annen er ferdig. Men den avhengigheten burde kanskje heller ligge på Oppgave-tabellen? Eller begge steder? Hva med oppgavens varighet? Den kommer kanskje an på arrangementet, å rigge scenen på et lite arrangement tar ikke så lang tid som å rigge scenen på et stort. Så du vil kanskje legge på en tabell Lokale, og lage en knyttetabell mellom oppgave og lokale, hvor du kan lagre slike variable ting. 

 

Du kan også lage en kvalifisert-tabell mellom oppgave og person, som forteller at en person er kvalifisert til å utføre en bestemt oppgave. Dette kan du bruke til å registrere f.eks. musikere, teknikere, osv.

 

Du kan legge timelønn i person-tabellen og registrere medgått tid i Todo osv. osv. I det heletatt er det ikke vanskelig å lage en fantastisk avansert datamodell som støtter allverdens fancy greier, men da vil du aldri bli ferdig. Begynn med noe veldig enkelt, men som ikke er så enkelt at det ikke kan utvides, og så legger du på fler felt og tabeller, og mer funksjonalitet i koden, etterhvert som du ser at du faktisk trenger det. 

Endret av quantum
Lenke til kommentar

Svaret til @quantum er det absolutt ingenting å utsette på.

 

Tenkte jeg skulle reiterere: "Begynn med noe veldig enkelt, men som ikke er så enkelt at det ikke kan utvides, og så legger du på fler felt og tabeller, og mer funksjonalitet i koden, etterhvert som du ser at du faktisk trenger det." 

Strålende tips!

 

@quantum: av nysgjerrighet; hvilket verktøy brukte du for å tegne den UMLen?

Lenke til kommentar

 

 

@quantum: av nysgjerrighet; hvilket verktøy brukte du for å tegne den UMLen?

 

SQL Power Architect community edition som er fin og enkel hvis man driver med java (jdbc) og ønsker støtte for ulike databaser. Hvis man driver kun med MySQL og ikke orker å drive med jdbc-drivere bare for modelleringens skyld kan man sikkert like godt bruke noe annet, google mysql designer eller noe ... 

Lenke til kommentar
  • 1 måned senere...

Hei

 

Takker for hjelpen med forslag til databasen. Det jeg er ute etter er å lage en oversikt over møter i vår forsamling.

Vi bruker talere, teknikere og musikere på hvert møte. Per i dag har jeg en Excelfil hvor alt er lagret i kolonner etter hverandre.

Jeg kunne nok fint fått plass til alt i en tabell, men da ville noe av hensikten min med dette forsvinne. Jeg ønsker å lære meg, hvordan jeg setter opp Mysql-databasen og hva jeg bør tenke på. I Excel-arket har jeg per i dag en rad pr. arrangement med kolonne for taler, tekniker1, tekniker2, musiker1, musiker,2 musiker3. Mange av disse navnene inneholder samme navn.

Jeg tenkte at første steg var å lage en tabell som het hoved og en som het person. Da kunne jeg hente registrerte personer fra persontabellen og sette dem inn i på hver funksjon. Høres ikke det riktig ut?

Jeg har laget disse tabellene i phpmyadmin, jeg har også opprettet Foreign keys fra personid til tekniker1 og fra personid til tekniker2 og til musikerfeltene. Hvis jeg skriver SELECT * FROM hoved får jeg opp alle kolonnene i hovedtabellen. Men disse inneholder jo

verdier som for eksempel 1 og 2, hvordan får jeg spørringen til å vise navnene, som ligger bak verdiene, som er lagret i persontabellen?

Det er litt vanskelig for meg å forklare dette, dere får bære over med det. Takk for god hjelp.  

Lenke til kommentar

Ofte er det sånn at når noe er vanskelig å forklare for andre, så er årsaken at man ikke er helt ferdig med å tenke gjennom tingene. Sånn er det ihvertfall med meg, når jeg må spørre andre om hjelp skjønner jeg som regel svaret selv mens jeg forklarer hva jeg lurer på.

 

Du har litt vag beskrivelse av det du trenger så jeg har ikke noe bedre forslag til deg enn du alt har fått. Det virker forøvrig ikke som du har sett noe særlig på det.

 

For det første skal du ikke ha en tabell som heter "hoved". Det er ikke noe navn. Den skal f.eks. hete "møte" eller "arrangement" eller noe annet beskrivende.

 

For det andre skal du sette deg litt inn i noe som heter databasenormalisering. Det er en egen vitenskap som du ikke kan få hodet rundt på en-to-tre, men i dette tilfellet går det ut på at kolonnene tekniker1, tekniker2, musiker1 osv. er fy. Dette blant annet fordi det skal en voldsom del flaks til for at du ikke får for mange eller for få slike kolonner. Det du er ute etter er en mange-til-mange-relasjon, og da bruker man en knyttetabell. Hvis du vil knytte en person til et arrangement, lager du en tabell, f.eks. person-arrangement, som har fk til person_id og arrangement_id (disse to tilsammen utgjør da pk (primærnøkkel) for knyttetabellen). Du kan da ha mange personer knytta til hvert arrangement, og hver person kan være knytta til mange arrangement. Hvis du i tillegg ønsker at knytningen skal si noe om hva personen skal gjøre, være tekniker, spille musikk, styre med lys, osv. så kan du fint få til dét også, det er bare å løfte blikket noen centimeter oppover her i tråden.

 

Når du lurer på hvordan du skal få tak i navnene bak person-id'ene så må du bruke join.

 

Lurer du på hvilke personer m. navn som er knytta til arrangement med id = 1 spør du slik (gitt tabellene i #2)

 

select p.navn from Todo t inner join Person p on t.person_id = p.person_id where t.arrangement_id = 1;

Endret av quantum
Lenke til kommentar

Hei

 

Jeg så på eksempelet ditt, og jeg tror jeg begynner å forstå hvordan det bør være.

Jeg har lest en del om normalisering tidligere, men ikke helt fått med meg alt.

Jeg skal bruke litt mer tid på å studere eksempelet, og så opprette denne databasen i MySQL.

Takk for hjelpen foreløpig.

Lenke til kommentar

Hei

 

Jeg prøvde å sette opp denne databasen, slik som du tegnet den.

Det dukker opp et spørsmål: Hvorfor er PK og PFK VARCHAR? Bør ikke de være INT?

 

Hei, ja, det var litt tilfeldig, og ikke tilsiktet, at det ble varchar, default-typen i tegneverktøyet jeg brukte. Det kan godt være varchar, men ofte når man bruker tekniske nøkler (i motsetning til naturlige, som kan være f.eks. email-adresse eller noe annet mer eller mindre meningsfullt) så bruker man genererte verdier fra en sekvens i databasen (autoincrement elns heter det vel i mysql), og da blir det jo et tall. Pass ihvertfall på å bruke en datatype med plass til store nok tall, så du ikke får en uønsket begrensning på hvor mange rader du kan ha.

 

(Man skal tenke seg litt om før man begynner med naturlige nøkler, i mange tilfeller er jo epost-adresse, personnummer eller telefonnummer helt greit til å identifisere en person, men disse kan endres, og da må jo også alle fk'er oppdateres samtidig.)

 

Jeg ville brukt litt tid på å tegne opp ulike datamodeller på papir eller i et eller annet verktøy, uten å opprette noe i database eller kode noe som helst, da er det enkelt å kaste og lage noe nytt inntil man er fornøyd. Det skal f.eks. litt til at forslaget mitt egentlig passer helt til ditt behov. I såfall må det skyldes flaks. Og igjen, keep it simple, alle normaliseringskrav, andre databaseteoretiske regler, og ikke minst gode ideer, kan føre til datamodeller som er unødvendig kompliserte, det kan gi dårlig ytelse, og det kan bli unødvendig kostbart å implementere og vedlikeholde koden som skal kjøre oppå. 

Lenke til kommentar

Hei

 

Jeg opprettet tabellene, og kjørte spørringa du foreslo. Det funket bra det.

Målet mitt med disse tabellene, er å få ut en masterplan over arrangementene, og hvem som er tildelt de forskjellige oppgavene på arrangementene.

Kan du hjelpe meg på vei med en spørring som lager denne tabellen?

Lenke til kommentar

 

Kan du hjelpe meg på vei med en spørring som lager denne tabellen?

altså en spørring som dumper "alt" (men ikke nøkler, der hvor det kan stå navn osv), gitt tabellene i diagrammet?

 

Ja, det stemmer.

Lenke til kommentar
select a.navn as arrangement, a.dato as dato, p.navn as person, o.oppgavenavn as oppgave
from Arrangement a
inner join Todo ta on a.arrangement_id = ta.arrangement_id
inner join Person p on p.person_id = ta.person_id
inner join Oppgave o on o.oppgave_id = ta.oppgave_id

Det blir vel noe sånt ... ikke prøvd så ta høyde for litt justering.

Lenke til kommentar
  • 2 uker senere...

Hei

 

Pga. tidsnød har jeg foreløpig en tabell som heter hoved. Fra denne har jeg laget et view i mysql som henter de 10 neste møtene ut fra hovedtabellen. Dette viewet er så koblet sammen med en plugin i wordpress som heter wpdatatables.

Den viser viewet oversiktlig og greit. Problemet mitt er at den ikke oppdaterer viewet, slik at når en dato passeres, forsvinner møtene fra tabellen. Ser ut til at viewet kun oppdateres når det legges inn ny data i tabellen.

 

Her er spørringen som er bakgrunn for viewet:

 

 
Dato, klokkeslett, taler og sanger på 10 neste møtene:
 
SELECT dato as Dato, klokke as Klokkeslett, tm.motetype as Type, taler as Taler,sanger as Sanger
FROM hoved h
LEFT JOIN typemote tm on h.type = tm.typeid
WHERE h.dato >= DATE(NOW())
ORDER by h.dato, klokke asc
LIMIT 10
 
mvh
Harald
Lenke til kommentar

Hm ... det har ikke å gjøre med noe så banalt som Ctrl-F5 i browseren da? Du får vel det du vl ha når du kjører

 

1) sql'en som beskrevet over

2) select * from the_view_whatever_you_did_name_it

 

?

 

Hvis nei på 2) så er det noe med mysql, hvis ja så har det med wordpress å gjøre. I såfall er dette kanskje ikke beste gruppe. 

 

views i MySQL har jeg ikke noe greie på, som resten av MySQL, men hvis du ikke får oppdatert resultatet av et view når du oppdaterer grunnlaget er det jo merkelig. Et "materialized view" som fra datavarehus vil jo ikke være umiddlebart oppdatert, men jeg har aldri hørt at MySQL har statiske views som default eller noe ... her må noen andre svare.

Lenke til kommentar
  • 1 år senere...
select a.navn as arrangement, a.dato as dato, p.navn as person, o.oppgavenavn as oppgave
from Arrangement a
inner join Todo ta on a.arrangement_id = ta.arrangement_id
inner join Person p on p.person_id = ta.person_id
inner join Oppgave o on o.oppgave_id = ta.oppgave_id

Det blir vel noe sånt ... ikke prøvd så ta høyde for litt justering.

 

 

Hei, jeg har sett litt på dette igjen. Blir det ikke slik med denne spørringen at jeg da får en liste som ser slik ut:

 

Arrangement | Dato | Person | Oppgave

​Møte 1            1/6       Harald    tekniker 1

Møte 1            1/6        Jørgen  tekniker 2

Møte 2             8/6       Thomas tekniker 1

Møte 3             15/6      Ragnar tekniker 2

 

Går det an å lage en visning som ser sånn ut:

 

Arrangement | Dato  | tekniker 1 | tekniker 2

Møte 1            1/6       Harald        Jørgen

Møte 2            8/6       Thomas

Møte 3            15/6                        Ragnar

 

Det blir mer oversiktlig for oss hvis det blir slik.

Jeg ønsker å ha oversikten over hvor det ikke er plassert folk til de forskjellige oppgavene.

 

Harald

Lenke til kommentar

google sier https://stackoverflow.com/questions/662207/mysql-results-as-comma-separated-list

 

eventuelt vurder å lage et gui, da du er over på noe som kanskje bør håndteres i presentasjonslaget.

 

Takk for svar.

 

Jeg har brukt et program som heter DaDaBIK for å administrere dataene. Dette har fungert foreløpig.

Jeg har tenkt å gå gjennom hele oppsettet fra bunnen av og har derfor sett mer på eksempelet ditt helt i begynnelsen av tråden. Jeg har tegnet et forslag som jeg tror passer til vårt opplegg. Kan du se på dette og gi meg noen tilbakemeldinger på hva du tror? Det er sikkert en del feil her, men jeg tror hovedstrukturen er tålig riktig.

post-190123-0-22072600-1496832814_thumb.jpg

Lenke til kommentar

Ønsker du at oppgaver/todo'er skal utføres av grupper og ikke personer? Ville kanskje byttet om på de to ift. knytning til todo/oppgave, hvis ikke det er noen bestemt tanke bak. Og så har du fjernet muligheten til å la oppgaver avhenge av hverandre, og det antar jeg er fordi du ikke har bruk for det.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...