beste Weg, um Freunde zu Aktionen für ein Soziales Netzwerk, php/mysql

Habe ich ein social network ähnlich myspace, aber ich verwende PHP und mysql bin ich auf der Suche nach dem besten Weg, um dem Nutzer zu zeigen bulletins veröffentlicht nur
fronm sich selbst und von den Benutzern, Sie wurden Freunde mit.

Diese beinhaltet 3 Tabellen

friend_friend = diese Tabelle speichert die Datensätze für "wer ist wer" Freund
friend_bulletins = diese speichert die bulletins
friend_reg_user = dies ist die Haupt-user-Tabelle mit allen user-Daten wie name und Foto-url

Ich werde bulletin und die Freund-Tabelle Schema unten, ich werde nur nach die Felder wichtig für die user-Tabelle.

-- 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 Felder der Tabelle verwendet werden
auto_id = dies ist die Benutzer-ID-Nummer
disp_name = das ist der user name
pic_url = dies ist ein thumbnail-image-Pfad

  • Bulletins sollen zeigen alle bulletins veröffentlicht, die durch eine Benutzer-ID ist in unserer Freundesliste
  • sollte auch zeigen alle bulletins, die wir selbst geschrieben
  • muss gut skalieren, Freunde Tabelle ist mehrere Millionen Zeilen

//1 Alte Methode verwendet eine Unterauswahl

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, die hatte eine kleine Menge von Freunden, weil diese verwendet eine andere Abfrage
das würde einen string zurückgeben, alle Freunde in diesem format $str_friend_ids = "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ß, diese sind nicht gut für die performance meiner site wird langsam richtig groß, so habe ich experimentiert mit JOINS

Ich glaube, das wird dann alles was ich brauche, außer es muss geändert werden, um auch bekommen bulletins gepostet von mir, wenn ich hinzufügen, dass in dem Teil, WO es scheint, um Sie zu brechen und die mehrere Ergebnisse zurückgeben für jede bulletin gepostet, ich denke, weil es versucht, zu
die Ergebnisse zurückgeben, dass ich ein friedn, und dann versuche ich, halte mich für einen Freund und das funktioniert nicht gut.

Mein Hauptpunkt dieser ganze post ist aber ich bin offen für Meinungen über die beste performance Weg, das zu tun diese Aufgabe, viele große soziale Netzwerke haben ähnliche Funktionen, die eine Liste der Gegenstände gepostet, die nur von Ihren Freunden. Gibt es andere schnellere Möglichkeiten???? Immer wieder lese ich, dass die VERKNÜPFUNGEN sind nicht gut für die Leistung, aber wie kann ich sonst noch tun? Halten Sie im Verstand ich tun, verwenden Sie Indizes, und haben einen dedizierten Datenbank-server, aber mein userbase ist groß es gibt keinen Weg darum herum, dass

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
InformationsquelleAutor JasonDavis | 2009-07-23
Schreibe einen Kommentar