Forum › PHP / SQL › Topic

Een nieuwe topic in het forum PHP / SQL plaatsen Reageren op dit topic Forum:

[SQL] Rooster

Hey allemaal,

Ik zit al een aantal dagen flink vast met een volgens mij redelijk makkelijk op te lossen probleem. Echter kijk ik er al zo lang naar dat ik de oplossing niet meer zie.

Mijn probleem is als volgt;

Ik maak een leerlingadministratie systeem waarbij de leerling een rooster heeft. Aan dit rooster zitten vakken, docenten en lokalen gekoppeld. Als ik echter een vak aan een dag wil koppelen en deze weer aan de tabel rooster dan kan ik er maar 1 toevoegen en heb ik bij wijze van spreke alleen: Maandag met het daarbij horende vakID. Meedere vakken kan ik niet koppelen.

Mijn database ziet er momenteel zo uit:

De tabel week is weer een nieuw probeerseltje maar wederom lukt het niet



Graag hulp! Indien het niet duidelijk is zal ik proberen het duidelijk te maken met meer screens.

Ik denk dat de kenner wel ziet wat er fout gaat in mn erd.

THX
Stuur een prive bericht
Je hebt een soort tabel nodig als 'leerling_rooster', maar dan voor 'rooster' en 'vak'. In de zin van:

rooster_vak
-----------
rooster_id -> rooster.ID
vak_id -> vak.ID
dag -> (maandag, dinsdag, ..)

Ik denk alleen dat je nog het uur waarop het vak gegeven wordt, en hoelang het duurt, mist.
Stuur een prive bericht
Ik snap niet zo goed wat het nut is van de rooster tabel én de week tabel. Volgens mij kan dit gewoon in één?
En waarom koppel je een vak aan een dag? Je koppelt deze toch aan een lesuur naar mijn idee? Wil je hetzelfde vak nogmaals, maak je gewoon een nieuw record met een andere docent, lokaal en klas aan een ander of zelfs hetzelfde lesuur.
Je zou zelfs nog wel de vakken vast aan een docent kunnen koppelen, maar dit kan soms voor problemen zorgen.

Quote:
Thomas schreef:
Je hebt een soort tabel nodig als 'leerling_rooster', maar dan voor 'rooster' en 'vak'. In de zin van:

rooster_vak
-----------
rooster_id -> rooster.ID
vak_id -> vak.ID
dag -> (maandag, dinsdag, ..)

Ik denk alleen dat je nog het uur waarop het vak gegeven wordt, en hoelang het duurt, mist.
Hiervoor kan je beter een zogenoemde 'cluster-klas' maken en hier leerlingen aan toevoegen.
Stuur een prive bericht
hahahah bedankt! Volgens mij is het nu gefixed! Gewoon een koppeltabel eigenlijk met daarin nog de dag en het lesuur! Denk dat ik nog een tabel koppel aan de dag zodat dit ook een vaste selectie is en geen vrije invoer . Bedankt! Echt heel erg bedankt


Nog even ter verduidelijking, dit was je bedoelde denk ik?



De weekID is volgens mij nu overbodig

Quote:
Tim_ schreef:
Ik snap niet zo goed wat het nut is van de rooster tabel én de week tabel. Volgens mij kan dit gewoon in één?
En waarom koppel je een vak aan een dag? Je koppelt deze toch aan een lesuur naar mijn idee? Wil je hetzelfde vak nogmaals, maak je gewoon een nieuw record met een andere docent, lokaal en klas aan een ander of zelfs hetzelfde lesuur.
Je zou zelfs nog wel de vakken vast aan een docent kunnen koppelen, maar dit kan soms voor problemen zorgen.

[...]Hiervoor kan je beter een zogenoemde 'cluster-klas' maken en hier leerlingen aan toevoegen.

De rooster en week tabel was even een snel probeerseltje, de week tabel ga ik nu samenvoegen met rooster

Vak moet inderdaad ook aan een lesuur gekoppeld worden, het is meer zo dat ik bepaalde dingen zo vaak overnieuw heb gemaakt dat ik dingen over het hoofd ben gaan zien, zo ook lesuur! In mijn vorige versies stond deze er wel. IN ieder geval bedankt voor je feedback, ik ga eens even kijken naar de cluster klas
Stuur een prive bericht
Nog even een vraagje aan de hand van de oplossing die hierboven gegeven is



