MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Anleitung:Benutzer hat Fans

Wie wäre es mit einer selbstreferenziellen Assoziation:

class User
  include Mongoid::Document
  references_many :fans, 
                  :class_name => 'User', 
                  :stored_as => :array, 
                  :inverse_of => :fan_of

  references_many :fan_of, 
                  :class_name => 'User', 
                  :stored_as => :array, 
                  :inverse_of => :fans
end

# let's say we have users: al, ed, sports_star, movie_star    
sports_star.fans << al
movie_star.fans << al
sports_star.fans << ed
movie_star.fans << ed

movie_star.fans  # => al, ed
al.fan_of        # => sports_star, movie_star

Das Problem besteht darin, dass Sie versuchen, eine relationale Zuordnung nur mit eingebetteten Dokumenten vorzunehmen. Wenn Sie einen Fan haben eingebettet in einen User , können Sie nur auf den Fan zugreifen durch seinen übergeordneten User . Sie können so etwas wie Fan.find(some_id) nicht tun weil es keine Sammlung von Fan gibt Aufzeichnungen.

Letztendlich wird MongoDB virtuelle Sammlungen unterstützen, die Ihnen dies ermöglichen. Im Moment müssen Sie relationale Assoziationen verwenden. Wenn Sie in diesem Fall eingebettete Dokumente verwenden möchten, müssen Sie einige hässliche und ineffiziente benutzerdefinierte Methoden erstellen, um übergeordnete Datensätze zu durchsuchen.

Bei MongoDB und Mongoid habe ich festgestellt, dass Sie problemlos zwischen eingebetteten und relationalen Assoziationen wechseln können. SQL-artige Beziehungen und eingebettete Beziehungen haben beide ihren Platz und können mit großer Wirkung zusammen verwendet werden.