Hilfe bei Datenbankentwurf

illuminatus26

Erfahrenes Mitglied
Hallo zusammen.
Ich würde gerne einen Bundesligaspielplan erstellen.
Jetzt habe ich schonmal 2 kleine Entwürfe gemacht.
Problem an der Geschichte ist, dass ich bei dem einen Entwurf einfach zu viele Tabellen habe und beim anderen meine Select-Abfragen zu umfangreich werden. Das führt natürlich dazu das man den Überblick verliert so bald man sich mal 2 Tage nicht damit beschäftigt hat. :)
 
illuminatus26 hat gesagt.:
Hallo zusammen.
Ich würde gerne einen Bundesligaspielplan erstellen.
Jetzt habe ich schonmal 2 kleine Entwürfe gemacht.
Problem an der Geschichte ist, dass ich bei dem einen Entwurf einfach zu viele Tabellen habe und beim anderen meine Select-Abfragen zu umfangreich werden. Das führt natürlich dazu das man den Überblick verliert so bald man sich mal 2 Tage nicht damit beschäftigt hat. :)
Wer sagt, dass es zu viele Tabellen sind?
Wie viele Tabellen sind es denn?
Welche Tabellen hast Du?
Wie sollen wir Dir an Deinem Entwurf helfen, wenn Du Deinen Entwurf nicht zeigst?

Ich komme auf mindestens 7 Tabellen.
Verein (id, name, etc.)
Spieler (id, name, etc.)
Saison (id, anfang, ende, etc.)
SpielerSpieltInVerein (VereinID, SpielerID, [SaisonID oder AnfangsDatum, EndDatum])
Spieltag (id, Datum, zur Vereinfachung: SaisonID)
Spiel (SpielID, HeimID, GastID, SpieltagID)
Tor (SpielID, Spielminute, TorFürVereinID, TorschützeID)

Dass die Struktur eine Auswertung nicht gerade erleichtert, sollte offensichtlich sein. Generell kann man aber nicht sagen, dass viele oder wenig Tabellen besser sind.

Daher solltest Du Deine Ideen zeigen und schreiben, was Dir nicht gefällt, damit man eine Aussage treffen kann.

Gruß hpvw
 
Also ich habe 2 Entwürfe. Beim einen habe ich es so gemacht, dass ich eine Tabelle Spieltag mit 2 Spalten habe. Einmal ID ( für den Spieltag 1 - 34 ) und dann noch Paarungen. Da wollte ich dann aus anderen Tabellen, die ich paarungen1(Spieltag)_1(Spielnummer) genannt habe dann die erste Paarung des 1. Spieltages abrufen.
So benötige ich aber je Spieltag 9 Tabellen und das mal 34 ist doch ein wenig viel an Tabellen. Oder?
Der zweite Entwurf sieht so aus, dass ich eine Tabelle gemacht habe, die ich Spieltag nenne. Diese Tabelle enthält die Spalten ID, spiel1h, spiel2a, ..... spiel9h, spiel9a.
Jetzt kann ich in jedem Datensatz die Mannschaft eintragen und hätte den Spieltag.
Da ich jedoch nicht so viel tippen möchte habe ich noch eine weitere Tabelle mit dem Namen Mannschaften. Diese kennst du ja bereits. :)
Jede Mannschaft hat eine Nummer. Somit trage ich nur die Nummern ein und lasse über den Join-Befehl die Namen aus der Tabelle Mannschaften "kommen".
Nur dann habe ich alleine für die Heimmannschaften eine Abfrage die ellenlang ist.

Hier eine kleine Kostprobe:

Code:
$sql = 'SELECT tipspiel__spieltag.spiel1h,'
        . ' tipspiel__spieltag.spiel2h,'
        . ' tipspiel__spieltag.spiel3h,'
        . ' tipspiel__spieltag.spiel4h,'
        . ' tipspiel__spieltag.spiel5h,'
        . ' tipspiel__spieltag.spiel6h,'
        . ' tipspiel__spieltag.spiel7h,'
        . ' tipspiel__spieltag.spiel8h,'
        . ' tipspiel__spieltag.spiel9h,'
        . ' spiel1h.verein AS heimname1,'
        . ' spiel2h.verein AS heimname2,'
        . ' spiel3h.verein AS heimname3,'
        . ' spiel4h.verein AS heimname4,'
        . ' spiel5h.verein AS heimname5,'
        . ' spiel6h.verein AS heimname6,'
        . ' spiel7h.verein AS heimname7,'
        . ' spiel8h.verein AS heimname8,'
        . ' spiel9h.verein AS heimname9'
        . ' FROM tipspiel__spieltag'
        . ' JOIN tipspiel__mannschaften AS spiel1h ON ( tipspiel__spieltag.spiel1h = spiel1h.id )'
        . ' JOIN tipspiel__mannschaften AS spiel2h ON ( tipspiel__spieltag.spiel2h = spiel2h.id )'
        . ' JOIN tipspiel__mannschaften AS spiel3h ON ( tipspiel__spieltag.spiel3h = spiel3h.id )'
        . ' JOIN tipspiel__mannschaften AS spiel4h ON ( tipspiel__spieltag.spiel4h = spiel4h.id )'
        . ' JOIN tipspiel__mannschaften AS spiel5h ON ( tipspiel__spieltag.spiel5h = spiel5h.id )'
        . ' JOIN tipspiel__mannschaften AS spiel6h ON ( tipspiel__spieltag.spiel6h = spiel6h.id )'
        . ' JOIN tipspiel__mannschaften AS spiel7h ON ( tipspiel__spieltag.spiel7h = spiel7h.id )'
        . ' JOIN tipspiel__mannschaften AS spiel8h ON ( tipspiel__spieltag.spiel8h = spiel8h.id )'
        . ' JOIN tipspiel__mannschaften AS spiel9h ON ( tipspiel__spieltag.spiel9h = spiel9h.id ) LIMIT 0, 30 ';
 
In der Tat ist das etwas zuviel des Guten. Wie wäre es so:
Mannschaft
  • id
  • Name
Saison (Eine Saisontabelle würde ich auf jeden Fall einführen, da Du die Datenbank sicher nicht nur für eine Saison machst.)
  • id
  • etc.

Spieltag
  • id
  • SaisonID
  • Datum
  • LaufendeNummer
Spiel
  • id
  • SpieltagID
  • HeimID
  • GastID
  • LaufendeNummer
  • HeimTore
  • GastTore

Die laufende Nummer in der Spieltag-Tabelle ist übrigends nur für die Bequemlichkeit bei der Abfrage da. Sie ließe sich auch über die, durch das Datum, vorgegebene Ordnung ermitteln.

Um jetzt alle Spiele des ersten Spieltages der aktuellen Saison (im Beispiel hat die aktuelle Saison die id 2) zu ermitteln kann ein solches Query dienen:
Code:
SELECT
  Spieltag.Datum AS SpieltagDatum,
  Spiel.LaufendeNummer AS Spielnummer,
  Heim.Name AS HeimMannschaft,
  Gast.Name AS GastMannschaft,
  CONCAT(Spiel.HeimTore,':',Spiel.GastTore) AS Ergebnis
FROM Spiel
LEFT JOIN Mannschaft AS Heim
  ON Heim.id=Spiel.HeimID
LEFT JOIN Mannschaft AS Gast
  ON Gast.id=Spiel.GastID
JOIN Spieltag
  ON Spiel.SpieltagID=Spieltag.id
WHERE Spieltag.LaufendeNummer=1
  AND Spieltag.SaisonID=2
ORDER BY Spiel.LaufendeNummer ASC
Gruß hpvw
 
Hallo hpvw.
Besten Dank. Der Ansatz ist echt klasse. Hätte ich so wahrscheinlich erst in ein paar Jahren hinbekommen. Vorrausgesetzt ich bleibe so lange bei der Stange.
Nun aber noch was anderes.
Habe dem Ansatz noch 2 Tabellen hinzugefügt.

Tabelle Nutzer:

Spalten: ID, Vorname, Nachname, ... , email

und die Tabelle Tip

Sie ist identisch mit der Tabelle Spiel aus deinem Ansatz, enthält nur noch ein weiteres Feld mit NutzerID um die Tabelle Nutzer auch in den Ansatz mit einzubeziehen.
Jetzt habe ich mich jedoch gefragt ob ich mir die Tabelle nicht auch einfach sparen könnte, wenn ich das Feld NutzerID einfach in die Tabelle Spiel einbaue.
Müsste doch gehen, oder?
 
