php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 10.12.2008, 18:40  
Neuer Benutzer
 
Registriert seit: 03.12.2008
Beiträge: 23
anbeck befindet sich auf einem aufstrebenden Ast
Standard [Erledigt] Wie eine Datenbank aufbauen, Tabellen organisieren?

Hallo zusammen,

nachdem ich mich in MySQL eingearbeitet habe, habe ich nun einen Überblick erlangt und kann meine Datenbanken füllen und abfragen.

Aber eine Frage wurde in keinem der Bücher oder der Internetseiten, die ich durchgearbeitet hatte, angesprochen: Nach welchen Kriterien baue ich eine Datenbank auf? Wie unterteile ich die verschiedenen Tabellen, damit diese harmonisch ein Ganzes ergeben?
Gibt es bestimmte Faustregeln oder ist alles eine Frage des Einzelfalls?

In meinem Fall geht es um ein Browsergame (ich hoffe, dass ist nicht zu verpönt hier - ich werde es möglichst abstrakt halten!). Jeder Spieler hat ein Team, dieses Team besteht aus verschiedenen Sportlern (um nicht noch einmal "Spieler" zu sagen). Diese Sportler nehmen mit verschiedenen Sportgeräten an verschiedenen Wettbewerben in verschiedenen Klassen teil.

Bis jetzt habe ich eine Tabelle, in der ich die Accounts der Spieler verwalte (id, eMail, etc.). Wie kann ich den Rest darum herum aufbauen?

Ich dachte an folgendes:
* 1 Tabelle für die Sportler. Verbunden werden diese durch ein Feld "Team", wo dann die id des Teams drin steht. So kann ich jeden Sportler einem Team zu ordnen.
* 1 Tabelle für die Sportgeräte, analog zu der Sportler-Tabelle
* 1 Tabelle pro Wettbewerb (welche Bedingungen für Sportgeräte, wann der Wettbewerb stattfinden, etc.)

Jetzt wird es interessant. Die Ergebnisse der Wettbewerbe werden sich ja im Laufe der Zeit ansammeln. Wie sollte ich diese handhaben?

Wird jedes Ergebnis bei jedem Sportler eingetragen? Dies würde die Sportler-Tabelle richtig unübersichtlich werden lassen. Zudem würde sie asymmetrisch, da ja nicht jeder Sportler an der gleichen Zahl von Wettbewerben teilnimmt.

Oder kommen die Ergebnisse in eine zusätzliche Tabelle? Dort würde festgehalten, welcher Sportler für welches Team in welcher Klasse an welchem Wettbewerb mit welchem Ergebnis teilgenommen hat.
Dies würde bedeuten, dass ich jedesmal, wenn ich die Statistiken eines Spielers anzeigen möchte, sämtliche Ergebnistabellen durchsuchen müßte.

Ich würde mich über Informationen zu dem Zusammenspiel von Tabellen freuen!

Vielen Dank im voraus!
a.
anbeck ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 10.12.2008, 19:02  
Erfahrener Benutzer
 
Registriert seit: 02.12.2008
Beiträge: 357
webproger befindet sich auf einem aufstrebenden Ast
Standard

Hallo!

Wie du eine DB aufbaust ist nicht ganz einfach so zu erklären, natürlich könnte ich dir nun ein Beispiel geben, das würde dir beim nächsten Mal jedoch nicht weiterhelfen.

Ich werde dir mal die natürliche Vorgehensweise erläutern:
1. Du schribst dir mal schön strukturiert auf wie das Browserspiel funktionieren soll (Hast du oben recht schön gemacht, für dich selbst vielleicht noch etwas detaillierter)
2. Als nächstes beginnst du dich zu fragen: Für was könnte ich alles eine Tabelle brauchen und schreibst diese Dinge auf (In deinem Fall Sportler, Spieler, Wettkampf, Sportgerät, ...)
3. Nun definierst du die Beziehungen, dabei helfen dir oft Fragen wie:
- "Ein Sportler kann an einem oder mehreren Wettkämpfen teilnehmen" und die Gegenfrage "Ein Wettkampf kann einer oder mehrere Sportler haben?".
- "Ein Sportler kann ein oder mehrere Sportgeräte benützen?", "Ein Sportgerät kann von einem oder mehreren Sportlern benutzt werden?"
- ...
Diese Beziehungen definierst du nun grundsätzlich mal mit (1:m, m:1, 1:1, m:m)
m:1 = Sportler <--> Sportgeräte (Ein Sportler kann nur ein Gerät benutzen, ein Gerät kann jedoch von mehreren Sportlern benutzt werden)
Wenn du Fragen zu den Beziehungen hast Frag einfach nach.

