eingebettetes Dokument vs Hash-Datentyp in Mongoid

8

Ich kann keinen Blogbeitrag oder Dokumentation darüber finden. Beide, eingebetteter Dokument- und Hash-Datentyp, sind sich sehr ähnlich. Was ist der Vorteil oder die Einschränkung von jedem über den anderen?

Betrachten Sie mein Schemadesign:

%Vor%

Soll ich mehrere eingebettete Dokumente in dieser HistoryTracker-Klasse erstellen? oder einfach das benutzen? Wie wäre es mit der Indizierung?

    
Chamnap 20.03.2013, 04:02
quelle

3 Antworten

6

Mongoid speichert eingebettete Dokumente und Hash-Attribute auf Datenbankebene ziemlich genau. Es ist normal, wenn Sie mit Mongoiden arbeiten, um Ihre Felder in Ihren Modellen zu deklarieren. Wenn Sie also eine verschachtelte Struktur haben, ist es normal, ein eingebettetes Dokument zu erstellen. Da MongoDB schemaloses Mongoid ist, müssen Sie Felder deklarieren, um sie in der gleichen Art von API wie ActiveRecord darzustellen. Aber für einige Anwendungsfälle gibt ein Hash-Attribut ein bisschen mehr Flexibilität. Der Nachteil dieser Flexibilität besteht darin, dass Sie auf die Hash-API beschränkt sind, sodass Sie keine automatisch generierten Attributmethoden erhalten und Geschäftslogik nicht so kapseln können, wie Sie es normalerweise in einer Modellklasse tun würden.

Angenommen, Sie haben ein Fragebogenmodell, in dem Sie viele Abschnitte speichern müssen, die viele Frage-Antwort-Paare enthalten. Wenn eine Schlüsselanforderung des Systems darin besteht, dass der Administrator neue Abschnitte und Fragen einrichten kann, können Sie die Antworten nicht einfach als normales eingebettetes Dokument mit expliziten Feldern für jede Frage modellieren. Für solche Dinge könnte ein Hash mehr Sinn machen.

Ich weiß nicht, was Ihre spezifischen Anforderungen sind, aber als grobe Richtlinie würde ich sagen, dass wenn Sie mit einem festen Schemastock mit einem eingebetteten Dokument arbeiten, aber wenn Sie ein offenes Modell benötigen Hash-Attribute / p>     

Steve 21.03.2013, 17:30
quelle
1

Bei einem eingebetteten Dokument haben Sie auch Attributaliase, wie in

%Vor%

Also in der Datenbank haben Sie kurze Namen (viel weniger Speicher verwendet) und Sie verwenden die langen in Ihrem Code.

    
rewritten 25.10.2013 06:58
quelle
0

Ein Problem, das ich bei der Verwendung von Hashes anstelle von eingebetteten Dokumenten gesehen habe

Wenn Mongoid gerade dabei ist, ein Dokument zu serialisieren, sucht es derzeit nicht nach verschachtelten Hash-Werten und geht davon aus, dass sie bereits serialisiert sind.

Wenn Sie also einen "Hash Dump" wie den folgenden haben möchten

%Vor%

Dann können Sie keine Objekte in den Eigenschaften

verwenden %Vor%

Der Versuch, das folgende Ereignis beizubehalten, wird einen Absturz verursachen, weil Foo nicht serialisiert wird (probiere e.as_document aus und du wirst sehen, dass der Wert von some_info nicht serialisiert wird)

Verweise auf die Probleme: Github , MongoDB-Tracker

    
Cyril Duchon-Doris 16.05.2017 20:25
quelle

Tags und Links