Ich würde die Tabellen trennen und in der Tabelle Tip die Felder NutzerID, SpielID und Tip anlegen. Dabei ist das Feld Tip entsprechend Deiner Vorstellungen zu gestalten. Da ich Dein Tip-System nicht kenne, kann ich dazu natürlich nichts konkretes sagen. Beim Toto ist es ja, soweit es meine begrenzten Fußballkenntnisse wiedergeben können, so, dass man eine Zahl von null bis zwei angibt. Das könnte man entweder als ENUM oder als INT modellieren. Eine weitere Möglichkeit wäre, dass die Nutzer auf das Ergebnis tippen. Dann wären zwei INT-Felder (HeimTore und GastTore) sinnvoll.

Davon bleibt das tatsächlich eingetretene Ergebnis in der Spiel-Tabelle unberührt.

Gruß hpvw
 
Also es soll ein Tipspiel werden, bei dem das genaue Ergebnis getippt werden soll.
Dann werde ich mal deinen Tip aufgreifen und eine gesonderte Tabelle machen.
Danke nochmal.
 
wenn wir gleich mal beim thema sind,

ich bin auch gerade dabei ein tipspiel zu erstellen.

auf die tabellen bin ich gekommen.
ich kann mittlerweile saisons, ligen, mannschaften, begegnungen und ergebnisse erstellen.

dazu meine struktur:

tip_saison
SID (primkey)
SBez (bezeichnung)

tip_liga
tLID (primkey)
tLBez (bezeichnung)

tip_mannschaft
MNr (primkey)
MNam (name der mannschaft)

tip_saison_liga_mannschaft
tSLMID (primkey)
tL_ID (fremdschlüssel tip_liga)
S_ID (fremdschlüssel tip_saison)
M_Nr (fremdschlüssel tip_mannschaft)

tip_begegnung
BNr (primkey)
BDat (datum)
BZeit (zeit)
BSpielt (spieltag-nr)
tSLM_ID1 (fremdschlüssel mannschaft1 - tip_liga_mannschaft)
tSLM_ID2 (fremdschlüssel mannschaft2 - tip_liga_mannschaft)
tSLMTore1 (tore mannschaft1)
tSLMTore2 (tore mannschaft2)

jetzt möchte ich aus den gegebenen dingen eine tabelle erstellen. dazu muss natürlich auch den begegnungen mit den jeweiligen mannschaften und ergebnissen die punkte errechnet werden, dann die tore (summe) und gegentore (summe), sowie anzahl siege, unentschieden, niederlagen...

das ganze muss dann noch natürlich sortiert ausgegeben werden!

kann mir jemand helfen? BITTE

könnt auch mal reinschnuppern ... http://www.volley-ergebnisse.de (sollte der link tot sein, später ist es http://www.olli-kraft.de)

DANKE ... Olli
 
Hallo Olli.

Ich wenn ich das richtig verstanden habe, möchtest du gerne Daten aus mehreren Tabellen auslesen und sie dann ausgeben.
Das geht mit Join.
Also ich probiere jetzt so seit mehr oder weniger 14 Tagen zu verstehen, wie es geht.
Wünsch dir viel Glück, dass es bei dir schneller geht.

www.aspheute.com/artikel/20001023.htm

Das ist das bisher verständlichste, was ich zu dem Thema gefunden habe.
Ansonsten gibt es noch ein Thema mit dem Namen Hilfe hier in diesem Forum. Vielleicht kannst du damit was anfangen.

www.tutorials.de/tutorials221582.html
 
@spitzel:
Gehe doch erstmal selbst analytisch heran.
Welche Felder soll die Ergebnistabelle haben?
Welche Bedeutung haben die Felder?
Wie setzt sich ihr Inhalt zusammen bzw. wie lässt er sich errechnen?
Willst Du das Ergebnis nach bestimmten Kriterien einschränken?
Wonach soll es sortiert werden?

Welche Tabellen brauchst Du dazu?
Wie sind die Tabellen verknüpft?
Über welche Felder und Bedingungen bilden sich Gruppen, nach denen etwas addiert oder gezählt werden muss?

Und die nächste Frage wäre dann:
Hat Deine Tastatur eine Shift-Taste?

Gruß hpvw
 

Neue Beiträge

Zurück