4. Sobald du sämtliche Beziehungen definiert hast kannst du dir überlegen, welche Spalten eine Tabelle haben sollte (ID, Fremdschlüsselspalte, name, ...)
5. Nun solltest du eigentlich eine ganze DB-Struktur aufgebaut haben. =]


Das ganze ist nun relativ grob beschrieben, dafür gibt es jedoch auch noch Tutorials, hab leider kein gutes gefunden, vielleicht findest du ja eins.


Das Festlegen solcher Beziehungen nennt man überigens auch ERD (entity relationship diagram) oder Normalformen, ...

gruss
__________________
webproger ist offline   Mit Zitat antworten
Alt 10.12.2008, 19:08  
Erfahrener Benutzer
 
Registriert seit: 02.12.2008
Beiträge: 357
webproger befindet sich auf einem aufstrebenden Ast
Standard

Ergänzung

Um deine Frage doch noch kurz zu beantworten:
Bei den Wettkampfresultaten ist eine sogenannte m:m-Beziehung im Spiel, das heisst:
"Ein Sportler kann an mehreren Wettkämpfen teilnehmen und ein Wettkampf kann verschiedene Sportler haben"

Bei m:m-Beziehungen kommt es immer zu Zwischentabellen, habe ich noch vergessen zu erwähnen. Das heisst die Resultate werden in eine Tabelle gespeichert. Die Beziehung wird dann aus

Sportler -- m : m -- Wettkampf

zu

Sportler -- 1 : m -- Zwischentabelle Resultate -- m : 1 -- Wettkampf

Die Zwischentabelle hat dann folgende Spalten:

|sportler_id (fremdschlüssel)|wettkampf_id (fremdschlüssel)|resultat|
__________________
webproger ist offline   Mit Zitat antworten
Alt 10.12.2008, 19:14  
Neuer Benutzer
 
Registriert seit: 03.12.2008
Beiträge: 23
anbeck befindet sich auf einem aufstrebenden Ast
Standard

Vielen Dank für Deine schnellen Erläuterungen! Aber ich muß das jetzt erstmal verdauen und schauen, wie ich das umsetzen kann! Falls noch jemand ein Tutorial oder gar öffentlich zugängliche Beispiele findet, her damit
anbeck ist offline   Mit Zitat antworten
Alt 10.12.2008, 19:27  
Erfahrener Benutzer
 
Registriert seit: 02.12.2008
Beiträge: 357
webproger befindet sich auf einem aufstrebenden Ast
Standard

das wäre vielleicht etwas:
MySQL Datenbankhandbuch: Tutorial Normalisierung von Datenbanken



gruss
__________________
webproger ist offline   Mit Zitat antworten
Alt 10.12.2008, 19:31  
Neuer Benutzer
 
Registriert seit: 03.12.2008
Beiträge: 23
anbeck befindet sich auf einem aufstrebenden Ast
Standard

Aaaaaaah, sieht gut aus, danke
anbeck ist offline   Mit Zitat antworten
Alt 10.12.2008, 20:27  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Hier noch mal kompakt: Normalisierung (Datenbank – Wikipedia)
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 11.12.2008, 15:35  
Neuer Benutzer
 
Registriert seit: 03.12.2008
Beiträge: 23
anbeck befindet sich auf einem aufstrebenden Ast
Standard

Okay, ich habe jetzt mal meine erste Test-DB in Normalform angelegt, um die Vorteile zu testen. Dazu habe ich noch eine Frage, aber erst das Beispiel: Ich besitze 3 Bälle. Es gibt 2 verschiedene Typen von Bällen (groß, klein), aber jeder in meinem Besitz befindliche Ball kann eine beliebige Farbe haben. Ich habe also 2 Tabellen angelegt:

Code:
Tabelle balltypen
id	Balltyp	Gewicht	Durchmesser
1	groß	        400g	         25cm
2	klein	        100g	         10cm

Tabelle besitz
id	typid(fk)Farbe
1	1	    rot
2	2	    blau
3	2	    grün
Ich besitze also 2 kleine Bälle und einen großen Ball.

Jetzt zu meiner Frage: Ich hatte gehofft, dass der Fremdschlüssel bedeutet, dass MySQL automatisch weiß, wo es zu suchen hat, wenn ich einen Wert aus der "Kindtabelle" haben will, der allerdings in der "Elterntabelle" steht.
Angenommen, ich möchte das Gewicht meines 3. Balls herausfinden. Ich hatte gehofft, ich könnte suchen:

