sql >> Database >  >> NoSQL >> MongoDB

How-to:Gebruiker heeft fans

Wat dacht je van een zelfreferentiële associatie:

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

Het probleem is dat u relationele associatie probeert uit te voeren met alleen ingesloten documenten. Als je een Fan hebt ingebed in een User , je hebt alleen toegang tot de Fan via zijn bovenliggende User . Je kunt niet zoiets doen als Fan.find(some_id) omdat er geen verzameling is van Fan verslagen.

Uiteindelijk zal MongoDB virtuele collecties ondersteunen waarmee u dit kunt doen. Voor nu moet je associaties van het relationele type gebruiken. Als u in dit geval ingesloten documenten wilt gebruiken, moet u een aantal lelijke en inefficiënte aangepaste methoden maken om door bovenliggende records te zoeken.

Met MongoDB en Mongoid heb ik ontdekt dat je gemakkelijk kunt schakelen tussen embedded en relationele associaties. Relaties van het SQL-type en ingebedde relaties hebben beide hun plaats en kunnen met groot effect samen worden gebruikt.




  1. Hoe converteer je een bestaande relationele database naar een key-value store?

  2. sla een object op met een bidirectionele relatie in mongodb met behulp van de officiële c#-driver

  3. Wat doet Redis als het geheugen vol raakt?

  4. Hoe kan ik de eigenschappen die zich in een andere verzameling bevinden in een subarray oproepen?