[Liste d'amis] Créer des liens entre membres

Fermé
JooS Messages postés 2465 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 8 juin 2016 - Modifié par JooS le 27/06/2011 à 17:56
JooS Messages postés 2465 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 8 juin 2016 - 29 juin 2011 à 21:10
Bonjour,

Genre une liste d'amis, comme sur "Facebook" ou "Le Site du zero", j'ai pas trouver l'astuce pour créer des liens entre les membres ...

Pour ceux qui ne connaissent pas facebook :p ..
Exemple : A envoi une invitation a B, lorsque B accepte, ils deviennent alors amis, Z envoi une invitation a R et a A (ou d'autre), quand ces derniers acceptent, ils deviennent alors les amis de Z ... etc

Merci ...

A voir également:

4 réponses

Meoran Messages postés 1562 Date d'inscription vendredi 28 août 2009 Statut Membre Dernière intervention 8 avril 2015 203
Modifié par Meoran le 29/06/2011 à 00:28
J'ai fait un test pour prouver que le nombre de couple d'amis est sans importance, le résultat est toujours donné très rapidement !

J'ai pour cela une table qui contient des couples d'iduser, indiquant ainsi des couples d'amis.

Ex : Le couple 404 <-> 1356 indique que 404 et 1356 sont amis.

Ce couple est bien évidemment unique et de cette façon le couple 1356 <-> 404 ne peut pas exister vu qu'il indique la même chose que le couple du dessus.

J'ai créé ainsi 100 000 couples liant 3000 users entre eux. Soit une moyenne de 33,33... amis par user.
1
Meoran Messages postés 1562 Date d'inscription vendredi 28 août 2009 Statut Membre Dernière intervention 8 avril 2015 203
Modifié par Meoran le 29/06/2011 à 00:46
Tout d'abord le code de création des 100 000 couples. A mis environ 5 minutes sur mon PC à s'exécuter.

<?php 
  
 $i = 0; 
 $tab = array(); 
  
 $bd->connexion(); 
 while ($i < 100000) { 
  $rand = mt_rand(1,3000); 
  $rand2 = mt_rand(1,3000); 
   
  if ($rand != $rand2) { 
   if (!isset($tab[$rand][$rand2]) AND !isset($tab[$rand2][$rand])) { 
    $tab[$rand][$rand2] = true; 
    $tab[$rand2][$rand] = true; 
     
    $Requete = ('INSERT INTO tabletest (iduser1, iduser2) values ('.$rand.' , '.$rand2.');'); 

    $Result = $bd->getConnexion()->query($Requete);  

    $i++; 
   } 
  } 
 } 
 $bd->deconnexion(); 
 echo "Fini avec succès !"; 
0
Meoran Messages postés 1562 Date d'inscription vendredi 28 août 2009 Statut Membre Dernière intervention 8 avril 2015 203
Modifié par Meoran le 29/06/2011 à 00:46
Ensuite le code de test de performance proprement dit :

Je sélectionne, pour 100 users choisit aléatoirement, leurs amis respectifs.

Ce qui donne, pour chaque user une requete du type :

select * from table where iduser1 = 100 OR iduser2 = 100;

Je stocke le temps d"exécution de la requête, puis je fais la moyenne de ces temps d'exécution pour les 100 users.

D'abord le code :
<?php

 $moyenne = 0; 
 for ($i=0; $i < 100; $i++) { 
   
  $rand = mt_rand(1,3000); 
   
  $debut = microtime(true); 
  $bd->connexion(); 
   $Requete = ('select * from tabletest where iduser1 = '.$rand.' OR iduser2 = '.$rand.';'); 

   try { 
   $Result = null; 
   $Result = $bd->getConnexion()->query($Requete);  
   } catch (PDOException $e){ 
    echo $e->getMessage(); 
   } 
  $bd->deconnexion(); 
  $fin = microtime(true); 
  $temps = $fin - $debut; 
  $moyenne = (($moyenne*$i)+$temps)/($i+1); 
   
  echo 'Recherche n° : '.($i+1)."<br/>"; 
  echo 'User cherché : '.$rand."<br/>"; 
  echo 'Temps d\'exécution : '.$temps."<br/>"; 
  echo "Moyenne actuelle : ".round($moyenne,4)."<br/><br/>";   
 } 
 echo "Moyenne final : ".round($moyenne,4); 

?>


Bilan : La moyenne approche de 0.05 s. Autant dire rien du tout :/

Alors même si tu passes à 200 000 couples d'amis, ou 6000 amis ou 100 amis de moyenne pour chaque user, ce temps restera toujours risiblement faible...
0
JooS Messages postés 2465 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 8 juin 2016 228
Modifié par JooS le 29/06/2011 à 15:36
Salut ...
Comment est ce que tu peut être sure que les couples sont uniques, tu n'a même pas fait de teste pour éviter les doublons !!!

Quant a la dernière requête, ben essaye avec 500 000 couples pour voir ?!!!

Un site dont le nombre de membre est 10 000, et ou en moyenne chaque membre ait 1000 amis ... contiendra (si mes calculs sont juste) en final 9 990 000 de couples ... donc c'est beaucoup pour un simple affichage ...
0
Meoran Messages postés 1562 Date d'inscription vendredi 28 août 2009 Statut Membre Dernière intervention 8 avril 2015 203
Modifié par Meoran le 29/06/2011 à 10:15
Bien sur que si je vérifie les doublons. Regarde le code... Et pour être absolument sur et certain, j'ai même des contraintes d'unicité de couple sur ma table.

Je te fait cet après midi, une simulation avec 50 000 utilisateurs et 130 amis en moyenne par personne, qui est la moyenne sur facebook. Soit 6 500 000 lignes.

Et je suis déjà certain du résultat...
0
Meoran Messages postés 1562 Date d'inscription vendredi 28 août 2009 Statut Membre Dernière intervention 8 avril 2015 203
Modifié par Meoran le 29/06/2011 à 15:52
Bilan après 5603 secondes de temps d'exécution du script d'insertion (soit 1h38), je reteste même chose sur 100 users à rechercher.

Moyenne : 1,80 s par recherche.

Franchement, ça reste plus que correct (ça commence déjà à être de la bd de fou), surtout que par exemple tu n'as qu'à faire cette recherche une fois à la connexion de chaque user et placé le résultat dans une variable de session...

Et j'attends avec impatience le jour où ton site atteindra 50 000 utilisateurs.
0
CrazyWorld Messages postés 326 Date d'inscription samedi 8 novembre 2008 Statut Membre Dernière intervention 16 février 2013 41
27 juin 2011 à 18:57
Salut, je ferai une table listedamis
avec basiquement 3 champs
-Expediteur de la demande d' amis
-Destinataire de la demande
-Comfirmé (pour savoir si le destinataire a accepté ou pas)

Disons que tu as que 2 membres A et B
A fait une demande d' amis à B
B recoit l' invitation et l' accepte. En cliquant sur Accepter l' invitation, tu en profites pour passer la valeur "Yes" au champ Comfirmé.

Ensuite pour afficher la liste sur un profil
Tu récupères le pseudo du profil que tu visites
Si par exemple A va sur le profil de B, tu récupères le pseudo de B($B)

Et là tu lances une requete du style.
Select * from listedamis where Expediteur == B OR Destinataire == B
tu récupéres les variables Expediteur et Destinataire
Et tu fais juste une petite condition
if ($expediteur==$B){$amis="$destinataire";}
if ($destinataire==$B){$amis="$expediteur";}

Voilà le schema que je ferai. C est juste pour te donner une idée
Si tu comprends le principe, tu deverais pouvoir coder tout ca.
0
JooS Messages postés 2465 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 8 juin 2016 228
Modifié par JooS le 27/06/2011 à 19:53
C'est bien tout cela ...
mais disons que A a 100 amis, ou est stocké cette liste d'amis ... ??

Edit : Ah c'est bon, j'ai saisi ... C'est une idée ... Merci
0
JooS Messages postés 2465 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 8 juin 2016 228
Modifié par JooS le 27/06/2011 à 19:57
Mais je pense pas que ça soit pratique, imaginons que la table listeamis contient plus de 100000 entrés, donc a chaque fois que que je voudrai afficher une liste d'amis, il faudrait que je parcours les 100 000 entrés !!!, ...

Il existe surement une astuce pour éviter cela ...
0
CrazyWorld Messages postés 326 Date d'inscription samedi 8 novembre 2008 Statut Membre Dernière intervention 16 février 2013 41
27 juin 2011 à 20:43
Je pense pas qu' on puisse faire plus optimisé surtout si tu comptes avoir des listes d' amis de fou
0
CrazyWorld Messages postés 326 Date d'inscription samedi 8 novembre 2008 Statut Membre Dernière intervention 16 février 2013 41
27 juin 2011 à 20:20
Dans ta table utilisateur, tu rajoutes un champ "amis"
Et à chaque fois qu' une demande d' amis est acceptée,
Tu fais une mise à jour du champ "amis" en ajoutant le pseudo avec un symbole de séparation une virgule par exemple
de telle manière à donner à la longue pour l'utilisateur B
dans le champ "amis"
A, C, D, E, F, G,

Et dans le profil tu récupères cette liste et tu la traites avec des fonctions explode()
et/ou preg_replace()
-1
JooS Messages postés 2465 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 8 juin 2016 228
27 juin 2011 à 20:36
C'est ce que j'avais fait, mais je voulais pas aller plus loin parce que je pensais que c'était faux, et qu'il y avait une technique meilleure ...
0
Meoran Messages postés 1562 Date d'inscription vendredi 28 août 2009 Statut Membre Dernière intervention 8 avril 2015 203
28 juin 2011 à 17:17
C'est pas beau du tout ça :/
0
JooS Messages postés 2465 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 8 juin 2016 228
28 juin 2011 à 21:03
@Meoran ben éclaire nous si t'as mieux ?!
0