2009-07-23 5 views
0

J'ai un réseau social similaire à myspace mais j'utilise PHP et mysql, je cherchais le meilleur moyen de montrer aux utilisateurs les bulletins affichés seulement fronm eux-mêmes et de les utilisateurs avec qui ils ont des amis confirmés.meilleur moyen d'avoir des amis actions pour un réseau social php/mysql

Cela implique 3 tables

friend_friend = Cette table stocke les enregistrements pour qui est qui est ami friend_bulletins = ce stocke les bulletins friend_reg_user = ceci est la table d'utilisateur principal avec toutes les données utilisateur comme le nom et la photo url

Je publierai le schéma de tableau de bulletin et d'ami ci-dessous, je signalerai seulement les champs importants pour la table d'utilisateur.

- Structure de table pour la table 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 ; 

- Structure de table pour la table 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 ; 

champs de table de friend_reg_user qui seront utilisés auto_id = ceci est l'utilisateur numéro d'identification disp_name = ceci est le nom d'utilisateur pic_url = ceci est un chemin d'image miniature

  • Les bulletins doivent montrer tous les bulletins publiés par un ID utilisateur qui est dans notre liste d'amis
  • devrait également montrer tous les bulletins que nous avons publié ourself
  • besoins à l'échelle bien, une table d'amis est plusieurs millions de lignes

// 1 ancienne méthode utilise un sous-sélection

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 

// une autre ancienne méthode que je sur les comptes qui avaient une petite quantité d'amis parce que cela o n'utilise une autre requête qui retourne une chaîne de tous les amis là-bas dans ce format str_friend_ids de $ = « 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 

Je sais que ce ne sont pas bonnes Je pense que cela obtient tout ce dont j'ai besoin, sauf qu'il doit être modifié pour obtenir également des bulletins postés par moi-même, quand je l'ajoute dans la partie où il OLE semble le casser et retourner des résultats multiples pour chaque bulletin affiché, je pense parce qu'il essaye de retourner les résultats que je suis un friedn de et puis j'essaye de me considérer un ami et cela ne marche pas bien .

Mon point principal de tout ce post est que je suis ouvert aux avis sur la meilleure façon de faire cette tâche, de nombreux grands réseaux sociaux ont une fonction similaire qui renvoie une liste d'articles publiés uniquement par vos amis. Il doit y avoir d'autres moyens plus rapides? Je continue à lire que JOINS ne sont pas génial pour la performance, mais comment puis-je faire cela?Gardez à l'esprit que je ne pas utiliser les index et un serveur de base de données dédié, mais mon userbase est grand il n'y a pas moyen de contourner ce

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 

Répondre

1

Tout d'abord, vous pouvez essayer de diviser la base de données afin que vous ne l'accès à une table avec les lignes primaires dont vous avez besoin. Déplacez les lignes qui sont moins souvent utilisées dans une autre table. Les JOINs peuvent avoir un impact sur les performances, mais d'après ce que j'ai pu voir, les sous-requêtes ne sont pas meilleures. Essayez de refactoriser votre requête afin de ne pas tirer toutes ces données à la fois. Il semble également qu'une partie de cette requête puisse être exécutée une fois ailleurs dans votre application, et que ces résultats soient stockés dans des variables ou mis en cache. Par exemple, vous pouvez mettre en cache un tableau d'amis connectés pour chaque utilisateur et simplement référencer cela lors de l'exécution de la requête, et mettre à jour le cache uniquement lorsqu'un nouvel ami est ajouté/supprimé. Cela dépend aussi de la structure de vos systèmes et de votre architecture de code - votre bouteille nneck peut ne pas être entièrement dans le DB.

+0

"vous pouvez mettre en cache un tableau d'amis qui sont connectés pour chaque utilisateur et simplement référencer cela lors de l'exécution de la requête, et mettre à jour le cache uniquement lorsqu'un nouvel ami est ajouté/supprimé." Je cherchais un moyen pratique de le faire Je suis ouvert à toutes les suggestions, 1 question comme je l'ai mentionné je pourrais mettre à jour ce cache quand j'ajoute un ami mais quand un autre utilisateur m'ajouterait ce serait plus difficile cela pourrait être travaillé autour je suis sûr. En ce qui concerne la mise en cache d'un groupe d'amis, je ne sais pas comment je pourrais le faire, certains utilisateurs ont jusqu'à 50 000 amis – JasonDavis

Questions connexes