Vue d'ensembleQuelle est la meilleure façon de stocker la liste d'amis Facebook d'un utilisateur dans ma base de données?
Je crée un site Web Ruby on Rails qui utilise Facebook pour vous connecter.
Pour chaque utilisateur, j'ai une entrée de base de données qui stocke son ID utilisateur Facebook avec d'autres informations de base.
J'utilise aussi la gemme Koala afin de récupérer le friendlist d'un utilisateur de Facebook, mais je ne suis pas certain de la façon dont je stocker ces données ...
Option 1
Je pouvais stocker un hachage sérialisé dans la table User
les amis de l'utilisateur, si je voulais afficher une liste de tous les utilisateur courant amis, je pouvais saisir ce hachage et faire quelque chose le long des lignes de SELECT FROM Users WHERE facebook_user_id IN hash
Chaque fois que la l'utilisateur se connecte, je pourrais mettre à jour ce f ield pour stocker la dernière liste d'amis.
Option 2
Je pourrais créer une table d'amis et d'information d'amitié magasin ici, où un utilisateur a beaucoup d'amis. Il y aurait donc une rangée pour chaque amitié, (User1
et User2
colonnes). Ensuite, pour afficher une liste des de l'utilisateur actuel amis que je pouvais faire quelque chose comme SELECT User2 FROM Friends WHERE User1 = current_user
Cela semble être la meilleure option pour moi, mais ...
Il a l'inconvénient qu'il y aurait de lignes ... S'il y avait 100 000 utilisateurs, chacun avec 100 amis, c'est maintenant 10 000 000 lignes dans la table des amis. Cela signifie aussi que chaque fois que l'utilisateur se connecte, je dois faire une boucle sur sa liste d'amis Facebook retournée en utilisant Koala et créer un enregistrement ami si quelqu'un sur sa liste d'amis est dans ma table Utilisateur et qu'il n'y a pas de correspondance correspondante. entrée dans la table des amis. Cela semble être lent si un utilisateur a 1000 amis Facebook?
J'apprécierais toute indication sur la meilleure façon d'atteindre cet objectif.
Toutes mes excuses pour la question mal formulée, je vais essayer de la reformuler et de l'organiser sous peu.
Merci pour toute aide à l'avance.
Merci pour votre réponse.Tu as raison de n'avoir jamais autant d'utilisateurs, je voulais juste apprendre la meilleure façon de faire les choses. Si je vais avec le schéma que vous avez suggéré, chaque fois que l'utilisateur se connecte, je dois mettre à jour la table des relations pour créer des amitiés pour tous les amis de l'utilisateur qui se sont inscrits à mon site depuis leur dernière visite. Cela nécessiterait de boucler leur liste d'amis et d'essayer de trouver un utilisateur dans ma base de données, et s'il en existe un, créez une nouvelle entrée de relation s'il n'y en a pas déjà une. Est-ce la façon la plus efficace de faire les choses? Cela semble assez inefficace. – woodstock365
Votre objectif semblait être d'avoir moins d'enregistrements (par exemple de 10.000.000 lignes dans la question), donc avoir une seule ligne pour chaque relation contre un enregistrement pour chaque direction de la même relation serait la moitié du nombre de lignes (donc serait 5,000,000). Mais, si cela ne vous dérange pas d'avoir éventuellement des lignes en double pour chaque relation, cela semblerait être une meilleure solution pour vos besoins actuels. –
En outre, vous n'êtes pas (ou du moins ne devriez pas) faire la boucle dans le contrôleur pour obtenir chaque ami. Votre requête est et la base de données est (espérons-le) bonne à cela. Pour éviter les requêtes n + 1 comme celles auxquelles vous faites allusion, utilisez l'option ': include' pour vous assurer que les requêtes AR ne demandent qu'une seule requête par type de modèle pour une recherche unique. Vous pouvez encore optimiser cela, mais au début, vous n'en aurez probablement pas besoin. –