sinnvolle Struktur der Tabelle

  • Vorweg einen grossen Dank an dieses Forum! Auch wenn dies meine erste Frage hier ist, habe ich schon viel Hilfe beim Durchsuchen des Forums erhalten, dafür mein Dank!

    Dieses Mal geht es allerdings um ein etwas spezielleres Problem, daher komme ich um eine Frage nicht herum:
    Folgende Ausgangssituation: Wir stellen uns ein Schachbrett (30x30) vor, oben die x-Koordinate, an der Seite die y-Koordinate. Dieses "Schachbrett" habe ich in einer Mysql-Tabelle wie folgt aufgenommen: Spalte1: x-Koordinate, Spalte2: y-Koordinate, Spalte 3 & 4 zusätzliche Informationen zu den einzelnen Feldern. Das ganze ergibt in meinem Fall eine Tabelle mit 900 Einträgen. Nun möchte ich zu jedem Feld speichern, wer sich gerade auf dem Feld befindet, habe jedoch eine nicht begrenzte Anzahl von Spielern und auf einem Feld können sich mehrere Spieler (auch hier die Anzahl nicht begrenzt) befinden.

    Ansatz 1: Ich erstelle für jeden weiteren Spieler der ein Feld betritt, eine neue Spalte und speichere die ID des Spielers dort. Vorweg stelle ich natürlich erst fest ob eine neue Spalte überhaupt nötig ist. Das Problem (aus meiner Sicht) ist hier die nicht begrenzte Spielerzahl pro Feld, da kann die Tabelle mal ganz schnell in der Breite ausufern. Frage hier: IST das überhaupt ein Problem?

    Ansatz 2: Bei diesem Ansatz werde ich jetzt von vielen (zu Recht) "Ärger" bekommen, da er gegen die Regeln der Normalisierung verstösst und dazu führt, dass die Werte nicht mehr atomar sind:
    Ich speichere alle Id´s der Spieler auf einem bestimmten Feld in einer einzigen Spalte, getrennt durch ein Trennzeichen. Das würde dazu führen, dass ich meine Werte immer in der entsprechenden Spalte finde und nicht laufend bevor ich Werte auslesen oder abspeichern will, feststellen muss wie breit die Tabelle aktuell ist, ob ich eine Spalte hinzufügen muss usw.

    Ansatz 3: Den habe ich einfach trotz ewigem Grübeln und stundenlanger Recherche noch nicht gefunden.
    Bei beiden Ansätzen fühle ich mich nicht besonders wohl und daher suche ich hier Rat. Wie schon im Titel angekündigt: Ich suche eine sinnvolle und richtige, aber auch performante Lösung.

    Im Vorraus vielen Dank für alle die sich mit meiner Frage beschäftigen!

  • Du brauchst in der tabelle "schachbrett noch eine ID. Dann legst du eine weitere Tabelle an, z.B. fields:

    id_aus_schachbrett - id_des_users

  • Die ID ist nicht notwendig, da man die Koordinaten als zusammengesetzten Schluessel verwenden kann.
    Wenn du also keine ID verwenden moechtest, kannst du eine Tabelle a la coord_x | coord_y | user_id verwenden.

    Es ist also dir ueberlassen, ob du eine ID einfuehrst oder nicht. Wenn du mit den Feldern noch mehr anstellen moechtest (also die Schluessel in weiteren Feldern brauchst), solltest du eine ID einfuehren, da du mit einer eindeutigen ID weniger Speicherplatz fuer die ganzen Querverweise benoetigst.

  • Vielen Dank für eure schnellen Antworten!

    Falls ich euch richtig verstanden habe:
    Der Plan mit einer weiteren Tabelle würde doch dazu führen, dass ich eine Tabelle habe in der die id_aus_schachbrett mehrfach, jeweils mit anderen id_des_users-Werten auftaucht, ungefähr nach folgendem Schema:

    id_aus_schachbrett = s_id

    s_id ------ user_id
    1 ------------ 1
    1 ------------ 7
    1 ------------ 23
    2 ------------ 9
    usw.

    Habe ich das richtig verstanden?

  • Ich muss das nochmal überdenken, vor allem was die Realisierung in meinen Scripten angeht, aber derzeit wirkt es als würde das funktionieren!

    Danke euch!

  • So, habe jetzt endlich wieder Zeit gefunden mich mit der Sache zu befassen. Ich kann mir nicht ganz erklären warum, aber irgendetwas läuft dort schief. Tolle Fehlerschilderung, also nochmal als Klartext:
    zusätzliche Spalte "ID" ist in der Tabelle Schachbrett angelegt.
    neue Tabelle ist nach besprochener Struktur angelegt.
    Versuch eben jene neue Tabelle mit Daten zu füllen schlägt insofern fehl als das nicht alle Werte in die Tabelle geschrieben werden. Es müssten 3 Datensätze in der Tabelle auftauchen und die zugehörigen sql-Anfragen werden per echo auch korrekt ausgegeben (alle drei). Eingetragen wird allerdings nur der allererste Datensatz.
    Eigentlich schliesse ich meinen Code als Fehlerquelle aus, aber zu Sicherheit möchte ich die sql-Anfrage dennoch posten:

    Code
    $sql = "INSERT INTO `$tabellenname` ( feld_id, userid) VALUES ('$feld_id', '$id[$k]')";


    Die einzelnen Variablen sind auch in Ordnung, die werden per echo sauber ausgegeben. Bin mit meinen Debug-Ideen allmählich am Ende, habe allerdings einen Verdacht: Ist es überhaupt MÖGLICH in einer Tabelle den primary-key mehrfach aufzuführen mit unterschiedlichen userid-Werten?

    Ich hoffe das jemand einen Gedanken dazu hat ;)

    EDIT:
    Nachtrag: Bin meinem Verdacht nachgegangen und habe das per Shell-Befehl einfach nochmal getestet:

    Gut, heisst für mich, dass der Lösungsansatz nicht funktioniert. Oder?

    Hat jemand eine andere/neue/erweiterte Idee?

  • Die Tabelle, die die n:m-Relationen beinhaltet, darf ein Feld nicht als Primaerschluessel definiert haben.
    Ausserdem solltest du die Variablen escapen.

  • *grummel* wusste ich nicht :( Immer diese Nicht-Wisser...
    Danke dir für den Hinweis! Es klappt perfekt, nachdem ich das nun geändert habe... Vielen Dank

    Achso, Thema escapen: Nicht hauen! *duck* mea culpa...