Ik heb geprobeerd om de tabel week overbodig te maken en deze in rooster te stoppen. Helaas kan ik dan de week_id niet koppelen aan rooster weekID.

Weet iemand hoe ik dit kan oplossen?

Daarnaast nog een ander vraagje. Ik wil aan de hand van mijn leerling.ID het daarbij horende rooster opvragen. Helaas lukt mij dit niet goed. Hoe is dit te doen? Ik heb het geprobeerd met Joins en ben tot deze query gekomen (heb het nu even met puur alleen JOINS gedaan en niet met left, right of inner)

Code tonen/verbergenCodeDeze code in een nieuw vensterDeze code in een tekstveldDeze code in een zip file downloaden
1
2
3
4
5
SELECT from week
JOIN week_vak on week_vak
.week_id week.ID
JOIN vak on vak
.ID week_vak.vak_ID
JOIN leraar on leraar
.ID vak.leraarID
JOIN lokaal on lokaal
.ID vak.lokaalID




Bedankt
Stuur een prive bericht
Ik heb bovenstaand bericht ge-edit om te zorgen dat het niet zo overstroomt van mijn posts in dit topic. Helaas update hij het topic niet in de actieve topic lijst, dus bij deze even een "kick"
Stuur een prive bericht
Ik denk dat je eerst even alles goed op papier (of in je hoofd) moet zetten voordat je het té snel in elkaar wilt proppen. Want volgens mij zijn er nu een heleboel tabellen nutteloos of eigenlijk niet nodig.

Ik zal eens even kijken of ik een goede opzet kan maken... Dan hoor je me later nog.
Quote:
b]Styxxy schreef:[/b]
[...]
Lesuur en weekdag lijken me al overbodig . Daarnaast is de koppeling om een rooster op te maken ook niet bijster goed of flexibel. (En ik zou op leerlingennummer een UNIQUE constraint zetten, mij lijkt dat het uniek is per leerling.)
Mja, vind het ID daar al overbodig, want dat mag gewoon het leerlingnummer zijn.
Stuur een prive bericht
Quote:
Tim_ schreef:
Want volgens mij zijn er nu een heleboel tabellen nutteloos of eigenlijk niet nodig.

Lesuur en weekdag lijken me al overbodig . Daarnaast is de koppeling om een rooster op te maken ook niet bijster goed of flexibel. (En ik zou op leerlingennummer een UNIQUE constraint zetten, mij lijkt dat het uniek is per leerling.)
Stuur een prive bericht
Heb hem momenteel zo, spreekt wel redelijk voor zichzelf lijkt mij.
Kan zijn dat ik hier en daar primaire sleutels ben vergeten of dat namen niet helemaal overeen komen:


Stuur een prive bericht
Quote:
Tim_ schreef:
Ik zal eens even kijken of ik een goede opzet kan maken... Dan hoor je me later nog.[...]Mja, vind het ID daar al overbodig, want dat mag gewoon het leerlingnummer zijn.

Het kan helaas niet het leerlingnummer zijn omdat deze pas later bekend worden (als de leerlingen al ingeschreven moeten zijn op de school en al ingevoerd moeten zijn in het systeem)

Quote:
Styxxy schreef:
[...]
Lesuur en weekdag lijken me al overbodig . Daarnaast is de koppeling om een rooster op te maken ook niet bijster goed of flexibel. (En ik zou op leerlingennummer een UNIQUE constraint zetten, mij lijkt dat het uniek is per leerling.)

Het rooster hoeft niet perse uniek te zijn per leerling. Leerlingen kunnen hezelfde profiel hebben en daarbij dezelfde vakken volgen.

@TIM

Bedankt! IK ga er even naar kijken! THANKS
Stuur een prive bericht
Quote:
Jimbo schreef:
[...]
Het rooster hoeft niet perse uniek te zijn per leerling. Leerlingen kunnen hezelfde profiel hebben en daarbij dezelfde vakken volgen.


Dan nog was het geen goede koppeling, of toch een vreemde koppeling. Hetgeen Tim heeft gemaakt, is veel logischer.
Stuur een prive bericht
Quote:
Jimbo schreef:
[...]
Het rooster hoeft niet perse uniek te zijn per leerling. Leerlingen kunnen hezelfde profiel hebben en daarbij dezelfde vakken volgen.

