Database structuur opzetten
Hej,
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...
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...
Gesponsorde koppelingen:
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.
kan dat niet gewoon in een MySQL database??
id|dienstnr|ma|di|wo|do|vr|za|zo
1 |144|----|1 |1 |1 |1 |1 |0 |0
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
Hoezo binair? Is dat niet wat te omslachtig? Of kan ik beter een record met dienstnummer en dag doen?
Feit is dat ik veel records heb, maar MySQL slikt het wel... :-)
Feit is dat ik veel records heb, maar MySQL slikt het wel... :-)
Gewijzigd op 09/09/2010 22:34:15 door - Aar -
maar MySQL kan veel hebben of je moet koppeltabbelen per dag maken ofzo.
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.
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
ga jij maar tabellen op aantallen maken. Dat is dus geen normalisatie en verre van goed.
Ik ga gewoon 1 tabel maken, waarin ik materieelnummer in plaats, en per record dat dag dat hij rijdt en welk materieel erbij hoort.
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
Binair is juist niet omslachtig. Het maakt het misschien iets langzamer (wat ik alsnog betwijfel, want binaire operaties zijn meestal het snelst van alles), maar daarvoor krijg je wel een makkelijk onderhoudbare database, een veld waarin alle dagen in een keer staan, en geen problemen met normalisatie (voor zover ik weet).
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:
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:
Edit 2:
Een ander voordeel is dat je ook kan selecteren op dagen waarop niet gereden mag worden...
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
Binair is leuk. Maar om daar op te filteren/sorteren is niet handig. Je pint je tabel dan aan je php code.
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.
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


