bituniverse.com Foren-Übersicht bituniverse.com
Entwickler Forum
 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen   RegistrierenRegistrieren 
 ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Datenbank Architektur

 
Neues Thema eröffnen   Neue Antwort erstellen    bituniverse.com Foren-Übersicht -> Datenbanken
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Holger (HMR)



Anmeldedatum: 12.11.2007
Beiträge: 131

BeitragVerfasst am: Mi 28 Apr, 2010 16:26    Titel: Datenbank Architektur Antworten mit Zitat

Hallo zusammen,
ich mal wieder Smile.

ich bastel gerade für einen kleinen verein an einer Seite
und mache mir gerade Gedanken über den Aufbau der MYSQL-Tabellen.

Es gibt verschiedene Turnierarten, da können immer wieder mal
Arten hinzu kommen.
Und es gibt Turnier-Ranglisten.
In einer Rangliste werden immer die letzten 8 Spiele jedes Spielers gewertet.
Des Überblickes der Leistungen wegen bleiben aber die Historien erhalten.

Nun habe ich mir die folgende Struktur überlegt,
aber irgendwie bin ich damit nicht wirklich glücklich.

Also:
1. Eine Tabelle für die Turnierarten
turnier_art
art_nr | name

2. Eine Turniertabelle
tbl_turnier
turnier_index | turnier_art_nr | turnier_datum

3. Eine Tabelle in der die Mitspieler des jeweiligen Turniers erfasst werden.
Da der erste Ausscheider 0 Punkte bekommt, muß ich das separat erfassen. Weil unterschied, ob 0 Punkte oder nicht gespielt.
tbl_turnier_member
turnier_member_index | turnier_index_nr | turnier_particip_nr
(index) | (turnierindex von 2.) | (Mitgliedsnummer Teilnehmer)

4. Eine Tabelle in der die Punkte erfasst werden
tb_turnier_value
turnier_value_index | turnier_index_nr | turnier_member_nr| member_value
(tabellenindex) |(turnier_index von 2.) | (Mitgliedsnummer) | (Punkte des Spielers)

Ich brauche nachher folgende Ausgaben:

1. Rangliste aller Mitglieder mit Ihren jeweils letzten 8 Spielen einer Turnierart
2. Jahresübersicht aller Turniere einer Art und aller Spieler
in einer Tabelle, links Mitglieder, oben Datum, wer in einem Turnier nicht gespielt hat, bekommt nicht 0 sondern einen Strich.
3. Eine Spieler separierte Historie aller Turniere einer Art
mit Datum und Punkten.

Nun hab ich das Gefühl, ich bin auf dem falschen Dampfer
hat da jemand eine Meinung zu?
Das wäre nett...
Danke
Lieben Gruß
Holger

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Simon W.
Anti-verdenglischungs-Abgeordneter


Anmeldedatum: 05.11.2007
Beiträge: 283
Wohnort: Aachen

BeitragVerfasst am: Do 29 Apr, 2010 09:18    Titel: Antworten mit Zitat

Hi Holger,

abgesehen davon, dass du nun noch irgendwo spezifizieren musst, welche Mitgliedsnummern es alles gibt, scheint mir diese Struktur für deine genannten Punkte fast ausreichend.

Zu 1. fällt mir leider nur eine unschöne Lösung ein, da ein Subquery kein LIMIT enthalten kann. Möglich wäre es jedoch, die Spiele der einzelnen Spieler separat durchzunummerieren und dann bei dem join zwischen allen Spielern und deren zugeordneten Spielen nur diejenigen Spiele abzurufen, deren spiel_member.spielnr.>(spieler.letztesspiel-8) ist.
2. Simples join spieler->spiele
3. siehe 2, nur noch mit Spieler-Einschränkung

Gruß,
Simon

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Slava
Administrator


Anmeldedatum: 16.01.2007
Beiträge: 282
Wohnort: Köln

BeitragVerfasst am: Do 29 Apr, 2010 17:24    Titel: Antworten mit Zitat

Simon W. hat Folgendes geschrieben:

Zu 1. fällt mir leider nur eine unschöne Lösung ein, da ein Subquery kein LIMIT enthalten kann. ..

neue versionen von mysql können das

select * from (select spalte from tabelle limit 10) as t;


