LeKuchen: Normaliesierung

Beitrag lesen

Hallo Hagen,

Nur ist das "Ausrechenprogramm" was die mitgeschickt habe besch... . Also sag ich "mutti ich bau dir n neues". Und da steh ich nun.

Ich habe hier immer Freitags oder in der Mittagspause mit einem Kollegen in einem kleinen Wettbewerb ein WM-Tippspiel zusammengebastetlt: Er mit MySQL und PHP und meine Wenigkeit mit Access und ASP.NET.

Hier meine Lösung für die Datenbank:

Tab1: [teams]
  teamabbreviation (PK)
  teamname
  [group]
  [rank]
  [lot]

Tab2: [games]
  gameid (PK)
  teamhome
  teamaway
  scorehome
  scoreaway
  addinfo
  penaltyhome
  penaltyaway
  venue
  gamedate
  gameplayed

Tab3: [bets]
  userid (PK)
  gameid (PK)
  bethome
  betaway
  points
  [timestamp]

Aus den Tabellen läßt sich über Views und parametriesierbare Abfragen alles wunderschön herleiten. Einfachste Übung ist eine Punkterangliste:

SELECT users.userid, SUM(bets.points) AS points
FROM users LEFT JOIN tips ON users.userid=bets.userid GROUP BY users.userid ORDER BY SUM(bets.points) DESC

Für die Ausgabe der Gruppentabellen muss man etwas überlegen. Habe mehrere Views angelegt, um die siegreiche und unterlegene Mannschaft rauszubekommen, hier ein Bspl für die "hometeamwins":

SELECT gameid, teamhome, teamaway, scorehome, scoreaway, gameplayed
FROM games
WHERE (scorehome>scoreaway AND games.gameplayed=True)

Die Heim- und Auswärtssiege habe ich dann zu "wins" geuniont:

SELECT gameid, teamaway as winner, teamhome as looser, scoreaway as winnergoals, scorehome as loosergoals FROM awayteamwins WHERE gameid<49 UNION select
gameid, teamhome as winner, teamaway as looser, scorehome as winnergoals, scoreaway as loosergoals FROM hometeamwins WHERE gameid<49

Dann wieder eine Union wins, draws und losses zu "groupphasegames":
SELECT  * FROM wins UNION SELECT * FROM losses UNION SELECT * FROM draws

Die daraus entstehende view kann man dann mit der TeamTab joinen zu "view_tablegoals":
SELECT teams.teamabbreviation, Count(groupphasegames.looser) AS numbergamesplayed, Sum(groupphasegames.winnergoals) AS goalsshot, Sum(groupphasegames.loosergoals) AS goalsconceded, ([goalsshot])-([goalsconceded]) AS goaldifference
FROM teams LEFT JOIN groupphasegames ON teams.teamabbreviation=groupphasegames.winner
GROUP BY teams.teamabbreviation

Dann benötigt man noch die Anzahl der Siege, Niederlagen und Unentschieden pro Team, zB:
SELECT teams.teamabbreviation, Count(wins.winner) AS numberwins
FROM teams LEFT JOIN groupphasegames ON teams.teamabbreviation=wins.winner GROUP BY teams.teamabbreviation

Daraus kann man sich wiederum die Punkte errechnen als "view_tablepoints":
SELECT teams.group, teams.teamname, teams.teamabbreviation, numberwins.numberwins, numberdraws.numberdraws, numberlosses.numberlosses, ((numberwins.numberwins*3)+(numberdraws.numberdraws*1)) AS points
FROM ((numberlosses INNER JOIN teams ON numberlosses.teamabbreviation = teams.teamabbreviation) INNER JOIN numberwins ON teams.teamabbreviation = numberwins.teamabbreviation) INNER JOIN numberdraws ON teams.teamabbreviation = numberdraws.teamabbreviation
ORDER BY ((numberwins.numberwins*3)+(numberdraws.numberdraws*1)) DESC

Und zum Schluss dann noch der Join zwischen den Views view_tablegoals und view_tablepoints....

Mit ein bisschen Nachdenken eigentlich ganz logisch...;o)

Gruß
LeKuchen