Gast: User-Connection

Hallo! Grüble, wie ich am sinnvollsten eine sog. User-Connection mit PHP und MySQL realisiere.
Habe mir folgendes überlegt: ich erstelle eine Tabelle "Freunde" und lasse dann über das Adden beide Namen einfügen.
Allerdings müsste ich dann verhindern, dass eine Verbindung zweimal besteht (User A - User B sowie nochmal umgedreht: User B und User A)... wie könnte ich das machen?
Frezunde anzeigen ist ja einfach.. das lese ich schlichtweg nur aus. Achso, da hab ich doch ein Problem :D : Und zwar, wenn ich es auslese, muss ich verhindern, dass der eigene Username mitangezeigt wird, wie stelle ich das an?

Viele Grüße

  1. Hello,

    Hallo! Grüble, wie ich am sinnvollsten eine sog. User-Connection mit PHP und MySQL realisiere.

    Meinst Du eventuell eine User Relation?
    Es gibt gerichtete und ungerichtete, abhängige und unabhängige Verbindungen.

    Wenn Du eine ungerichtete Verbindung aufbauen willst, benötigst Du nur eine Zwischentabelle mit einer Eineindeutigen Schlüsselspalte und einen festgelegten Algorithmus, um in dieser Tabelle den Schlüssel abzulegen. Bei Verbundenen IDs ist das ganz einfach:

    Sorge dafür, dass das Insert und Update in die Tabelle nur durch eine Benutzerfunktion (oder Stored Procedure) möglich ist. Dieser müssen die zwei Fremdschlüssel übergeben werden. Die Funktion ordent zuerst die Schlüssel nach ihrer Größe, stellt sicher, dass es kein Selbstbezug wird und dann führt sie das Insert oder Update auf die Unique-indizierte Spalte durch.

    Alles klar?

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Danke für deine schnelle Antwort, super detailliert und verständlich :) Sollte ich dennoch Fragen haben, melde ich mich nochmal :P

      Viel Grüße

      1. Hello,

        Danke für deine schnelle Antwort, super detailliert und verständlich :) Sollte ich dennoch Fragen haben, melde ich mich nochmal :P

        in einem DBMS kann man dann auch einen Unique Kombinationsschlüssel über zwei normale Schlüsselspalten (A, B) definieren. Das ermöglicht dann später auch den direkten Zugriff über die beiden Fremdschlüssel auf die jeweiligen Userdatensätze.

        Die Eintragungsfunktion erspart dies aber für ungerichtete Verbindungen nicht. Dann muss diese immer noch die Schlüssel sortieren.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
    2. Hi!

      Die Funktion ordent zuerst die Schlüssel nach ihrer Größe, stellt sicher, dass es kein Selbstbezug wird und dann führt sie das Insert oder Update auf die Unique-indizierte Spalte durch.

      Was versprichst du dir von dieser Ordnung?

      1 -> 2
        1 -> 3
        2 -> 3

      Für den User 1 wäre das dann einfach. Seine Freunde stehen alle in der zweiten Spalte. Aber schon ab User 2 hat man seine Freunde in beiden Spalten und ihn in der jeweils anderen. Für alle weiteren kann das ebenso passieren.

      Wenn es hingegen keine impliziten Rückbezüge geben soll, braucht es auch keine Sortierung. Die wäre dann kontraproduktiv.

      Lo!

      1. Hello,

        Hi!

        Die Funktion ordent zuerst die Schlüssel nach ihrer Größe, stellt sicher, dass es kein Selbstbezug wird und dann führt sie das Insert oder Update auf die Unique-indizierte Spalte durch.

        Was versprichst du dir von dieser Ordnung?

        Dass die Zuordnungen

        1 -> 2
            2 -> 1

        nicht beide auftreten, sondern nur einmal. Mit "Ordnung der Schlüssel" sind also die beiden Fremdschlüssel gemeint, bevor daraus ein Kombinationsschlüssel gebildet wird, der dann per Unique Constraint überwacht wird.

        Es handelt sich bei der Zuordnung um einen Selbstbezug auf dieselbe Tabelle über eine Zwischentabelle. Und der OP möchte jede mögliche Verknüpfung nur einmal in der Zwischentabelle haben.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
  2. Hi!

    Hallo! Grüble, wie ich am sinnvollsten eine sog. User-Connection mit PHP und MySQL realisiere.
    Habe mir folgendes überlegt: ich erstelle eine Tabelle "Freunde" und lasse dann über das Adden beide Namen einfügen.
    Allerdings müsste ich dann verhindern, dass eine Verbindung zweimal besteht (User A - User B sowie nochmal umgedreht: User B und User A)... wie könnte ich das machen?

    Warum willst du das verhindern? Ich würde es mir als Nutzer verbitten wollen, dass andere mich einfach so zu ihrem Freund machen können und dann ohne mein Zutun in meiner Freundesliste auftauchen. Deshalb sehe ich es als sehr wohl sinnvoll an, dass A->B _und_ B->A unabhängig voneinander und nebeneinander existieren können. Und dann brauchst du einfach nur eine Zuordnungstabelle, die aus zwei Feldern User-A und User-B sowie einen Unique-Index über beide Spalten (nicht zwei einzelne!) besteht.

    Frezunde anzeigen ist ja einfach.. das lese ich schlichtweg nur aus. Achso, da hab ich doch ein Problem :D : Und zwar, wenn ich es auslese, muss ich verhindern, dass der eigene Username mitangezeigt wird, wie stelle ich das an?

    Wenn du verhinderst, dass der Anwender seine eigene Kennung zu seiner Liste hinzufügen kannst, ist das Problem schon nicht mehr existent. Alternativ kannst du es bei der Abfrage verhindern, indem du zur Bedingung machst, dass User-A ungleich User-B ist. Das musst du dann aber immer machen, auch wenn du nur mal die Freunde durchzählen willst. Jedoch ist das dann ein sinnloser Datensatz, der stets ignoriert werden müsste und somit gleich ganz wegbleiben kann und dann nicht dieser Art Probleme erzeugt.

    Wenn du allerdings einen Umkehrautomatismus, so wie von dir eigentlich vorgesehen, implementieren willst, so hast du noch ein paar mehr Probleme. Du musst dann zum einen Umkehrdatensätze verhindern und zum anderen beim Abfragen immer in beiden Spalten suchen. Die Spalte, die nicht der eigenen User-ID entspricht ist dann der Freund. Schließlich ist ja nicht sichergestellt, wer nun als A und wer als B auftaucht. Das hängt ja davon ab, wer den Freundeseintrag vorgenommen hat.

    Lo!

    1. Hello,

      Warum willst du das verhindern? Ich würde es mir als Nutzer verbitten wollen, dass andere mich einfach so zu ihrem Freund machen können und dann ohne mein Zutun in meiner Freundesliste auftauchen. Deshalb sehe ich es als sehr wohl sinnvoll an, dass A->B _und_ B->A unabhängig voneinander und nebeneinander existieren können.

      Dann warst Du noch nie bei Xing oder ähnlichen sozialen Netzwerken?

      Dort wird Freundschaft als etwas _zweiseitiges_ behandelt. Der Eine stellt den Antrag und der Andere muss dann zustimmen, bevor der Datensatz geschrieben wird. Es gibt dann genau eine Freundschaft zwischen den beiden Tupeln. Das mag zwar nicht der Realität entsprechen, aber in der Theorie wird es so gehandhabt ;-))

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de