Avatar billede torpmikkelsen Juniormester
03. maj 2007 - 18:58 Der er 23 kommentarer og
2 løsninger

Database opbygning

Hej Experter

Jeg skal igang med at lave et database projekt.

Kort fortalt indeholder databasen nogle medarbejdere som hver især skal indeholde nogle jobfunktioner. Altså hvilke fagområder de mestrer.

Hvis jeg vidste på forhånd hvilke jobfunktioner der var tale om ville det ikke være noget problem.
Men der skal være mulighed for at tilføje nye jobfunktions-grupper og tilknytte medarbejdere til den gruppe. Så de skal altså have mulighed for at være tilknyttet flere jobfunktioner.

Jeg kan ikke rigtigt gennemskue hvordan jeg opbygger databasen bedst.

Kan man evt. lave et felt som indeholder alle de jobfunktioner som medarbejderen mestrer, og så lave et select statement som kigger i det felt og ser om feltet indeholder fx. "programmør"? Selvom feltet også indeholder andre ord.

Kan det lade sig gøre, og er der evt. en nemmere opbygningsmetode?

Tak fordi du læste hele denne smøre, nu håber jeg bare at du sidder med den gyldne sten i hånden.
Avatar billede neoman Novice
03. maj 2007 - 19:26 #1
Du har jo en many-to-many relation  - så det er to tabeller med grunddata, og en tredje til at knytte dem sammen via de to forudgåendes primær-nøgler:

Tabel Medarbejdere :
MedarbejderID, Navn, Telefon, blabla

Tabel Funktioner :
FunktionID, Beskrivelse, Dato ,whatever....

Tabel Medarbejdere_i_Funktioner :
MedarbejderID, FunktionID


F.eks.  (hvor jeg for eksemplets skyld har antaget nogle ID-erog vist dem  i parantes..)

Ole(1)  Gartner(1)
Ole(1)    Tillidsmand (2)
Ole(1)    Gruppeleder(3)
Ole(1)    Kantinemedarbejder(4)
Orla(2)  Klaverbokser(5)
Orla(2)  Kantinemedarbejder(4)

eller
1      1
1      2
1      3
1      4
2      5
2      4
Avatar billede torpmikkelsen Juniormester
03. maj 2007 - 19:33 #2
Det giver faktisk rigtigt god mening!

Takker, det vil jeg prøve!

Er det ok, at jeg lige holder tråden åben indtil jeg har bygget lidt i den her retning for at se om jeg får det til at fungere.

Det kan jo være at jeg lige skal bruge et fif eller noget senere i processen!
Avatar billede dr_chaos Nybegynder
03. maj 2007 - 19:33 #3
Jeg er enig med neoman.
Men jeg ville dog lave en ændring :
Tabel Medarbejdere_i_Funktioner :
Medarbejder_FunktionID(autogeneret), MedarbejderID, FunktionID, StartDato, SlutDato

På den måde har du en historik over tidligere funktioner
Avatar billede torpmikkelsen Juniormester
03. maj 2007 - 19:41 #4
OK, fedt!
Ja, det er også en god ide. Og det er jo ikke noget der kræver vannittigt meget ekstra.

Takker!
Avatar billede dr_chaos Nybegynder
03. maj 2007 - 20:18 #5
Det stiller dog lidt større krav til den sql du bruger til at gemme en funktionsændring med.
Er det access eller sql server ?
Avatar billede torpmikkelsen Juniormester
03. maj 2007 - 20:22 #6
det er en sql
Avatar billede dr_chaos Nybegynder
03. maj 2007 - 20:43 #7
Du bør kigge lidt på stored procedures hvis du ikke har arbejdet med det før.
SlutDato feltet skal være null som default.

eksempel på sql:
CREATE Procedure UpdateFunk
@FunktionID  int,
@MedarbejderID  int,
@StartDato Datetime,
@SlutDato DateTime = null,
@Medarbejder_FunktionID int output

