2009-07-23 5 views
0

Ich habe ein soziales Netzwerk ähnlich wie myspace, aber ich benutze PHP und mysql, ich habe nach dem besten Weg, um Benutzer Bulletins gepostet nur von sich selbst und aus Benutzer, mit denen sie befreundet sind.besten Weg, um Freunde Aktionen für ein soziales Netzwerk zu bekommen php/mysql

Dies beinhaltet drei Tabellen

friend_friend = Diese Tabelle speichert Aufzeichnungen für die ist, die friend_bulletins Freund ist = Dies speichert die Bulletins friend_reg_user = Dies ist der Hauptbenutzertabelle mit allen Benutzerdaten wie Name und Foto-URL

Ich werde Bulletin und Freund Tabelle Tabelle unten veröffentlichen, werde ich nur die Felder für die Tabelle Benutzer wichtig.

- Tabellenstruktur für Tabelle friend_bulletin

CREATE TABLE IF NOT EXISTS `friend_bulletin` (
    `auto_id` int(11) NOT NULL AUTO_INCREMENT, 
    `user_id` int(10) NOT NULL DEFAULT '0', 
    `bulletin` text NOT NULL, 
    `subject` varchar(255) NOT NULL DEFAULT '', 
    `color` varchar(6) NOT NULL DEFAULT '000000', 
    `submit_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `status` enum('Active','In Active') NOT NULL DEFAULT 'Active', 
    `spam` enum('0','1') NOT NULL DEFAULT '1', 
    PRIMARY KEY (`auto_id`), 
    KEY `user_id` (`user_id`), 
    KEY `submit_date` (`submit_date`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=245144 ; 

- Tabellenstruktur für Tabelle friend_friend

CREATE TABLE IF NOT EXISTS `friend_friend` (
    `autoid` int(11) NOT NULL AUTO_INCREMENT, 
    `userid` int(10) DEFAULT NULL, 
    `friendid` int(10) DEFAULT NULL, 
    `status` enum('1','0','3') NOT NULL DEFAULT '0', 
    `submit_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `alert_message` enum('yes','no') NOT NULL DEFAULT 'yes', 
    PRIMARY KEY (`autoid`), 
    KEY `userid` (`userid`), 
    KEY `friendid` (`friendid`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2657259 ; 

friend_reg_user Tabellenfelder, die auto_id verwendet werden = Dies ist die Benutzer-ID-Nummer disp_name = Dies ist der Benutzername pic_url = Dies ist ein Vorschaubild Pfad

  • Bulletins sollten alle Bulletins von einer Benutzer-ID veröffentlicht zeigen, dass in unserer Freundesliste ist
  • auch alle Bulletins sollte zeigen, dass wir uns selbst
  • Bedürfnisse geschrieben gut skalieren, ist Freunde Tabelle mehrere Millionen Zeilen

// 1 alt-Methode verwendet eine subselect

SELECT auto_id, user_id, bulletin, subject, color, fb.submit_date, spam 
FROM friend_bulletin AS fb 
WHERE (user_id IN (SELECT userid FROM friend_friend WHERE friendid = $MY_ID AND status =1) OR user_id = $MY_ID) 
ORDER BY auto_id 

// eine andere alte Methode, die ich auf Konten verwendet, die aufgrund dieser o eine kleine Menge Freunde hatten ne verwendet eine andere Abfrage , die eine Zeichenfolge aller dort Freunde in diesem Format $ str_friend_ids zurückkehren würde = „1,2,3,4,5,6,7,8“

select auto_id,subject,submit_date,user_id,color,spam 
from friend_bulletin 
where user_id=$MY_ID or user_id in ($str_friend_ids) 
order by auto_id DESC 

Ich weiß, das ist nicht gut für die Leistung als meine Website wird wirklich groß, so experimentiere ich mit JOINS

Ich glaube, das bekommt alles, was ich brauche, außer es geändert werden muss, um auch Bulletins von mir gepostet bekommen, wenn ich das in den WHERE Teil es hinzufügen scheint es zu brechen und mehrere Ergebnisse für jedes veröffentlichte Bulletin zurückgeben, denke ich, weil es versucht, Ergebnisse zurückgeben, die ich ein fornn bin und dann versuche ich mich selbst einen Freund zu betrachten und das funktioniert nicht gut .

Mein Hauptpunkt dieser ganzen Post ist, aber ich bin offen für Meinungen über die beste Leistung, um diese Aufgabe zu tun, viele große soziale Netzwerke haben ähnliche Funktion, die eine Liste der Artikel nur von Ihren Freunden veröffentlicht. Es muss noch schnellere Wege geben ???? Ich lese immer wieder, dass JOINS nicht gut für die Performance sind, aber wie kann ich das sonst noch machen?Denken Sie daran, ich Indizes verwenden und haben einen dedizierten Datenbankserver, aber mein totzukriegen ist groß gibt es keine Möglichkeit um diese

SELECT fb.auto_id, fb.user_id, fb.bulletin, fb.subject, fb.color, fb.submit_date, fru.disp_name, fru.pic_url 
FROM friend_bulletin AS fb 
LEFT JOIN friend_friend AS ff ON fb.user_id = ff.userid 
LEFT JOIN friend_reg_user AS fru ON fb.user_id = fru.auto_id 
WHERE (
ff.friendid =1 
AND ff.status =1 
) 
LIMIT 0 , 30 

Antwort

1

Zunächst einmal können Sie versuchen, die Datenbank zu partitionieren, so dass Sie nur zuzugreifst eine Tabelle mit den primären Zeilen, die Sie benötigen. Verschieben Sie weniger häufig verwendete Zeilen in eine andere Tabelle.

JOINs können die Leistung beeinträchtigen, aber von dem, was ich gesehen habe, sind Unterabfragen nicht besser. Versuchen Sie, Ihre Abfrage neu zu strukturieren, damit Sie nicht alle diese Daten gleichzeitig abrufen können. Es scheint auch so, als könnten einige dieser Abfragen an anderer Stelle in Ihrer App ausgeführt werden und diese Ergebnisse entweder in Variablen gespeichert oder zwischengespeichert werden.

Zum Beispiel können Sie ein Array von Freunden zwischenspeichern, die für jeden Benutzer verbunden sind und nur darauf verweisen, wenn Sie die Abfrage ausführen, und nur den Cache aktualisieren, wenn ein neuer Freund hinzugefügt/entfernt wird.

Es hängt auch von der Struktur Ihrer Systeme und Ihrer Codearchitektur ab - Ihr Flaschenneck befindet sich möglicherweise nicht vollständig in der Datenbank.

+0

"Sie können ein Array von Freunden zwischenspeichern, die für jeden Benutzer verbunden sind und nur darauf verweisen, wenn Sie die Abfrage ausführen, und den Cache nur aktualisieren, wenn ein neuer Freund hinzugefügt/entfernt wird." Ich habe tatsächlich nach einer praktischen Möglichkeit gesucht, dies zu tun Ich bin offen für irgendwelche Vorschläge, 1 Problem, wie Sie erwähnt, ich könnte diesen Cache aktualisieren, wenn ich einen Freund hinzufügen, aber wenn ein anderer Benutzer mich hinzufügt, wäre es schwieriger, aber zu tun das könnte man umgehen, da bin ich mir sicher. Was das Speichern einer Reihe von Freunden angeht, bin ich mir nicht sicher, wie ich das machen könnte. Einige Benutzer haben mehr als 50.000 Freunde – JasonDavis

Verwandte Themen