Ergebnis 1 bis 9 von 9

Thema: sinnvolle Struktur der Tabelle

  1. #1
    HTML Newbie
    Registriert seit
    12.07.2008
    Beiträge
    5
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard 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!
    Achtung: Dies ist ein alter Thread im HTML und Webmaster Forum
    Diese Diskussion ist älter als 90 Tage. Die darin enthaltenen Informationen sind möglicherweise nicht mehr aktuell. Erstelle bitte zu deiner Frage ein neues Thema im Forum !!!!!

  2. #2
    Bandit
    Gast

    Standard

    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

  3. #3
    Kaiserliche Hoheit Avatar von No0ob
    Registriert seit
    02.01.2006
    Ort
    Nähe Frankfurt
    Beiträge
    1.500
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard

    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.

  4. #4
    HTML Newbie
    Themenstarter

    Registriert seit
    12.07.2008
    Beiträge
    5
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard

    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?

  5. #5
    Bandit
    Gast

    Standard

    Hast du.

  6. #6
    HTML Newbie
    Themenstarter

    Registriert seit
    12.07.2008
    Beiträge
    5
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard

    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!

  7. #7
    HTML Newbie
    Themenstarter

    Registriert seit
    12.07.2008
    Beiträge
    5
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard

    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:
    Code:
    SQL-Befehl: Bearbeiten
    
    INSERT INTO `DB-NAME`.`z_user` (
    `feld_id` ,
    `userid`
    )
    VALUES (
    '284', '2'
    )
    
    MySQL meldet: Dokumentation
    #1062 - Duplicate entry '284' for key 1
    Gut, heisst für mich, dass der Lösungsansatz nicht funktioniert. Oder?

    Hat jemand eine andere/neue/erweiterte Idee?

  8. #8
    Kaiserliche Hoheit Avatar von No0ob
    Registriert seit
    02.01.2006
    Ort
    Nähe Frankfurt
    Beiträge
    1.500
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard

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

  9. #9
    HTML Newbie
    Themenstarter

    Registriert seit
    12.07.2008
    Beiträge
    5
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard

    *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...

Ähnliche Themen

  1. URL Struktur anpassen
    Von BenTreeser im Forum HTML & CSS Forum
    Antworten: 5
    Letzter Beitrag: 08.07.2008, 01:30
  2. ftp - Struktur "der Ordner"
    Von micson im Forum HTML & CSS Forum
    Antworten: 1
    Letzter Beitrag: 19.04.2007, 16:51
  3. MySQL Werte von Tabelle a in Tabelle b eintragen.
    Von Barret im Forum PHP Forum - Apache - CGI - Perl - JavaScript und Co.
    Antworten: 0
    Letzter Beitrag: 08.02.2007, 11:42
  4. Tabelle in Tabelle ausrichten
    Von Mad_Dog im Forum HTML & CSS Forum
    Antworten: 7
    Letzter Beitrag: 27.04.2006, 15:54
  5. Wie bekomme ich eine tabelle in eine tabelle?
    Von SonicChriz im Forum HTML & CSS Forum
    Antworten: 1
    Letzter Beitrag: 25.04.2005, 17:06

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •