mongodb Daten Design Frage
-
20-09-2019 - |
Frage
Ich versuche, meine erste Anwendung mit mongodb on Rails mongo_mapper mit und ich bin mit einem Gewicht von meinen Optionen auf einem STI-Modell wie unten.
Es funktioniert gut, und ich werde dies natürlich in vielerlei Hinsicht hinzuzufügen, als ich zur Zeit zählen kann, ich nur neugierig, ob ich mit eingebetteten Dokumenten oder so nicht besser dran.
würde ich meine Modelle zu teilen möchten so viel wie möglich, IE, da sie alle erben bestimmte Attribute, eine gemeinsame Form teilweise auf dem Gelände / _form.html.erb ... zusätzlich zu ihren eigenen einzigartigen Formelemente usw. I wissen die Ansichten unterscheiden, aber ich bin mir nicht sicher auf den Controllern noch, wie ich Controller verwenden Eigenschaft könnte ich für die meisten Dinge übernehmen? Und ich bin sicher, dass es komplexer werden, wie ich mitgehen.
Alle Hinweise Ressourcen und / oder Weisheit (Schmerzspitzen Einsparung) geschätzt sehr
property.rb
class Property
include MongoMapper::Document
key :name, String, :required => true
key :_type, String, :required => true
key :location_id, Integer, :required => true
key :description, String
key :phone, String
key :address, String
key :url, String
key :lat, Numeric
key :lng, Numeric
key :user_id, Integer, :required => true
timestamps!
end
Restaurant
class Restaurant < Property
key :cuisine_types, Array, :required => true
end
bar
class Bar < Property
key :beers_on_tap, Array
end
Lösung
Do von mehr Modelle keine Angst, die Idee der OO ist in der Lage sein, Ihre Bedenken in kleine Stücke zu zerschneiden und dann jeder von ihnen in der Art und Weise behandeln sie müssen behandelt werden.
Zum Beispiel, Ihre Immobilie Modell scheint eine ganze Menge zu tun. Warum aufzuschlüsseln nicht die geo Sachen du hast los in eine EmbeddedDocument (lat, lng, Adresse, etc.)? Auf diese Weise Ihren Code bleiben wird einfacher und besser lesbar.
Ich benutze diese Art von STI mich und ich finde es meinen Code viel einfacher und nutzbar macht. Eine der Schönheiten von einer DB wie Mongo ist, dass Sie sehr komplexe STI wie dies tun können und immer noch eine überschaubare Sammlung von Daten haben.
In Bezug auf Ihre cuisine_types und beers_on_tap etc, ich denke, das sind feine Konzepte. Es könnte nützlich sein, zu Küche und Bier Modelle zu haben, so dass Ihre Datenbank normalisiert (ein Konzept, das leicht in Mongo zu verlieren ist) bleibt. z.
class Bar < Property
key :beer_ids, Array
many :beers, :in => :beer_ids
end
class Beer
include MongoMapper:Document
key :name, String
end
Andere Tipps
Haben Sie beiden Restaurants und Bars in der gleichen Abfrage zurückzukehren erwarten?
Wenn nicht, möchten Sie vielleicht zu überdenken, um sie von einem Basistyp abgeleitet werden müssen.
In der Standardeinstellung ist Mongo_Mapper gehe beiden Restaurants und Bars in einer einzigen Sammlung setzen. Dies könnte die Leistung und die Dinge schwieriger maßstabs in Zukunft behindern.
Beim Blick durch einige der Mongo_Mapper Code, sieht es aus wie Sie dies mit set_collection_name on the fly setzen möglicherweise in der Lage.