SQL Datenbank Aufbau

bcmIT

Cadet 4th Year
Registriert
Sep. 2012
Beiträge
111
Guten Tag

Ich bin gerade am Designen einer Datenbank.
Die Ausgangslage lautet wie folgt:
"Ein Sportverein veranstaltet jedes Jahr einen Funwettkampf. Bis anhin geschah die Auswertung der Resultate von Hand, dies ist aber sehr umständlich und der Verein möchte dies in Zukunft digital machen."

Jede Disziplin hat zwei Bewertungskriterien mit unterschiedlichen Masseinheiten.

Zum Beispiel.
Der Teilnehmer hat 1min Zeit 5 Basketballkörbe zu werfen. Wenn er mehr als 1min braucht, werden die Anzahl Körbe die er bis dahin geworfen hat in die Datenbank eingetragen.

Ich habe folgende Tabellen:
Code:
Disziplin [ID_Disziplin,Disziplinname,Masseinheit_ID1,Masseinheit_ID2]
Masseinheit[ID_Masseinheit, Masseinheittyp]

Kann man dies so machen? oder würdet Ihr mit einer Zwischentabelle arbeiten?

Ich hoffe ich konnte es halbwegs verständlich erklären :P

Vielen Dank im Voraus
 
Hi bcmIT!
Also ich denke du bist da schon auf dem richtigen Weg. Aber wo möchtest du denn die gemessenen Werte eintragen? Momentan hast du nur den Typ der Maßeinheit.
 
Eine Zwischentabelle ergibt nur bei einer n:m-Beziehung Sinn. Hier wirft ein Teilnehmer n Körbe, daher brauchst du keine Zwischentabelle.

Die Eintragungen kannst du per Trigger realisieren. Ich würde allerdings die geworfenen Körbe nach einer Minute festhalten und nicht die Zeit, die für fünf Körbe benötigt wurde.

Tabellarisch würde ich eine Tabelle für die jeweilige Disziplin, ihre Spezifikationen sowie eine zweite für Teilnehmer sowie sein Ergebnis anlegen. Soweit genug der Anregung. ;)
 
Hi,

bcmIT schrieb:
Guten Tag

Ich habe folgende Tabellen:
Code:
Disziplin [ID_Disziplin,Disziplinname,Masseinheit_ID1,Masseinheit_ID2]
Masseinheit[ID_Masseinheit, Masseinheittyp]

Kann man dies so machen? oder würdet Ihr mit einer Zwischentabelle arbeiten?

Ich hoffe ich konnte es halbwegs verständlich erklären :P

Vielen Dank im Voraus

Ich würde aus dem Bewertungskriterium eine Tabelle machen

Code:
Disziplin [ID_Disziplin,Disziplinname,Kriterium1,Kriterium2]
Kriterium[ID_Kriterium,Kriteriumname,Masseeinheit_ID, benötigte_Anzahl]
Masseinheit[ID_Masseinheit, Masseinheittyp]

bin mir aber jetzt nicht 100% sicher
 
Marcel^ schrieb:
[...]Ich würde allerdings die geworfenen Körbe nach einer Minute festhalten und nicht die Zeit, die für fünf Körbe benötigt wurde.[...]

Ich glaub das ist ja der Clou an der Sache, einmal wird die Zeit gemessen bis 5 Koerbe und sonst die Anzahl der Koerbe in 1min. Deshalb die 2 Masseinheiten. Oder versteh ich das falsch?
 
Wenn er mehr als 1min braucht, werden die Anzahl Körbe die er bis dahin geworfen hat in die Datenbank eingetragen.

Wenn er es so gemeint hat, wie er es formuliert hat, werden letzten Endes nur die Anzahl Körbe eingetragen, die nach einer Minute erzielt wurden.

@timurinamanu:

Hat jede Disziplin genau zwei Maßeinheiten, ist das nicht nötig. Haben Disziplinen teils mehr oder weniger Maßeinheiten, ist das sinnvoll.
 
Es ist wie timurinamanu schreibt.

Hatte folgenden Entwurf:
Code:
Disziplin [ID, Name, Kriterium1_ID, Kriterium2_ID]
Kriterium[ID, Wert, Masseinheit_ID]
Masseinheit[ID, name]

bcmIT schrieb:
Zum Beispiel.
Der Teilnehmer hat 1min Zeit 5 Basketballkörbe zu werfen. Wenn er mehr als 1min braucht, werden die Anzahl Körbe die er bis dahin geworfen hat in die Datenbank eingetragen.

Disziplin: Name=Basketballwurf;
Kriterium1: Wert=60, Masseinheit: Name=sekunden
Kriterium2: Wert=5, Masseinheit: Name=Anzahl Körbe


Es fehlt aber noch die Möglichkeit die Ergebnisse der Teilnemer zu speichern:
Maier, Anzahl Körbe = 5, Zeit: 59 Sekunden
 
Zuletzt bearbeitet: (Ergänzung/Korrektur)
Marcel^ schrieb:
@timurinamanu:

Hat jede Disziplin genau zwei Maßeinheiten, ist das nicht nötig. Haben Disziplinen teils mehr oder weniger Maßeinheiten, ist das sinnvoll.

