Bonjour,
Je cherche à faire un système d'amis comme avec Facebook (et non Twitter).
Cependant, je ne trouve pas la solution idéale.
J'ai le choix entre 2 solutions qui ne me conviennent pas énormement:
C'est une table avec 2 colonnes, user_1
et user_2
. Deux membres sont amis si une même ligne (ou enregistrement) contient l'id d'un membre et l'autre contient l'id de l'autre membre.
Le problème de cette solution réside dans la requête. En effet, pour chercher les amis d'un personne ou simplement pour savoir si une personne est ami avec une autre, je suis obligé de faire une requête très lourde.
# Pour savoir si deux personnes sont amis
SELECT * FROM Contact WHERE (user_1 = :ami1 AND user_2 = :ami2) OR (user_1 = :ami2 AND user_2 = :ami1)
# Pour chercher tous les amis d'un membre
SELECT * FROM Contact
JOIN user ON (user_1 = :user AND user_2 = user.id) OR (user_1 = user.id AND user_2 = :user)
WHERE user_1 = :user OR user_2 = :ami1
2ème solution
C'est toujours une table avec 2 colonnes, membre
et ami
. Là, la requête est plus simple:
# Pour savoir si deux personnes sont amis
SELECT * FROM Contact WHERE membre = :user AND ami = :ami
# Pour chercher tous les amis d'un membre
SELECT ami FROM Contact WHERE membre = :user
Cependant, cette solution nécessite 2 lignes. Une pour un des deux mais, l'autre pour l'autre ami.
Avez-vous d'autres solutions? Sinon quelle solution vous parait la mieux?
Merci
Hello,
Instinctivement j'aurais choisis la solution avec une table de liaison.
Donc tu as ta table users qui contient des utilisateurs.
Ainsi qu'une table user_friends qui contient deux colonnes, une user_id et l'autre friend_id.
C'est la solution la plus propre qui me vient a l'esprit.