Databaseontwerp WK poule
Het EK is nog niet voorbij, en ik hou me alweer bezig met het WK (je kan nooit te vroeg beginnen). Ik was bezig om een WK poule te maken, en daarvoor wou ik eerst een goed speelschema opzetten. Hiervoor heb ik een databaseontwerp gemaakt, en vraag me af of dit een goede manier is.
PK = primary key
FK = foreign key
Code (php)
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
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
WK DATABASE
- Team
- team_id (PK)
- naam_full
- naam_short
- website
- Spelers
- speler_id (PK)
- voornaam
- achternaam
- geboortedatum
- team_id (FK)
- Doelpunten
- goal_id (PK)
- wedstrijd_id (FK)
- speler_id (FK)
- team_id (FK)
- minuut
- Wedstrijden
- wedstrijd_id (PK)
- thuis_team_id (FK)
- uit_team_id (FK)
- datetime
- stadion_id (FK)
- type_id (FK)
- scheidsrechter_id (FK)
- westrijd_type (kwalificatie, groepswedstrijd, kwartfinale enz.)
- naam
- type_id (PK)
- Stadion
- stadion_id (PK)
- naam
- plaats
- capaciteit
- Poule
- poule_id (PK)
- naam
- Scheidsrechter
- scheidsrechter_id (PK)
- naam
- indeling
- indeling_id (PK)
- poule_id (FK)
- team_id (FK)
- indeling_type_id (FK)
- continent_id (FK)
- indeling_type
- id (PK)
- name (UNIQUE) (kwalificatie of eindronde)
- continenten
- continent_id (PK)
- name (UNIQUE)
- Team
- team_id (PK)
- naam_full
- naam_short
- website
- Spelers
- speler_id (PK)
- voornaam
- achternaam
- geboortedatum
- team_id (FK)
- Doelpunten
- goal_id (PK)
- wedstrijd_id (FK)
- speler_id (FK)
- team_id (FK)
- minuut
- Wedstrijden
- wedstrijd_id (PK)
- thuis_team_id (FK)
- uit_team_id (FK)
- datetime
- stadion_id (FK)
- type_id (FK)
- scheidsrechter_id (FK)
- westrijd_type (kwalificatie, groepswedstrijd, kwartfinale enz.)
- naam
- type_id (PK)
- Stadion
- stadion_id (PK)
- naam
- plaats
- capaciteit
- Poule
- poule_id (PK)
- naam
- Scheidsrechter
- scheidsrechter_id (PK)
- naam
- indeling
- indeling_id (PK)
- poule_id (FK)
- team_id (FK)
- indeling_type_id (FK)
- continent_id (FK)
- indeling_type
- id (PK)
- name (UNIQUE) (kwalificatie of eindronde)
- continenten
- continent_id (PK)
- name (UNIQUE)
Gewijzigd op 14/06/2012 08:36:34 door Gerhard l
Waar zijn deze ID's voor:
- uitteam_id (FK)
- thuisteam_id (FK)
Gewijzigd op 12/06/2012 11:36:58 door Bas IJzelendoorn
Uitteam en thuisteam ID zijn dat je weet wie de wedstrijd speelt ;)
maar die id van team moet dan ook team_id worden.
hetzelfde bij doelpunten vernoem dit naar doelpunten_id anders ga je in de war komen wanneer je joins gaat maken.
voor de rest ziet het er wel oke uit. en inderdaad dat uitteam_id en thuisteam_id klopt volgens mij ook niet helemaal.
Reshad F op 12/06/2012 11:59:33:
dit klopt niet volgensmij, want id van speler kan nooit hetzelfde zijn als id van team. dan heb je eerder speler_id en team_id en in de speler tabel heb je dan een team_id eventueel nog een club_id (als je ook clubs wilt weergeven waar ze spelen o.i.d)
maar die id van team moet dan ook team_id worden.
hetzelfde bij doelpunten vernoem dit naar doelpunten_id anders ga je in de war komen wanneer je joins gaat maken.
maar die id van team moet dan ook team_id worden.
hetzelfde bij doelpunten vernoem dit naar doelpunten_id anders ga je in de war komen wanneer je joins gaat maken.
Vanzelfsprekend zijn deze ID's niet hetzelfde, het gaat ten slotte om de structuur, en bij verwerking krijg je toch iets van: WHERE team.id = player.team_id, maar voor de duidelijkheid zou je de namen van de ID's kunnen veranderen..
Reshad F op 12/06/2012 11:59:33:
voor de rest ziet het er wel oke uit. en inderdaad dat uitteam_id en thuisteam_id klopt volgens mij ook niet helemaal.
Wat is er mis mee? Elke wedstrijd heeft 1 uitteam en 1 thuisteam, die verwijs je door naar team.id..
Verder zou ik bij doelpunten ook de minuut waarin gescoord is opnemen, zodat je nog de volgorde van de doelpunten kan weergeven.
maar hoe ga je dat in je query uitpakken dan met de uitteam en thuisteam?
@Reshad F Nog geen idee, ik wil eerst de structuur goed hebben, voordat ik ga beginnen. Maar dit lijkt mij de beste oplossing of niet.
In elk geval zou ik vooraf al een paar views definieren op je database, zodat je niet in elke query die je draait tig joins hoeft op te nemen. Maakt voor snelheid niets uit, maar wel voor leesbaarheid.
Code (php)
1
2
3
4
2
3
4
SELECT m.matchdate, m.matchtime, ht.teamname hometeam, at.teamname awayteam
FROM matchschedule m
JOIN teams ht ON m.hometeam_id = ht.team_id
JOIN teams at ON m.awayteam_id = at.team_id
FROM matchschedule m
JOIN teams ht ON m.hometeam_id = ht.team_id
JOIN teams at ON m.awayteam_id = at.team_id
Zoals je ziet hebben we hier ook identieke veldnamen, door te aliasen kan je ze van elkaar onderscheiden
@gerhard, ziet er goed uit, wel even de puntjes van Erwin meenemen
Gewijzigd op 12/06/2012 12:30:11 door Ger van Steenderen
Heren, bedankt voor jullie reacties, heb de punten van Erwin er even bij in gezet, en nog een scheids toegevoegd. Ger, dankjewel voor deze oplossing en Erwin ik ga even kijken wat voor views ik zou kunnen maken!
ik zou alleen het poule_id bij team weghalen en in een koppeltabel zetten:
Pouleindeling
- pouleindeling_id (PK)
- poule_id (FK)
- team_id (FK)
Dan kun teams indelen in de kwalificatiepoules en de poules op de eindronde. Nu kunnen ze maar in één poule zitten.
@Jeroen, dat is inderdaad handig, alleen dan moet er denk ik in het tabel pouleindeling wel een pouletype bijkomen om de kwalificatie en de eindronde gescheiden te houden of niet?
@gerhard, dan zou je inderdaad het beste ook nog wedstrijdtype_id (FK) toe kunnen voegen.
Gewijzigd op 12/06/2012 16:31:21 door Ger van Steenderen
Maar even serieus, als ik je een advies mag geven, zou ik in de database een onderscheid maken in de tabellen voor de eindronde en de diverse kwalificatie rondes, dat bespaart je straks een hoop gecompliceerde queries en het staat toch al los van elkaar
Gerhard l op 13/06/2012 16:30:54:
Klopt heb het gezien, heb daar nog een tabel voor toegevoegd, maar hou me eerst bezig met Europa. linkje
Ziet er al goed uit. Hoe is nu je tabel-ontwerp geworden. Ben wel benieuwd en wil hem dan ook eens naast mijn database-ontwerp leggen dat ik gebruik voor mijn eigen website van mijn voetbal-elftal.
@SanThe Zal vast komen doordat er nog geen charset is meegegeven, maar bedankt voor het melden
@Ger daar zit ik nog even over te twijfelen, op zich kan je met een indeling_id zeggen of iemand op een eindronde of kwalificatie zit. Maar misschien is een apart tabel wel overzichtelijker..
Voor uitslagen van wedstrijden heb ik ook een losse tabel gemaakt. In het geval van mijn eigen team weet ik namelijk niet wie en in welke volgorde er doelpunten hebben gemaakt bij de overige wedstrijden waardoor ik op basis van de doelpunten geen uitslag kan bepalen.
Ik zal eens kijken of ik een structuur kan maken om die hier bij te zetten (als je wilt).