SELECT gewicht FROM besitz WHERE id = 3;

Aber er sagt mir, dass es das Feld in dieser Tabelle nicht gibt. Was ja auch stimmt, aber ich hatte gehofft, dass er mal in der Tabelle schaut, auf die der Fremdschlüssel verweist.

Wie kann ich es geschickt anstellen, damit diese Abfrage klappt? Mit joins?

Oder per PHP:
Code:
$typ = mysql_query("SELECT typid FROM besitz WHERE id = 3");
$gewicht = mysql_query("SELECT gewicht FROM balltypen WHERE id = $typ");
Danke schonmal für die gute Betreuung hier! Ich gebe mir Mühe, alles nachzuarbeiten und zu verstehen, aber gewisse Dinge sind Büchern schwer zu entnehmen...

a.
anbeck ist offline   Mit Zitat antworten
Alt 11.12.2008, 15:43  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Ja, mit JOINs geht das.
Code:
SELECT
  besitz.farbe,
  balltypen.gewicht 
FROM
  besitz
JOIN
  balltypen
ON
  besitz.typid=balltypen.id
WHERE
  besitz.id=3
Mit EXPLAIN kannst Du Dir jeweils ansehen, ob MySQL "sinnvoll" mit der Anfarge umgehen kann. Gerade bei Kombinationen von JOIN, WHERE, GROUP BY usw. solltest Du das nutzen, sonst wird Deine Datenbank erstaunlich schnell zum Flaschenhals siehe MySQL :: MySQL 5.1 Reference Manual :: 12.3.2 EXPLAIN Syntax
David ist offline   Mit Zitat antworten
Alt 11.12.2008, 15:46  
Erfahrener Benutzer
 
Registriert seit: 02.12.2008
Beiträge: 357
webproger befindet sich auf einem aufstrebenden Ast
Standard

genau das wollt ich auch gleich sagen.
__________________
webproger ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
2 Tabellen aus unterschiedlichen Datenbank synchron halten. stefanjann Datenbanken 0 29.10.2008 15:47
[Erledigt] Limit auf Ergebnissumme mehrerer Tabellen Frank Datenbanken 8 02.09.2008 11:33
Alle Relationen von Tabellen in einer Datenbank abfragen dreifragezeichen Datenbanken 10 22.04.2008 17:51
datenbank auf andere kopieren geht nicht! Kevin Datenbanken 1 18.08.2007 23:20
Temporäre Tabellen und Performance Olsen Datenbanken 2 09.09.2006 17:08
Problem beim Abfragen aller Tabellen in einer Datenbank gulli23 Datenbanken 5 26.02.2006 20:04
Problem beim Export / Import von Tabellen in Datenbank!? nicobischof Datenbanken 4 25.02.2006 19:19
[Erledigt] Navigation aus Datenbank aufbauen PHP Tipps 2007 2 05.12.2005 18:05
Abfrage aus Datenbank mit Tabellen und Ausgabe in index.php PHP Tipps 2005-2 4 23.10.2005 11:04
Eine Datenbank - Viele Tabellen oder mehrere Datenbanken? nicobischof Datenbanken 3 20.10.2005 15:36
Tabellen ind Datenbank GrU3nL!nG Datenbanken 4 02.06.2005 22:42
Wie zähle ich mit php die Tabellen in einer Datenbank? b++ PHP Tipps 2004-2 2 15.11.2004 19:17
[Erledigt] Selectanfrage an eine Datenbank,aber aus mehreren Tabellen Datenbanken 2 26.10.2004 07:23
datenbank tabellen Datenbanken 6 10.09.2004 12:39
Tabellen aus Datenbank erzeugen??? PHP Tipps 2004 5 02.08.2004 12:00

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
datenbank aufbauen, wie ist eine datenbank organisiert, datenbank organisieren, datenbank zwischentabelle, datenbanken organisieren, datenbanken aufbauen, datenbank sinnvoll aufbauen, datenbank richtig aufbauen, erd zwischentabelle, datenbank organisiert, wie ist eine datenbank organisiert?, datenbank zwischentabellen, datenbankverbindung aufbauen, wie datenbank aufbauen, eigene datenbank aufbauen, wie eine datenbank aufbauen, zwischentabelle datenbank, mysql datenbank organisieren, db aufbauen, datenbanken richtig aufbauen

Alle Zeitangaben in WEZ +2. Es ist jetzt 03:53 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum