10
votes

Comment mettre en œuvre des associations multiles de plusieurs à plusieurs?

Je veux porter un réseau social à Mongoid. La table de jointure entre amis est très grande. Y a-t-il un moyen pour Mongoid de gérer cette table de jointure hors de la boîte? J'ai vu quelques solutions de votre propre roll-votre-modèle, mais rien n'est efficace. Y a-t-il un moyen de gérer cela? Ou est-ce un cas où je ne devrais pas utiliser Mongoid?


0 commentaires

4 Réponses :


0
votes

Vous ne faites pas beaucoup de relations dans de nombreuses relations et rejoignez des tables avec MongoDB. Chaque utilisateur aurait tout leur guide d'amis stocké sur l'objet utilisateur actuel, ainsi que tout le reste comme des préférences, des images (gridfs), etc. Si vous avez besoin de faire des choses spéciales nécessitant une algèbre relationnelle, utilisez simplement une SGBDM, sinon MongoDB fonctionnera bien. Il est possible de faire des requêtes avancées, mais vous devez utiliser MapReduce.


2 commentaires

Nous n'avons besoin que de stocker les identifiants d'ami de l'utilisateur comme une matrice sur l'objet utilisateur, non? Mongoïd a-t-il des méthodes pour y faire face? Ou dois-je me écrire moi-même?


Donc, si absolument tout est intégré et qu'il n'y a pas beaucoup de relations à de nombreuses relations dans MongoDB, je supposerais que les mises à jour des données dénormalisées redondantes doivent être difficiles.



6
votes

Plusieurs à plusieurs devraient être évités pour les applications à l'échelle. Ce que Twitter, par exemple, c'est qu'il stocke les identifiants de suiveurs dans le format séparé des virgules (chaîne) à l'intérieur de l'objet utilisateur. L'utilisation de MongoDB est encore meilleure car elle prend en charge les tableaux.

N'oubliez pas que ce qui décrit le meilleur NOSQL est le terme nojoin; -)


0 commentaires

4
votes

Vous pouvez créer des associations nombreuses à plusieurs (polymorphes) en utilisant des associations relationnelles et en stockant la relation comme une matrice.

class Person
  include Mongoid::Document
  field :name
  references_many :preferences, :stored_as => :array, :inverse_of => :people
end

class Preference
  include Mongoid::Document
  field :name
  references_many :people, :stored_as => :array, :inverse_of => :preferences
end

ps1 = Person.create(:name => 'John Doe')
pf1 = Preference.create(:name => 'Preference A')
pf2 = Preference.create(:name => 'Preference B')

ps1.preferences << pf1
ps1.preferences << pf2
ps1.save

pf1.people.each {|ps| puts ps.name }
ps1.preferences.each {|pf| puts pf.name }


2 commentaires

En réponse à "Références_Many stockées sous forme de tableaux peut être ralentissant lentement sur la création / mise à jour de masse avec de nombreuses relations. Un RDBM plus traditionnel sera facilement surperformer Mongo": Oui, un tel choix peut être lent. Si tel est un problème, vous pouvez également créer une collection "jointure", si vous le souhaitez. Utilisez simplement votre application pour la jointure.


Notez que : stocked_as est parti in 2.0.0, voir Notes de mise à niveau .



1
votes

Cette méthode est obsolète. Vous pouvez maintenant utiliser références_and_referended_in_many comme: xxx


0 commentaires