Door
gerhard l
op 12-06-2012 11:04
gewijzigd op 14-06-2012 08:36
5.577 views
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.
Dat mag, altijd interessant. Capaciteit is inderdaad een goede, maar nu niet van toepassing voor mij. En voor uitslagen heb je inderdaad wel alle doelpunten nodig.
Wel wat uitgebreider dan alleen de poule/wedstrijden. Is globaal de structuur die ik dus gebruik voor mijn eigen voetbal-website waarin ik al wel rekening hield met meerdere teams/competities/landen. Ook zitten er tabellen bij voor het bijhouden van een toto.
@Ger Dat heb ik gedaan omdat niet elke wedstrijd een uitslag heeft (nog niet gespeeld, afgelast, uitgesteld) en ik het dan handiger vind om het in een aparte tabel te hebben staan (ook al is het dan misschien niet nodig)
Maar dan kan je die uitslag nog verder normaliseren, waardoor het zelfs nog een beetje nut heeft. Nu heb je uitslag 45, 90, 115, 120, penalties staan. Als je nu een extra veld hebt (zeg minuten) dan heb je alleen nog uit en thuis nodig en kan je meerdere records per wedstrijd hebben. Nu heb je voor verreweg de meeste wedstrijden een aantal lege velden (115, 120, penalties komen niet vaak voor).
@Jeroen,
Dat vermoeden had ik al maar strikt genomen is 'handiger' geen goed argument voor een 1 op 1 relatie tussen 2 tabellen. Het punt is dat je een extra join in de query krijgt, en dat kost perfomance.
Voor de mensen die het nog niet gezien hebben, in de startpost vind je mijn databaseontwerp (nederlandse versie), nu heb ik een vraag over een query, wat is de beste manier om de gewonnen wedstrijden op te halen? Ik heb het volgende maar ik heb het idee dat het korter kan:
(
SELECT
COUNT(matches.match_id)
FROM
matches
WHERE(
matches.team_id_home = t.team_id
AND (
SELECT COUNT(goals.goal_id)
FROM
goals
WHERE
matches.match_id = goals.match_id
AND
goals.team_id = matches.team_id_home
) > (
SELECT
COUNT(goals.goal_id)
FROM
goals
WHERE
matches.match_id = goals.match_id
AND
goals.team_id = matches.team_id_away
)
) OR (
matches.team_id_away = t.team_id
AND (
SELECT
COUNT(goals.goal_id)
FROM
goals
WHERE
matches.match_id = goals.match_id
AND
goals.team_id = matches.team_id_home
) < (
SELECT
COUNT(goals.goal_id)
FROM
goals
WHERE
matches.match_id = goals.match_id
AND
goals.team_id = matches.team_id_away
)
)
) AS gewonnen_wedstrijden
Ik denk wel dat het wat korter kan, maar eerst even een vraag c.q opmerking:
Nu wil je het aantal gelijke spelen bepalen hoe maak jij het verschil tussen een 0-0 wedstrijd en een wedstrijd die nog niet is gespeeld?
Overigens zal bovenstaande query een foutmelding opleveren want je bent vergeten te joinen.
Ik heb het maken van de stand afgehandeld in PHP en niet SQL.
Ik haal eerst (per team van de poule) alle wedstrijden in de betreffende poule op. Vervolgens loop ik de wedstrijden door en verhoog per wedstrijd de tellers voor winst/verlies/gelijk (afhankelijk van resultaat) en ook het doelsaldo houdt ik dan bij.
Deze schrijf ik weg in een array die ik vervolgens sorteer op punten, wedstrijden, doelsaldo en naam.