Effiziente Implemetierung gesucht

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Effiziente Implemetierung gesucht

    Ich habe eine Tabelle mit Userdaten und eine zweite Tabelle, welche Gegenstände und ihre Eigenschaften enthält. Nun sollte jedem User eine beliebige Menge von Gegenständen zugeordnet werden können. Wie kann ich das implementieren, so dass möglichst wenig Platz verbraucht wird?

  • #2
    mach eine verknüpfungstabelle.

    1. spalte userid
    2. spalte gegenstandid

    so sähe dann z.b. der inhalt aus, wenn daten enthalten sind.....
    Code:
     uid | gid
    -----------
      2  |  1
      5  |  8
      7  |  7
      3  |  3
      3  |  5
      3  |  5
     12  | 10
    INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


    Kommentar


    • #3
      Hmm. Eigentlich offensichtlich. Wenn man jetz noch ohne grossen Aufwand sortiert einfügen könnte, wäre das ganze wohl auch bei der Abfrage ziemlich schnell. Danke für die Hilfe.

      Kommentar


      • #4
        wieso sortiert einfügen?
        was meinst du ?
        INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


        Kommentar


        • #5
          Naja, wenn man aus dieser Tabelle alle Gegenstände eines Users ablesen will, muss man ja immer die ganze Tabelle durchsuchen, es sei denn, sie ist schon nach User geordnet, dann kann man spezielle Verfahren zur Einschränkung des Aufwandes verwenden. Oder funktioniert das etwa völlig anders?

          Kommentar


          • #6
            Oder funktioniert das etwa völlig anders?
            ja.

            schaue dir mal JOINs an. insbesondere LEFT JOIN und LEFT OUTER JOIN.

            sortieren kannst du immer noch, wonach du willst.... diese verbindungstabelle, stellt nur dar, welcher user welchen gegenstand/gegenstände besitzt. auch kann abgebildet werden, dass mehrere user einen gleichen gegenstand haben. schliesslich können nciht alle äpfel einem user zugeordnet werden...
            INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


            Kommentar


            • #7
              /me hat in seinen datenbank vorlesungen gelernt, dass leute ausm rechenzentrum dumm wie'n meter feldweg sind, worms übern beamer richtig spaß macht und dass spalten einer tabelle ganz streng genommen keine reihenfolge haben

              und wenn es schon für spalten (also innerhalb einer zeile) gilt, dann gilt das jo wohl auch für zeilen untereinander

              in nertabelle speicherst du nur zusammengehörende daten mit gleicher struktur, ohne reihenfolge, ohne irgendwas
              Ich denke, also bin ich. - Einige sind trotzdem...

              Kommentar


              • #8
                Achso, dann mache ich einfach einen LEFT JOIN mit der UserID und erhalte alle Einträge dieses Users...interessant. Wie das wohl intern funktioniert?

                Kommentar


                • #9
                  genau genommen musst du 2x JOIN machen. schliesslich willst du ja auch die gegenstände haben

                  hier mal die query ...

                  Code:
                  SELECT      u.uid,
                              u.uname
                              u.uemail,
                              g.gid,
                              g.gname
                              
                  FROM        user u
                                  LEFT OUTER JOIN user_gegenstaende USING(uid)
                                      LEFT OUTER JOIN gegenstaende g USING(gid)
                  spalten- und tabellennamen müssen natürlich angepasst werden.
                  INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                  Kommentar


                  • #10
                    Original geschrieben von zagibu
                    Wie das wohl intern funktioniert?
                    1. Link 1
                    2. Link 2


                    wenn du die einträge eines user haben willst geht das auch mit INNER JOIN (spontane behauptung), aber frag mich nich, ob das besser is
                    Ich denke, also bin ich. - Einige sind trotzdem...

                    Kommentar


                    • #11
                      Original geschrieben von mrhappiness
                      wenn du die einträge eines user haben willst geht das auch mit INNER JOIN (spontane behauptung),
                      erklär mir das mal näher...
                      INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                      Kommentar


                      • #12
                        dein join liefert doch alle user, egal ob sie gegenstände besitzen und alle gegenstände, egal ob jemand sie besitzt oder nicht?

                        wenn er das aber für einen bestimmten user haben will, macht er das ja mit userid und dann sollte auch
                        Code:
                        SELECT
                          u.uname, g.gname
                        FROM user u
                          INNER JOIN user_gegenstand USING (user_id)
                            INNER JOIN gegenstand g USING (gegenstand_id)
                        WHERE u.user_id=45.78
                        gehen
                        Ich denke, also bin ich. - Einige sind trotzdem...

                        Kommentar


                        • #13
                          ok. verstanden (hoffe ich. )

                          mein LEFT O J liefert keine gegenstände, wenn es keinen user gibt, dem ein GS zugeordet ist. daher ja das LEFT. es wird sich an der 'linken' tabelle orientiert....
                          INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                          Kommentar


                          • #14
                            stimmt, mea culpa

                            was is denn nu performanter?
                            left outer joins und dann where oder inner join?
                            Ich denke, also bin ich. - Einige sind trotzdem...

                            Kommentar


                            • #15
                              möglicherweise der INNER JOIN, da hier nur die werte aus der linken tabelle benützt werden, die auch tatsächlich benötigt werden. somit ist die abfrage ein wenig performanter. insbesondere dann, wenn die daten immer mehr werden. bei einem LEFT OUTER JOIN werden erst einmal alle daten aus der linken tabelle gezogen, dann die daten aus der mittleren tabelle genommen und anschliessend noch die aus der rechten tabelle. anschliessend wird das WHERE verarbeitet.

                              daher kann ich mir vorstellen, dass das INNER JOIN minimal schneller sein könnte..
                              INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                              Kommentar

                              Lädt...
                              X