Database structuur opzetten
Ik ben zelf van plan om deze data: http://waarisdetrein.nl/treinfan/drgl/2010-5/mat.txt in de database te zetten
Voor de mensen die het niet snappen:
MDWDVZZ staat voor de dagen waarop de trein rijdt. Een - betekent dat deze niet rijdt op die dag. Dus MDWDV-- staat voor de doordeweekse dagen.
144 is de dienstnummer.
1700/ICR/IRM etc... Is het materieelsoort wat gepland is.
Hoe kan ik de databasestructuur in elkaar draaien zodat ik weet welk materieel op welke dag rijdt? De velden ma/di/wo/do/vr/za/zo aanmaken, en met enum een 1 of 0 zetteb? Of...
Zou je niet een binair systeem kunnen maken? In mysql kan je binaire vergelijkingen doen, dus als je dan een bitwise systeem opzet voor elke dag, zou je dat kunnen vergelijken. Dit is ook gelijk handig met meerdere dagen selecteren etc.
id|dienstnr|ma|di|wo|do|vr|za|zo
1 |144|----|1 |1 |1 |1 |1 |0 |0
etc.
Gewijzigd op 09/09/2010 22:29:33 door Bas Php
Feit is dat ik veel records heb, maar MySQL slikt het wel... :-)
Gewijzigd op 09/09/2010 22:34:15 door - Ariën -
Toevoeging op 09/09/2010 22:32:04:
voorbeeld:
tabel: dienstnr
id| dienstnr
1 | 144
tabel: maandag
id| dienstnr| ma
1 | 144-----| 1
etc.
edit ik dacht dat je binair tegen mij had.
Gewijzigd op 09/09/2010 22:32:52 door Bas Php
Ik ga gewoon 1 tabel maken, waarin ik materieelnummer in plaats, en per record dat dag dat hij rijdt en welk materieel erbij hoort.
ja ok dat is wel heel veel ik had nog niet gekeken naar het bestandje maar dat zijn meer dan 100,000 records volgens mij :O
Je zit er behoorlijk naast ;-)
Wat je doet is je maakt een veld dagen met het type int. Elke bit staat voor een dag; dus binair:
0000000 is nooit (zal niet voorkomen)
0000001 is maandag
0000010 is dinsdag
0000100 is woensdag enz.
dat is decimaal:
1 maandag
2 dinsdag
4 woensdag
stel nou dat je alle treinen wil hebben die minstens op maandag en woensdag rijden, dan doe je zo'n query:
SELECT dienstnummer,materiaalsoort FROM tabel WHERE (dagen & 5) > 0
Als je andere dagen wil hebben hoef je alleen het aantal achter & aan te passen. Dit zou je met een formulier met checkboxes kunnen doen, en dan elke dag definieren met een constant:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?PHP
define("DAG_MAANDAG",1);
define("DAG_DINSDAG",2);
define("DAG_WOENSDAG",4);
define("DAG_DONDERDAG",8);
define("DAG_VRIJDAG",16);
define("DAG_ZATERDAG",32);
define("DAG_ZONDAG",64);
//form controlleren etc.
$dag_binair=0;
foreach($_POST["dagen"] as $dag){
$dag_binar+=constant($dag);
}
if($dag_binair==0){
//geen dagen geselecteerd
}else{
$query="SELECT dienstnummer,materiaalsoort FROM tabel WHERE (dagen & ".$dag_binair.") > 0";
//query uitvoeren/controlleren etc.
}
?>
define("DAG_MAANDAG",1);
define("DAG_DINSDAG",2);
define("DAG_WOENSDAG",4);
define("DAG_DONDERDAG",8);
define("DAG_VRIJDAG",16);
define("DAG_ZATERDAG",32);
define("DAG_ZONDAG",64);
//form controlleren etc.
$dag_binair=0;
foreach($_POST["dagen"] as $dag){
$dag_binar+=constant($dag);
}
if($dag_binair==0){
//geen dagen geselecteerd
}else{
$query="SELECT dienstnummer,materiaalsoort FROM tabel WHERE (dagen & ".$dag_binair.") > 0";
//query uitvoeren/controlleren etc.
}
?>
Edit:
Je krijgt dan alle treinen die minstens op maandag en woensdag rijden. Andere dagen kunnen dan ook nog. Wil je de treinen hebben die alleen maandag en woensdag rijden, kan je dat zo doen:
Code (php)
1
2
3
2
3
<?PHP
$query="SELECT dienstnummer,materiaalsoort FROM tabel WHERE dagen = ".$dag_binair;
?>
$query="SELECT dienstnummer,materiaalsoort FROM tabel WHERE dagen = ".$dag_binair;
?>
Edit 2:
Een ander voordeel is dat je ook kan selecteren op dagen waarop niet gereden mag worden...
Gewijzigd op 10/09/2010 10:37:15 door SilverWolf NL
Je kunt gewoon tinyint(1) gebruiken als een form van boolean (of een database pakken die wel daadwerkelijk booleans heeft)
Je hebt een aantal mogelijkheden.
diensten
id->int
dients->int //als je dienst nergens anders gebruikt kan dat hier, anders een id wat verwijst naar je tabel met diensten
ma->tinyint(1)
di->tinyint(1)
wo->tinyint(1)
do->tinyint(1)
vr->tinyint(1)
za->tinyint(1)
zo->tinyint(1)
materiaal_id->int //id van het materiaal
materiaal
id->int
materiaal_aanduiding->varchar
Koppeltabellen per dag lijkt me te ver doorgeschoten met normaliseren.
Eventueel kun je het materiaal ook bij in de diensten tabel zetten maar dit lijkt me niet heel handig.
Quote:
edit!=quote
Gewijzigd op 10/09/2010 10:51:30 door TJVB tvb