Datenmodellierung für MySQL Datenbank

Falc410

Vice Admiral
Registriert
Juni 2006
Beiträge
6.425
Hallo,

ich bin gerade dabei eine Art Spiel für die Uni zu entwickeln und habe Probleme bei meiner Datenmodellierung.
Es gibt einen Spieler mit verschiedenen Attributen und Datensätze mit bestimmten Eigenschaften. Diesen Datensätzen muss der Spieler nun eine oder mehreren Kategorien zuordnen.
Als Framework benutzte ich Django, d.h. ich beschreibe mein Model in Python und bekomme automatisch die Datenbank erstellt (dank einem Object-relational mapper wie Hibernate für Java).

Mein Problem betrifft die Relation Vote welche im Prinzip Spieler X Kategorie X Datensatz speichern soll, sowie die Modellierung der Kategorien. Da für einen Datensatz eine oder mehrere Kategorien zutreffen können weiss ich nicht genau wie ich die Kategorie Klasse / Table modellieren soll. Ich muss später herausfinden können wie oft Kategorie A z.B. für Datensatz Y vergeben worden ist.

Mal ein paar Beispiele:
Spieler A (Name=A) wählt Kategorie M für Datensatz D
Spieler A (Name=A) wählt Kategorie N für Datensatz D
Spieler B wählt Kategorie M für Datensatz D

Abfrage Datensatz D soll liefern: M=2, N=1

Meine Idee war jetzt einfach eine M:N Beziehung zwischen dem kompletten Tripel Spieler x Kategorie x Datensatz. Ist das soweit korrekt?

Wenn ich es nur als Klassen modelliert hätte, dann könnte ich ein Decorator Pattern benutzen (Klassisches Beispiel Pizza + Toppings). Aber ich hab keine Ahnung wie ich so etwas für Datenbanken realisiere. Hat da jemand einen Tipp für mich?
 
Also für mich klingt es wie du schon schreibst nach einer klassischen m:n Beziehung.
 
Jop, M:N erscheint mir auch korrekt.
In der DB kannst du das über eine Mapping-Tabelle realisieren:
Spieler 1 : M Kategorie
Kategorie N : 1 Datensatz

Grüße
Simon
 
Achso, man macht gar keine Triple Beziehungen?
Wenn ich das so mache wie von Simon beschrieben woher weiss ich dann wenn
Spieler 1 : M Kategorie
in der Tabelle steht, zu welchem Datensatz das gehört?

Ich hatte auch überlegt ob es vielleicht mehr Sinn macht Kategorie als Attribut von Datensatz zu modellieren anstatt als eigene Klasse / Tabelle. Das müsste dann eine Liste von Kategorien sein und wenn ein Spieler abstimmt wird einer der Werte inkrementiert. Ist das nicht sinnvoller?
 
Nimm mal aussagekräftigere Namen, ich weiß noch nicht so ganz, was du meinst. Der Spieler sieht Datensätze und entscheidet, in welche Kategorien diese eingeordnet werden? Hä? Was für ein Spiel soll das sein? Informatik-Simulator 2015?

So, wie ich verstanden habe, bräuchtest du eine Tabelle für die Beziehung zwischen Spieler, Datensatz und Kategorie mit den Spalten PlayerID, CategoryID und DataID. Dann fügst du einfach nur die ID des Spielers, der abgestimmt hat, die ID der Kategorie, die er gewählt hat, und die ID des Datensatzes, auf den sich das bezieht, ein.
 
Zuletzt bearbeitet:
Ok, nehmen wir mal an der Spieler sieht ein Gemälde und bekommt folgende Kategorien zur Auswahl: schön, häßlich, modern, antik
Er entscheidet sich für schön und antik. Eine unsinnige Kombination wie schön + häßlich muss ich abfangen.
Die Liste der Kategorien kann sich verändern im Laufe der Zeit - vielleicht treffen auch gar nicht alle auf einen Datensatz zu.

Später muss ich auswerten können wie viele Leute bei diesem Gemälde für Schön gestimmt haben. Oder ich will eine Suche machen nach allen schönen Gemälden usw.

Daher die Idee eben, die Kategorien als Eigenschaft / Attribut von einem Gemälde zu beschreiben. Aber ich würde eben auch gerne genau nachschauen können welcher Spieler wie abgestimmt hat (ist dann auch wichtig für die Punkteberechnung). Dann ist es wahrscheinlich sinnvoller Kategorien als eigenes Objekt zu betrachten und eben meine Triple Relation zu benutzen. Ich hätte dann eine Tabelle Kategorie die wie folgt aussieht:
id | Name
1, schön,
2, häßlich,
3, modern,
4, antik

Und eine Tabelle in der ich alle Votes speichere mit Datum eventuell:
Spieler_ID | Kategorie_ID | Datensatz_ID | Datum
1,1,1,2014-10-24, 10:33:00 (Spieler 1 hat für Gemälde 1 mit schön gestimmt)

Das macht es mir aber schwer unsinnige Ausnahmen zu definieren wie z.B. dass ein Gemälde nicht gleichzeitig schön und häßlich sein kann. Die Frage ist auch wie performant es ist wenn ich später anzeigen will wie viele Leute für schön gestimmt haben. Dann muss ich ja erst die komplette Tabelle durchsuchen. Wäre es dann sinnvoll noch zusätzlich einen Integer Wert für jede Kategorie im Datensatz des Gemäldes zu speichern?
 
Mit Indizierung musst du nicht die ganze Tabelle durchsuchen, das geht dann etwas schneller. Und selbst mit 10000 Spielern und vllt. 100000 Einträgen in der Tabelle sollte die Performance mit Indizierung ausreichend sein.

Du könntest z.B. einen Index über DatensatzID und KategorieID (also einen über beide und in dieser Reihenfolge) erstellen (siehe CREATE INDEX).
 
Hi,

MySQL für ein Spiel? Wieso nicht einfach ein vernünftiges Klassen- und Objektmodell, die gewünschten Eigenschaften als Properties der Objekte festlegen und am Ende dann eben persistieren, egal in welche Datenbank? Das wäre viel sinnvoller, als während dem Spiel in und aus der DB zu lesen, genau das ist ja der Vorteil von OOP.

Bzgl. Performance: von welcher Datensatz-Stückzahl sprechen wir denn überhaupt konkret?

VG,
Mad
 
Zurück
Oben