Relations - Réseau d'amis

Résolu/Fermé
JooS Messages postés 2465 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 8 juin 2016 - 10 août 2012 à 13:06
JooS Messages postés 2465 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 8 juin 2016 - 10 août 2012 à 18:20
Bonjour,
Voila, je voulais créer un genre de petit réseau social, et je voulais avoir votre avis en ce qui concerne un détails du MCD ...

Or, pour dire que tel utilisateur est ami avec tel utilisateur ...
1 - On crée une table qui contiendra l'id des deux utilisateurs.
Ou ..
2 - On ajoute un champs dans la table des utilisateurs, et pour chaque utilisateur on y mets l'id de ses amis séparé par des virgules.

La première solution est plus juste a mon avis, vu qu'elle est en 3eme forme normale, mais peut dépasser les 1 millions (voir plus) de tuples.

Donc quoi choisir, y a t'il d'autres solutions possibles, quelle est la meilleur méthode en ce qui concerne la performance lors des recherches, car on aura tout le temps besoin de savoir qui est ami avec qui.

Merci.

1 réponse

blux Messages postés 25976 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 18 avril 2024 3 287
10 août 2012 à 15:06
Salut,

ta deuxième solution impose un balayage exhaustif de toute la table combiné à une analyse de la chaine qui contient les id lorsque l'on veut savoir qui est ami avec qui, c'est très lourd.

La première solution permet de ne lire que les lignes que l'on cherche (grâce aux index que tu ne manqueras pas de mettre). C'est d'ailleurs pour ça que c'est une forme normale.

Le nombre de tuple importe peu dans une base...
0
JooS Messages postés 2465 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 8 juin 2016 228
10 août 2012 à 17:54
Comment ça un balayage ?!

On aura un accès direct a la liste d'amis, par exemple, lorsque l'utilisateur se connecte, on mets directement ses infos ainsi que le contenu du champs "friends" dans une variable de SESSION ...

Et a chaque fois qu'on aura besoin de vérifier si un utilisateur est ami avec un autre, il suffit d'accéder a la SESSION directement, ...
A chaque fois qu'il y'aura une mise a jour (ajout ou suppression d'amis), on mettra a jour les variable globales.

Exemple : 2,5484,624,7541,954
Signifiera que les utilisateurs dont l'id est 2, 5484, 624, 7541, 954 sont amis avec l'utilisateur en cours ...

C'est tirer par les cheveux, mais je pense que c'est plus performant que de parcourir toute la table, surtout si la table est surchargé, parce que 10 millions de tuples, ça affecte quand même le temps d'exécution ...
0
blux Messages postés 25976 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 18 avril 2024 3 287
10 août 2012 à 18:04
Comment ça un balayage ?!
mea culpa, j'ai mal lu la question de départ.

Il n'en demeure pas moins que tu vas vite voir les limites de traitement des chaines comportant des milliers de caractères : lenteur de traitement et surtout lenteur de mise à jour...
Car lorsque tu vas augmenter la taille de la chaine d'amis, ton SGBD va devoir trouver un nouvel emplacement pour la stocker et supprimer l'ancienne, avec toute la gestion d'espace à faire.
Le plus simple est quand même de laisser les mises à jour (création/suppression) de tuples par le SGBD, il est optimisé pour...
0
JooS Messages postés 2465 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 8 juin 2016 228
10 août 2012 à 18:20
Ok alors, va pour la premiere solution !

Merci :) !
0