Jede Disziplin hat 2 Kriterien -> deswegen Kriterium1 und Kriterium2 in der Tabelle Disziplin.

Die Maßeinheit selber, könnte man mit dem Kriterium kombinieren, wenn man sagt, dass jedes Kriterium genau eine Maßeinheit und eine Maßeinheit genau ein Kriterium hat.

Also höchstens:
Code:
Disziplin [ID_Disziplin,Disziplinname,Kriterium1,Kriterium2]
Kriterium[ID_Kriterium,Kriteriumname,Masseeinheit_Bezeichnung, benötigte_Anzahl,Masseinheittyp]

Ich würde schon eine Tabelle Kriterium machen, da es ja auch weitere Spalten zb. wie benötigte Trefferanzahl etc. geben könnte.
 
Hauro schrieb:
Es ist wie timurinamanu schreibt.

Hatte folgenden Entwurf:
Code:
Disziplin [ID, Name, Kriterium1_ID, Kriterium2_ID]
Kriterium[ID, Wert, Masseinheit_ID]
Masseinheit[ID, name]



Disziplin: Name=Basketballwurf;
Kriterium1: Wert=60, Masseinheit: Name=sekunden
Kriterium2: Wert=5, Masseinheit: Name=Anzahl Körbe


Es fehlt aber noch die Möglichkeit die Ergebnisse der Teilnemer zu speichern:
Maier, Anzahl Körbe = 5, Zeit: 59 Sekunden

Die Ergebnisse und die Teilnehmer sollten in einer Zwischentabelle gespeichert werden da:
Ein Spieler mehrere Disziplinen meistern kann und
Mehrere Spieler eine Disziplin meistern können.

-> m:n Beziehung
D.h. braucht man eine Zwischentabelle

Code:
Spieler: ID, Name, ....
Spiel: Spieler_ID, Disziplin_ID, ....
 
Mein Vorschlag http://sqlfiddle.com/#!2/292c2/2

Edit: Die Joins bitte explizit angeben, statt wie bei mir implizit. Dadurch kann der Optimierer bessere Arbeit leisten und die Anfragen werden schneller. Da die Syntaxt aber von DBMS zu DBMS leicht verschieden ist, hab ich immer keine Lust die vorher zu googlen.
 
Zuletzt bearbeitet:
@Freezedevil ja genau so habe ich es am Anfang gedacht... Nur wollte ich in der Tabelle Disziplin die Masseinheit1 und Masseinheit2 auslagern um Redundanzen zu vermeiden..
 
timurinamanu schrieb:
Die Ergebnisse und die Teilnehmer sollten in einer Zwischentabelle gespeichert werden da:
Ein Spieler mehrere Disziplinen meistern kann und
Mehrere Spieler eine Disziplin meistern können.

-> m:n Beziehung
D.h. braucht man eine Zwischentabelle
Code:
Spieler: ID, Name, ....
Spiel: Spieler_ID, Disziplin_ID, ....

Das ist richtig, wollte nur darauf hinweisen, dass die Modellierung damit nicht vollständig ist und war nur als Beispiel gedacht. Es fehlt die Teilnehmer und Ergebnis Tabelle von Freezedevil.
 
Zuletzt bearbeitet: (Ergänzung)
bcmIT schrieb:
@Freezedevil ja genau so habe ich es am Anfang gedacht... Nur wollte ich in der Tabelle Disziplin die Masseinheit1 und Masseinheit2 auslagern um Redundanzen zu vermeiden..

Das kann man natürlich machen, aber ich halte es hier für nicht sonderlich sinnvoll. Du sparst meiner Ansicht nach nicht viel Redundanz ein, fügst dafür aber Komplexität hinzu. Zum einen wird das Schreiben der Queries komplexer und zum anderen dauern sie auch noch länger, da ein zusätzlicher Join nötig ist. Die Wahrscheinlichkeit, dass du aus Zentimetern auf einmal überall Millimeter machen willst ist ja auch eher gering.

Am Ende muss man das von Fall zu Fall abwägen und hier muss der TE entscheiden. Unterm Strich ist es in diesem Fall vermutlich egal, da die DB wohl keine Größe erreicht bei der eine Query mehr als ein paar ms benötigt. In meinen Augen macht man sich hier nur das Leben schwer wenn man es auslagert (Beim Eintragen muss man jedes Mal schauen welche Einheit welche ID hat und beim Abfragen braucht man einen Join mehr).
 
Dennoch sollte man es sich angewöhnen ohne Redundanzen zu arbeiten.
Im Studium bedeutet sowas Punkte Abzug, d.h. alles außerhalb der 3. Normalform - egal wie klein die Tabellen sind.
 
Gerade in großen Datenbanken nimmt man mitunter bewusst Redundanzen in Kauf um teure Joins zu verhindern. Man kann einfach nicht allgemein sagen, dass Normalisieren auf Teufel komm raus immer der richtige Ansatz ist. Das hängt stark von den konkreten Daten und häufigen Anfragen ab.
 
Zurück
Oben