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

Wie implementiert man has_many :through Beziehungen mit Mongoid und Mongodb?

Mongoid hat kein has_many :through oder ein gleichwertiges Feature. Es wäre mit MongoDB nicht so nützlich, da es keine Join-Abfragen unterstützt. Selbst wenn Sie über eine andere Sammlung auf eine verwandte Sammlung verweisen könnten, wären immer noch mehrere Abfragen erforderlich.

https://github.com/mongoid/mongoid/issues/544

Wenn Sie in einem RDBMS eine Viele-Viele-Beziehung haben, würden Sie dies normalerweise in MongoDB anders modellieren, indem Sie ein Feld verwenden, das auf beiden Seiten ein Array von „fremden“ Schlüsseln enthält. Zum Beispiel:

class Physician
  include Mongoid::Document
  has_and_belongs_to_many :patients
end

class Patient
  include Mongoid::Document
  has_and_belongs_to_many :physicians
end

Mit anderen Worten, Sie würden die Join-Tabelle eliminieren und es hätte einen ähnlichen Effekt wie has_many :through in Bezug auf den Zugriff auf die 'andere Seite'. Aber in Ihrem Fall ist das wahrscheinlich nicht angemessen, weil Ihre Join-Tabelle eine Appointment-Klasse ist, die einige zusätzliche Informationen enthält, nicht nur die Assoziation.

Wie Sie dies modellieren, hängt bis zu einem gewissen Grad von den Abfragen ab, die Sie ausführen müssen, aber es scheint, als müssten Sie das Terminmodell hinzufügen und Zuordnungen zu Patient und Arzt wie folgt definieren:

class Physician
  include Mongoid::Document
  has_many :appointments
end

class Appointment
  include Mongoid::Document
  belongs_to :physician
  belongs_to :patient
end

class Patient
  include Mongoid::Document
  has_many :appointments
end

Bei Beziehungen in MongoDB müssen Sie sich immer zwischen eingebetteten oder verknüpften Dokumenten entscheiden. In Ihrem Modell würde ich vermuten, dass MeetingNotes ein guter Kandidat für eine eingebettete Beziehung sind.

class Appointment
  include Mongoid::Document
  embeds_many :meeting_notes
end

class MeetingNote
  include Mongoid::Document
  embedded_in :appointment
end

Das bedeutet, dass Sie die Notizen zusammen mit einem Termin zusammen abrufen können, während Sie bei einer Zuordnung mehrere Abfragen benötigen würden. Sie müssen nur die Größenbeschränkung von 16 MB für ein einzelnes Dokument berücksichtigen, die möglicherweise ins Spiel kommt, wenn Sie eine sehr große Anzahl von Besprechungsnotizen haben.