--------------------
Edit:
Jetzt merke ich, dass ich Simon falsch verstanden habe.
Ja es mir unbekannt mit einfachen SQL-mittel eine Ergebnismenge zu erzeugen, die aus 8 Spielen zu jedem Spieler zu erzeugen. Dafür muss man wirklich eine Schleife bauen.
Es wird aber nicht sehr schwer sein, nach dem der Administrator die Einträge erzeugt, ein Script laufen lassen, der eine Rang-Tabelle aktualisiert und für jeden Spieler die letzte 8 Spiele einträgt.

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Holger (HMR)



Anmeldedatum: 12.11.2007
Beiträge: 131

BeitragVerfasst am: Fr 30 Apr, 2010 19:35    Titel: Antworten mit Zitat

Hallo Simon,
hallo Slava,
erst mal danke für Eure Mühe...
hmmm..
ich bin ganz sicher, ich hab schon eine Antwort gepostet.
Wo ist die nur hin?

Zu 1.
Ich dachte, ich mach einfach eine Abfrageschleife über alle
Mitglieder und dann für jedes Mitglied ein SELECT
Im Moment sind das nur rund 30 Mitglieder, ist zwar nicht so elegant,
aber gehen tut's.

Zitat:
Möglich wäre es jedoch, die Spiele der einzelnen Spieler separat durchzunummerieren und dann bei dem join zwischen allen Spielern und deren zugeordneten Spielen nur diejenigen Spiele abzurufen, deren spiel_member.spielnr.>(spieler.letztesspiel-Cool ist.

Da bin bin ich nicht sicher, ob ich das richtig verstanden habe.
Meinst Du eine separate Tabelle, in der immer nur die letzen 8 Ergebnisse
jedes Spielers steht?

Oder so:
turnier_value_index | turnier_index_nr | turnier_member_nr| member_value | lfd_spielnummer_spieler |
(tabellenindex) |(turnier_index von 2.) | (Mitgliedsnummer) | (Punkte des Spielers) | (lfd. Nummer der Spiele eines Spielers)

Gruß
Holger

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Simon W.
Anti-verdenglischungs-Abgeordneter


Anmeldedatum: 05.11.2007
Beiträge: 283
Wohnort: Aachen

BeitragVerfasst am: Sa 01 Mai, 2010 10:31    Titel: Antworten mit Zitat

Genau, und dann müsste man beim Spieler noch eine Spalte hinzufügen, welches das letzte Spiel gewesen ist.
Beim Einfügen muss man bei dieser Lösung allerdings gucken, dass nicht zwei zeitgleich eingetragene Turnierteilnahmen sich gegenseitig beeinflussen. Ein unique-Index auf (turnierindex,membernr,spielnummer) könnte dabei zur Kollisionserkennung hilfreich sein. (Oder man sperrt die ganze Tabelle in dem Zeitraum.)

Wenn du deine aktuelle Lösung nicht jedes Mal, sondern nur nach einer Aktualisierung der DB wirklich ausführen und das Ergebnis speichern würdest, wärest du bei Slavas Lösung angekommen.

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Holger (HMR)



Anmeldedatum: 12.11.2007
Beiträge: 131

BeitragVerfasst am: Sa 01 Mai, 2010 13:10    Titel: Antworten mit Zitat

OK,
wenn dann eh eine separate Liste existiert, die nach jedem Update erstellt wird, kann doch gleich eine separate Tabelle existieren, in der immer nur die letzten 8 Spiele eines jeden Spielers stehen.
Die würde dann so aussehen:

tbl_index | Spiel_Index | Mitgliedsnummer | Mitglieds_spiel_nr. | Punkte

wobei, Mitglieds_spiel_nr. ja gar nicht benötigt wird, wenn der Spiel_Index da ist.
Wenn ein neuer Eintrag erfolgt, brauch ich ja nur den Eintrag mit dem kleinstem Spiel_Index der Mitgliedsnummer löschen und dafür den neuen eintragen.
Das SELECT müsste dann alle Einzelergebnisse eines Spielers und deren Summe abgreifen,
sortiert nach Summenergebniss eines Spielers, absteigend,
das sortiert nach Spiel_Index, aufsteigen.
Das sollte doch eigentlich gehen, oder?

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Simon W.
Anti-verdenglischungs-Abgeordneter


Anmeldedatum: 05.11.2007
Beiträge: 283
Wohnort: Aachen

BeitragVerfasst am: So 02 Mai, 2010 12:11    Titel: Antworten mit Zitat

Holger (HMR) hat Folgendes geschrieben:
Das sollte doch eigentlich gehen, oder?

Durchaus. Die Zugriffe müssen dabei aber auch irgendwie synchronisiert werden.

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    bituniverse.com Foren-Übersicht -> Datenbanken Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB2.de
Powered by WebRing.