@TIM

Bedankt! IK ga er even naar kijken! THANKS
Dat snap ik, dat is ook logisch, dan krijg je dus een zogenoemde 'clusterklas'. Studenten uit hetzelfde leerjaar, maar uit verschillende klassen, welke hetzelfde keuze vak volgen en daar wèl één klas vormen.

Bijvoorbeeld, je hebt studenten uit het 5de leerjaar (klas 5.01, 5.02, 5.03) waaruit een aantal het vak geschiedenis hebben. Dan maak je een nieuwe klas, bv. 5.01ges, je zet cluster op 1, zodat je kan zien dat het om een clusterklas gaat. Vervolgens wijs je hier studenten aan toe.
Vandaar ook de stud-klas tabel, zodat studenten aan meerdere 'klassen' kunnen worden toegewezen.
Stuur een prive bericht
Quote:
Tim_ schreef:
[...]Dat snap ik, dat is ook logisch, dan krijg je dus een zogenoemde 'clusterklas'. Studenten uit hetzelfde leerjaar, maar uit verschillende klassen, welke hetzelfde keuze vak volgen en daar wèl één klas vormen.

Bijvoorbeeld, je hebt studenten uit het 5de leerjaar (klas 5.01, 5.02, 5.03) waaruit een aantal het vak geschiedenis hebben. Dan maak je een nieuwe klas, bv. 5.01ges, je zet cluster op 1, zodat je kan zien dat het om een clusterklas gaat. Vervolgens wijs je hier studenten aan toe.
Vandaar ook de stud-klas tabel, zodat studenten aan meerdere 'klassen' kunnen worden toegewezen.

Aaah op die manier!
Heb het zojuist getest maar krijg helaas de volgende melding:

Code tonen/verbergenCodeDeze code in een nieuw vensterDeze code in een tekstveldDeze code in een zip file downloaden
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SQL query:

