Ankündigung

Einklappen
Keine Ankündigung bisher.

Strucktur Frage bei MySQL

Einklappen

Neue Werbung 2019

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

  • Strucktur Frage bei MySQL

    Hallo ihr lieben,

    ich habe mal eine kleine bescheidene Frage, und zwar...

    Ihr kennt ja sicherlich das Prinzip, z.b. bei Schülervz, das man einen anderen regestrierten Benutzer als Freund hinzufügen kann.

    Das was ich bisher habe:

    Eine Tabelle wo alle User mit Logindaten und Profildaten gespeichert sind.

    Und nun will ich z.B. das User1 den User2 als Freund einläd. Der eingeladene User soll dieses bestätigen und dann sollen die Freunde der User in einer Liste angezeigt werden.

    Ich habe aber keine Ahnung wie ich die Strucktur über sql aufbauen soll, und wie die freundeverbindungen gespeichert werden sollen.

  • #2
    Dafür würde ich 1-2 weitere Tabellen veranschlagen. Das einfachste wäre du bastelst dir eine Tabelle in der eben diese Kombinationen gespeichert werden. Dafür brauchst du eigentlich 3 Spalten
    user_id_1, user_id_2 und "active".

    Angenommen ich (user_id 5) stelle dir (user_id 9) ein Freundschaftsangebot. Dann speicherst du das so ab:
    Code:
    user_id_1 = 5
    user_id_2 = 9
    active = 0
    So jetzt loggst du dich in dein Profil, jetzt liest du alle neuen Freundschaftsanfrangen aus
    Code:
    SELECT ... WHERE user_id_2 = $deine_id AND active = 0
    Wenn du jetzt bestätigst wird einfach das active auf 1 gesetzt.

    Um jetzt alle Freunde auszulesen könntest du dir sowas basteln.

    Code:
    SELECT * 
    FROM tabelle 
    WHERE (user_id_1 = $deine_id OR user_id_2 = $deine_id)
          AND active = 1
    Du liest also alle Datensätze wo du entweder bei user_id_1 oder bei user_id_2 drinnen stehst. Also zum einen alle Freunde denen DU eine Freundschaftsanfrage gestellt hast und die die dir eine gestellt haben.

    Soar dein PHP Code könnte dann so aussehen:

    PHP-Code:
    $query mysql_query("des von oben halt");
    $friend_ids = array();
    while (
    $row mysql_fetch_assoc($query)) {
        if (
    $row['user_id_1'] == $deine_id$friend_ids[] = $row['user_id_2'];
        else 
    $friend_ids[] = $row['user_id_1'];

    So hier gehst du dann alle Datensätze durch, dann musst du eben unterscheiden ob du bei user_id_1 oder 2 stehst und die andere ID ist dann ein Freund von dir.

    Kommentar


    • #3
      ahh, jetzt hats gefunkt, prima, danke dir =)

      Kommentar


      • #4
        Oder Du benutzt nur zwei Felder und hast dafür zwei Datensätze pro A<->B, einmal A->B und B->A
        Damit ersparst Du Dir an einigen Stellen Bedingungen der Art WHERE user_id_1=99 OR user_id_2=99

        Kommentar


        • #5
          Diese Frage gab hier schon mehrfach. Bitte benutze die Forensuche!

          Kommentar


          • #6
            Zitat von David Beitrag anzeigen
            Oder Du benutzt nur zwei Felder und hast dafür zwei Datensätze pro A<->B, einmal A->B und B->A
            Damit ersparst Du Dir an einigen Stellen Bedingungen der Art WHERE user_id_1=99 OR user_id_2=99
            Dem einmalige Programmieraufwand willst du wirklich der doppelten Speicherung aller Daten nach hinten stellen? Stell dir vor du hast 10 000 User und jeder hat im Schnitt 100 Freunde ... Da macht ein Faktor von 2 mal extrem viel aus!

            Kommentar


            • #7
              Zitat von Flor1an Beitrag anzeigen
              Dem einmalige Programmieraufwand willst du wirklich der doppelten Speicherung aller Daten nach hinten stellen?
              Nein, der Suchperformance und den Datenbankmöglichkeiten. Ausserdem: Nach der Rechnung Faktor 4/3 Und wie das nach dem Anlegen der Indices aussieht ...weißt Du es?

              Kommentar


              • #8
                Faktor 4/3? Wenn du jeden Datensatz doppelt speicherst hast du nach dem Beispiel halt 2 * 10000 * 100 ... Naja du könntest natürlich auch eine Ordnung auf den User_ids halten und es immer im Format user_id_1 < user_id_2 abspeichern.

                Kommentar


                • #9
                  Zitat von Flor1an Beitrag anzeigen
                  Faktor 4/3? Wenn du jeden Datensatz doppelt speicherst hast du nach dem Beispiel halt 2 *
                  Dein Ansatz 3 Felder, mein Ansatz 2*2 Felder -> 4/3

                  Kommentar


                  • #10
                    Wie bildet man mit 2 Feldern den Zustand 'angefragt, aber noch nicht aktiv' ab?

                    Kommentar


                    • #11
                      Indem es nur einen statt beiden Datensätzen gibt.
                      Wenn Du so willst "A ist zwar ein Freund von B, aber B (noch) kein Freund von A"

                      edit: Vermutlich würde ich genau diesen Sachverhalt aber gar nicht in dieser Tabellle abbilden sondern über einen anderen Mechanismus lösen. Ereignissliste, Aufgabenliste, PrivMessage, ...

                      Kommentar

                      Lädt...
                      X