Goedemorgen,

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

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)
Als je zo te werk gaat volgens mij wordt het dan een ramp. In elke tabel maak je een koppeling naar een andere tabel. Ik zou eerder een aparte losse koppel tabel maken.

Waar zijn deze ID's voor:

- uitteam_id (FK)
- thuisteam_id (FK)
Zou je uit kunnen leggen waarom een koppel tabel hier beter is? Het zijn toch 1 op 1 relaties?
Uitteam en thuisteam ID zijn dat je weet wie de wedstrijd speelt ;)
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.

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.

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..
Bij doelpunten zou ik nog een team_id opnemen, waarbij dat aangeeft voor welk team het doelpunt is gescoord. Dit kan je niet op alleen speler id bepalen, want iemand kan ook in zijn eigen doel scoren ;-)
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?
@Erwin slimme opmerking, daar zat ik nog over te denken hoe ik dat moest verwerken!

@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.
Je krijgt lekkere joins inderdaad, maar voorlopig zie ik niets onmogelijks.
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.
Heel simpel door 2 x dezelfde tabel te joinen:

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

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
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!

Reageren