AS
BEGIN
if EXISTS(SELECT 1 FROM Medarbejdere_i_Funktioner m WHERE m.MedarbejderID=@MedarbejderID AND m.FunktionID=@FunktionID AND getdate BETWEEN m.StartDato AND ISNULL(m.SlutDato,getdate()+1)  )
BEGIN
UPDATE m SET  m.SlutDato=@StartDato-1 FROM Medarbejdere_i_Funktioner m WHERE m.MedarbejderID=@MedarbejderID AND m.FunktionID=@FunktionID AND getdate BETWEEN m.StartDato AND ISNULL(m.SlutDato,getdate()+1)
END
INSERT INTO  Medarbejdere_i_Funktioner (MedarbejderID, FunktionID, StartDato, SlutDato)
SELECT @MedarbejderID, @FunktionID, @StartDato, @SlutDato
--hent nyt id
SELECT @Medarbejder_FunktionID = SCOPE_IDENTITY()

END
Avatar billede torpmikkelsen Juniormester
03. maj 2007 - 20:55 #8
Ved nærmere eftertanke tror jeg at jeg lige venter med det med start og slut dato. Men jeg vil forsøge at bygge det på senere...

Nu har jeg fået bygget database tabellerne.
staff (indeholder personerne)
functions (indeholder jobtyper)
staffFunctions (sammenkobler de to)

Jeg har lavet en selectbox som indeholder alle jobtyperne fra tabellen functions.
Når man vælger en jobtype viser den i et dataGrid hvilke staffId's der er tilknyttet netop denne functionsId. Men istedet for at vise "staffId" fra tabellen staffFunction (som sammenkobler de to tabeller) vil jeg jo gerne vise person navnene fra tabellen staff, som har de udvalgte staffId fra staffFunctions.

Hvordan gør jeg det?

Jeg håber det giver lidt mening!

Jeg bruger Visual Web Developer
Avatar billede torpmikkelsen Juniormester
03. maj 2007 - 21:03 #9
hmmm... jeg kan vel egentligt bare lave et feldt i staffFunctions som indholder navnet på personen også. Er det ikke det nemmeste?
Avatar billede neoman Novice
03. maj 2007 - 21:33 #10
Du skal lave lidt joins i din select statement som så skal læse fra alle tre tabeller - dit andet forslag om at "skamfere"  staffFunctions med redundant info er en af den slags short-cuts som dukker op senere og bider en i &%¤/&¤ :-)
Avatar billede torpmikkelsen Juniormester
03. maj 2007 - 21:43 #11
OK, så holder jeg mig fra den :o)

Kan du beskrive joins lidt mere. Evt. skive en select statement som illutrerer det eller linke til noget læsestof om det.

Jeg sætter stor pris på din/Jeres hjælp! Tak!
Avatar billede neoman Novice
03. maj 2007 - 22:37 #12
http://www.w3schools.com/sql/sql_join.asp og ellers kan du google lidt efter at ha læst linket (eller bladre rundt på samme site).

Jeg er ikke på mere i aften, men du kan jo bare spørge løs hvis du kører helt fast, så får du sikkert et svar på et tidspunkt.
Avatar billede dr_chaos Nybegynder
03. maj 2007 - 22:42 #13
Du kan faktisk lave et view som du kan selecte fra:

Create view view_staff_Functions
AS
SELECT s.staffid, s.name, f.functionname FROM staff s
JOIN staffFunctions sf on sf.staffid=s.staffid
JOIN functions f on f.functionid=sf.functionid
Avatar billede dr_chaos Nybegynder
03. maj 2007 - 22:43 #14
Du skal bare vælge de felter som du gerne vil have med.
Derefter kan du lave
SELECT * FROM view_staff_Functions v WHERE v.name ='davdav'
Avatar billede torpmikkelsen Juniormester
04. maj 2007 - 12:26 #15
Nu har jeg fået join til at virke.

Så nu har jeg oprettet en tabel i databasen der hedder "bookingCalendar". Den indholder felterne "bookingId", "staffId" og "date"

