Database structuur opzetten

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

- Ariën -
Beheerder

- Ariën -

09/09/2010 22:22:29
Quote Anchor link
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...
 
PHP hulp

PHP hulp

03/12/2021 08:08:21
 
SilverWolf NL

SilverWolf NL

09/09/2010 22:26:27
Quote Anchor link
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.
 
Bas Php

Bas Php

09/09/2010 22:28:14
Quote Anchor link
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.
Gewijzigd op 09/09/2010 22:29:33 door Bas Php
 
- Ariën -
Beheerder

- Ariën -

09/09/2010 22:29:15
Quote Anchor link
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... :-)
Gewijzigd op 09/09/2010 22:34:15 door - Ariën -
 
Bas Php

Bas Php

09/09/2010 22:30:30
Quote Anchor link
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.
Gewijzigd op 09/09/2010 22:32:52 door Bas Php
 
- Ariën -
Beheerder

- Ariën -

09/09/2010 22:35:24
Quote Anchor link
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.
 
Bas Php

Bas Php

09/09/2010 22:45:03
Quote Anchor link
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
 
- Ariën -
Beheerder

- Ariën -

09/09/2010 23:09:55
Quote Anchor link
6645 om precies te zijn.
Je zit er behoorlijk naast ;-)
 
SilverWolf NL

SilverWolf NL

10/09/2010 10:26:11
Quote Anchor link
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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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.
}
?>


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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?PHP
  $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
 
TJVB tvb

TJVB tvb

10/09/2010 10:45:07
Quote Anchor link
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.
Quote:
edit!=quote
Gewijzigd op 10/09/2010 10:51:30 door TJVB tvb
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.