-- ----------------------------------------------------- -- 
Table `las`.`lesuur` -- ------------------------------------------
----------- 
CREATE TABLE IF NOT EXISTS `las`.`lesuur` ( `IDINT NOT 
NULL AUTO_INCREMENT 
, `vakIDINT NOT NULL , `leraarIDINT NOT 
NULL 
, `lokaalIDINT NOT NULL , `klasIDINT NOT NULL , `dag
VARCHAR(45NULL , `lesuurTINYINT(1NULL , `startDATE NULL 
`
endDATE NULL INDEX `vakID` (`vakIDASC, `lokaalIDASC) , INDEX 
`leraarID` (`leraarIDASC) , INDEX `lokaalID` (`lokaalIDASC) , INDEX 
`klasID` (`klasIDASC) , PRIMARY KEY (`ID`) , CONSTRAINT `vakID
FOREIGN KEY (`vakID` , `lokaalID` ) REFERENCES `las`.`vak` (`ID` , `ID
ON DELETE NO ACTION ON UPDATE NO ACTIONCONSTRAINT `leraarID
FOREIGN KEY (`leraarID` ) REFERENCES `las`.`leraar` (`ID` ) ON DELETE 
NO ACTION ON UPDATE NO ACTION
CONSTRAINT `lokaalIDFOREIGN 
KEY 
(`lokaalID` ) REFEREN[...]

error #1005 - Can't create table 'las.lesuur' (errno: 121)




Weten jullie waar dit fout gaat? Ik heb er naar gekeken maar snap niet waar hij die constraint vandaan haalt? De tabel lesuur is gekoppeld aan lokaal, vak, leraar en klas
Stuur een prive bericht
En zelke error krijg je nu exact? Ik zie namelijk gewoon een gedeeltelijke query staan (die in dat formaat niet eens leesbaar is).
Stuur een prive bericht
Probleem is al opgelost, sorry! Niet alles kwam goed overeen.
Stuur een prive bericht
Sorry, het was ook niet heel handig van mij om er geen export neer te zetten. Mocht er nog iemand behoefte aan hebben:

Code tonen/verbergenCodeDeze code in een nieuw vensterDeze code in een tekstveldDeze code in een zip file downloaden
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
CREATE TABLE IF NOT EXISTS `docenten` (
  `
didint(11NOT NULL,
  `
naamvarchar(255NOT NULL,
  `
voornaamvarchar(255NOT NULL,
  `
afkortingvarchar(40NOT NULL,
  `
vidint(11NOT NULL COMMENT 'Standaard vak',
  
PRIMARY KEY (`did`)
ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS `klassen` (
  `
kidint(11NOT NULL,
  `
nummerfloat(3,2NOT NULL,
  `
suffixvarchar(255NOT NULL,
  `
niveautinyint(1NOT NULL,
  `
leerjaartinyint(1NOT NULL,
  `
clustertinyint(1NOT NULL,
  
PRIMARY KEY (`kid`)
ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS `lesuren` (
  `
idint(20NOT NULL,
  `
vidint(11NOT NULL COMMENT 'Vak ID',
  `
didint(11NOT NULL COMMENT 'Docent ID',
  `
lidint(11NOT NULL COMMENT 'Lokaal ID',
  `
kidint(20NOT NULL COMMENT 'Klas ID',
  `
dagtinyint(1NOT NULL,
  `
lesuurtinyint(2NOT NULL,
  `
startdate NOT NULL,
  `
enddate NOT NULL,
  
PRIMARY KEY (`id`)
ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS `lokalen` (
  `
lidint(11NOT NULL,
  `
nummerfloat(4,2NOT NULL,
  `
suffixvarchar(255NOT NULL,
  `
locatietinyint(1NOT NULL,
  
PRIMARY KEY (`lid`)
ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS `stud-klas` (
  `
idint(20NOT NULL,
  `
kidint(11NOT NULL,
  `
sidint(20NOT NULL,
  
PRIMARY KEY (`id`)
ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS `studenten` (
  `
sidint(20NOT NULL,
  `
naamvarchar(255NOT NULL,
  `
voornaamvarchar(255NOT NULL,
  `
gdatumdate NOT NULL,
  `
leerjaartinyint(1NOT NULL,
  `
niveautinyint(1NOT NULL,
  
UNIQUE KEY `sid` (`sid`)
ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS `vakken` (
  `
vidint(11NOT NULL,
  `
naamvarchar(255NOT NULL,
  `
afkortingvarchar(40NOT NULL,
  
PRIMARY KEY (`vid`)
ENGINE=InnoDB DEFAULT CHARSET=latin1;



Stuur een prive bericht
Thanks! Nog een kort vraagje, hoe zou ik hier mooi de aanwezigheid per leerling aan kunnen koppelen? Ik denk door een extra row toe te voegen aan de leerling (aanwezigheidID, aid) en lesuur(aid)?

En wat is precies het doel van een suffix? Dubbele waardes voorkomen?
Stuur een prive bericht
Een extra tabel maken met aanwezigheid, met een kolom die overeenkomt met het lesuur-id, een met het student-id en natuurlijk een kolom welke aangeeft of de student aan- of afwezig is. Bijvoorbeeld:
Code tonen/verbergenCodeDeze code in een nieuw vensterDeze code in een tekstveldDeze code in een zip file downloaden
1
2
3
4
5
6
CREATE TABLE IF NOT EXISTS `aanwezigheid` (
  `
aidint(11NOT NULL,
  `
lesuurint(20NOT NULL,
  `
sidint(20NOT NULL,
  `
aanwezigtinyint(1NOT NULL DEFAULT '1'
ENGINE=InnoDB DEFAULT CHARSET=latin1;




En die suffix (achtervoegsel) dient als bijvoorbeeld volledige klasnaam of lokaal. Het 'nummer' is nu een float, dit is makkelijker sorteren op verdieping of klasjaar. Maar zo kan je bijvoorbeeld wel een lokaal 2.01a en 2.01b hebben. Hetzelfde met klasnamen, handig als je bijvoorbeeld het niveau in de klasnaam wilt hebben of voor de clusterklas. Voorbeeld: 3.04vkt (vmbo k/t), 3.04hv (havo/vwo) - 2.02ceco (clusterklas economie), 2.02cmuz (clusterklas muziek).
Dit zijn slechts voorbeelden hoor, je kan het invullen en namen geven hoe je zelf wilt. Hoop dan mijn uitleg een beetje duidelijk is.
Stuur een prive bericht