Så nu har jeg er kalender modul hvor man kan vælge en dato og derefter en jobfunktion som man søger og så skal der i et gridview vises hvilke personer der IKKE er bookede på den dato man har valgt.

Så gridview'et skal altså unlade at vise de staffId's der har datoen tilknyttet i tabellen "bookingCalender"

Jeg har selv forsøgt lidt frem og tilbage med mit select statement, og mit bedste skud ser således ud:
SELECT  staff.staffName
FROM    staff INNER JOIN
        staffFunction ON staff.staffId = staffFunction.staffId CROSS JOIN
        bookingCalendar
WHERE  (staffFunction.functionId = @selectedFunction) AND (bookingCalendar.date <> @selectedDate)

men det virker desværre ikke helt. Er det helt skidt, eller er det blot en bagatel?
Avatar billede neoman Novice
04. maj 2007 - 13:06 #16
Jeg løber altid selv sur i joins, og plejer derfor at bruge den grafiske query-generator i Access (hvorpå jeg kan kopiere SQL-en direkte). har du ikke adgang til noget lignende i din SQL-frontend ?

Rent umiddelbart så synes der at mangle noget - men hæng mig ikke op på det:
Jeg ville have forventet at bookingCalendar.staffId også skulle optræde på scenen et eller andet sted:)  noget med  bookingCalendar.staffId = staff.staffId - men det er måske fordi du har en cross join - og så får du formentligt for mange data.  Du kunne  bygge på det et skridt ad gangen : først lave en select som i stedet for staffName blot viser staffId korrekt (altså joined med bookingCalendar) - og derpå tilsætte staffname (og dermed også tabellen staff), når det forudgående funker.
Avatar billede torpmikkelsen Juniormester
04. maj 2007 - 13:54 #17
Jo, der er også en query-builder i Visual Web Developer 2005, men jeg kan squ ikke rigtigt lige regne ud i hvilken rækkefølge det hele skal komme så der bliver rigtigt.

Jeg må lige prøve at rode lidt videre med det...
Avatar billede dr_chaos Nybegynder
04. maj 2007 - 16:55 #18
prøv med:
SELECT  staff.staffName
FROM    staff
INNER JOIN staffFunction ON staff.staffId = staffFunction.staffId
INNER JOIN bookingCalendar ON staff.staffId = bookingCalendar.staffId AND bookingCalendar.Date<> @selectedDate
WHERE  (staffFunction.functionId = @selectedFunction) 

Men dit design virker en smule underligt. Da det umiddelbart ser ud som om det kun tillader en medarbejder at have en booket dato.
Avatar billede torpmikkelsen Juniormester
04. maj 2007 - 22:52 #19
Jeg har lige prøvet at kopi-paste den du har skrevet dér, den virker ikke helt som jeg havde håbet.

Men hvis du siger at den kun tillader en booking pr. medarbejder så duer det heller ikke. Hvordan bør min database struktur så være?
Avatar billede dr_chaos Nybegynder
04. maj 2007 - 22:59 #20
Er det kun muligt at foretage en booking per dag ?
Avatar billede torpmikkelsen Juniormester
04. maj 2007 - 23:42 #21
Ja, det er heldags-bookinger.

Så det der skal være tricket er, at hvis de allerede er booket på den dag, man har valgt i kalender-modulet, så må de ikke stå på listen over medarbejdere.
Avatar billede torpmikkelsen Juniormester
06. maj 2007 - 10:31 #22
Jeg kan simpelthen ikke regne den ud. Men jeg synes i har hjulpet mig nok nu, så smid et svar så får i point. Og så opretter jeg en ny tråd med mit NYE problem, det er vel OK? Eller er det mog exp regler.

Er det OK i bare deler point?
Avatar billede torpmikkelsen Juniormester
06. maj 2007 - 10:44 #23
Avatar billede dr_chaos Nybegynder
06. maj 2007 - 12:03 #24
Det er fint med mig :)
Svar :)
Avatar billede neoman Novice
06. maj 2007 - 12:41 #25
svar2
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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