Freundesliste

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

  • Freundesliste

    Hallo,

    möchte gerade eine Freundesliste erstellen, und zwar von den Freunden, die online sind. Jetzt ist mir aber der Aufbau wichtig und eure Meinung dazu, ob mein Gedanke bzgl. meiner Datenbankstruktur sinnvoll ist:

    Ich habe eine Tabelle 'users', wo alle Benutzer gespeichert werden und die Spalte 'session' angibt, ob der Benutzer online (1) oder offline (0) ist.

    Dann habe ich noch die Tabelle 'friends', wo die Spalte 'uid' angibt welcher Benutzer von welchem anderen Benutzer (Spalte 'rid') der Freund ist.

    Jetzt möchte ich aber nur anzeigen lassen, welcher Freund gerade vom eingeloggten Benutzer, also mir z.B. ($SESSION_['user_id']), online ist.

    Meine Überlegung ist: Daten per while-Schleife von 'friends' holen, dann weitere while-Schleife in der ersten Schleife, wo Benutzer gewählt werden, wo 'session' ungleich 0 ist und diese ausgegeben werden.

    Was für vernünftige Möglichkeiten gibt es eventuell zusätzlich, um dies zu realisieren oder ist die Überlegung so in Ordnung? Und ist die Datenbankstruktur bisher sinngemäß/effizient?

    LG

  • #2
    sieht eher nach brainstorming aus. daher * verschieb *

    peter
    Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
    Meine Seite

    Kommentar


    • #3
      Also, ich hab das nun wie folgt gemacht:

      PHP-Code:
          $result mysql_query("SELECT rid FROM friends WHERE uid='".$_SESSION['user_id']."'"); # Daten holen
          
      while ($friend mysql_fetch_array ($result)){
          
          
      $totalfriends 
      mysql_fetch_array(mysql_query("SELECT COUNT(id) FROM users WHERE id='$friend[rid]' AND session!='0'"));
          
          
      $i=1;
          
      $result2 mysql_query("SELECT username FROM users WHERE id='$friend[rid]' AND session!='0'"); # Daten holen
          
      while ($user mysql_fetch_array ($result2)){
           
           echo 
      "<tr><td height='16' align='center'>
           <table width='129' border='0' cellspacing='0' cellpadding='0'>
           <tr><td height='7'></td></tr>
           <tr><td class='orange' height='18'>
      $user[username]</td></tr>
           <tr><td valign='top' height='20'><div align='right'>"
      ;
           if (
      $i == "$totalfriends[0]") { echo "<span class='small_10px'>$i online</span>"; }
           echo 
      "</div></td></tr></table>
           </td></tr>"
      ;
           
           
      $i++; } 
      Klappt auch prima, jedoch immer noch meine Frage, ob dies "gut" realisiert ist oder man irgendwelche Einsparungen machen oder etwas anderes beachten sollte? Mir geht es darum, dass ich das ganze auch "vernünftig" mache, falls verstanden wird, was ich damit meine...
      Zuletzt geändert von vayio; 31.10.2008, 18:41.

      Kommentar


      • #4
        Du möchtest dich über JOINs informieren.
        Ansonsten sehe ich da spontan nichts verwerfliches dran. (Außer, dass du ggf. irgendwann in die Bredouille kommen wirst, dass die write-Last auf deine users-Tabelle zu groß wird wegen der Aktualisierung der session-Spalte... aber um das Problem kann man sich dann kümmern~)

        Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

        bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
        Wie man Fragen richtig stellt

        Kommentar


        • #5
          Alles klar, mit Joins kenne ich mich bisher nicht wirklich aus, danke!

          Was genau meinst du damit? Dass die session-Spalte an sich nicht sehr sinnvoll ist und ich über andere Methoden nachdenken sollte, um zu prüfen, wer online ist oder was genau?

          Dankeschön!

          Kommentar


          • #6
            Original geschrieben von vayio
            Was genau meinst du damit? Dass die session-Spalte an sich nicht sehr sinnvoll ist und ich über andere Methoden nachdenken sollte, um zu prüfen, wer online ist oder was genau?
            Nein, ich meine damit, dass die Write-Last auf deine Users-Tabelle durch die dauernde Aktualisierung eventuell zum Problem wird für die lesenden Prozesse.
            Solange du aber in das Problem nicht läufst, sehe ich da wenig Sinn dir jetzt die Grundlagen von konkurrierenden Systemen zu erklären...

            Wo setzt du denn die Session-Spalte wieder auf 0?

            Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

            bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
            Wie man Fragen richtig stellt

            Kommentar


            • #7
              Du meinst, diese Abfrage bei jedem Seitenklick, die anzeigt, wer gerade online ist? Oder hab ich das missverstanden? Wann würde ich denn in dieses Problem laufen?

              Die Session-Spalte wird auf 0 gesetzt, sobald sich ein Benutzer ausloggt oder mehr als 15min der letzten Aktivität vergangen sind. Und das geschieht auch bei jedem Seitenaufruf in dieser Prüfungsform: Wenn Session gesetzt = online = Session-Spalte auf 1, sonst 0. Gibt es denn sonst Alternativen?

              Kommentar


              • #8
                Brich mal bitte deine beiden langen Code-Zeilen um. Mich regt es auf, dass hier ein horizontaler-Scrollbalken ist.

                Original geschrieben von vayio
                Du meinst, diese Abfrage bei jedem Seitenklick, die anzeigt, wer gerade online ist? Oder hab ich das missverstanden? Wann würde ich denn in dieses Problem laufen?
                Ich sagte Write, nicht Read-Last.
                Wenn 500 Benutzer gleichzeitig eine Website aufrufen, wird 500 Mal in der users-Tabelle upgedated, dabei können (ggf.? ich würde sogar ohne sagen) keine konkurrierenden SELECT-Statements ausgeführt werden, weil MyISAM mit Table-Lock arbeitet.
                Die Performance deines DB-Servers kannst du dir an einem Finger abzählen.

                Die Session-Spalte wird auf 0 gesetzt, sobald sich ein Benutzer ausloggt oder mehr als 15min der letzten Aktivität vergangen sind. Und das geschieht auch bei jedem Seitenaufruf in dieser Prüfungsform: Wenn Session gesetzt = online = Session-Spalte auf 1, sonst 0. Gibt es denn sonst Alternativen?
                Also praktisch ein Select über alle Einträge in der users-Tabelle wo session = 1 und für jeden ein Select auf die Session-Tabelle?



                Also zur Vermeidung der write-Last kannst du das aktuelle Datum beim Setzen von session = 1 mit speichern. Und dann das ganze irgendwie so einpacken
                PHP-Code:
                <?php
                $result 
                sql_fetch_assoc(sql_query("SELECT COUNT(*) from users where
                 user_id = 
                $current AND session = 0 AND session_date < NOW() - INTERVAL 3 MINUTE"));
                if (
                $result["count"] > 0) {
                  
                sql_query("update session = 1, session_date = NOW() where user_id = $current");
                }
                Ansonsten würde sich auch noch eine SHM (Shared Memory)-Variante anbieten.

                Tendenziell würde ich die Session-Spalte(n) aus der users-Tabelle raus nehmen.
                Das ist ein großes Gewicht für die Tabelle.

                Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                Wie man Fragen richtig stellt

                Kommentar

                Lädt...
                X