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
"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