2 Stimmen

Frage zum Mongodb-Datenentwurf

Ich versuche meine erste Anwendung mit mongodb auf Rails mit mongo_mapper und ich bin meine Optionen auf ein STI-Modell wie unten abwägen.

Es funktioniert gut, und ich werde natürlich mehr dazu beitragen, als ich derzeit zählen kann, ich bin nur neugierig, ob ich nicht besser dran wäre mit eingebetteten Dokumenten oder so etwas.

Ich möchte meine Modelle so viel wie möglich zu teilen, IE, da sie alle bestimmte Attribute erben, ein gemeinsames Formular teilweise auf Eigenschaft/_form.html.erb... zusätzlich zu ihren eigenen einzigartigen Form-Elemente usw. Ich weiß, die Ansichten werden sich unterscheiden, aber ich bin nicht sicher, auf die Controller noch, wie ich Eigenschaft Controller verwenden könnte ich für die meisten Dinge annehmen? Und ich bin sicher, es wird komplexer werden, wie ich weitergehen.

Für Hinweise auf Ressourcen und/oder Weisheiten (Tipps zur Schmerzreduzierung) wären wir Ihnen sehr dankbar.

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

3voto

joshsz Punkte 454

Haben Sie keine Angst vor weiteren Modellen. Die Idee von OO ist es, Ihre Anliegen in kleine Teile zu zerlegen und diese dann jeweils so zu behandeln, wie sie behandelt werden müssen.

Zum Beispiel scheint Ihr Immobilienmodell eine ganze Menge zu tun. Warum nicht die Geo-Sachen, die Sie haben, in ein EmbeddedDocument (lat, lng, Adresse, etc.) aufteilen? Auf diese Weise bleibt Ihr Code einfacher und besser lesbar.

Ich verwende diese Art von STI selbst und finde, dass sie meinen Code viel einfacher und benutzerfreundlicher macht. Eine der Schönheiten der Verwendung einer DB wie Mongo ist, dass Sie sehr komplexe STI wie diese tun können und immer noch eine überschaubare Sammlung von Daten haben.

Was Ihre "cuisine_types" und "beers_on_tap" usw. betrifft, so halte ich dies für gute Konzepte. Es könnte nützlich sein, Cuisine und Beer Modelle zu haben, so dass Ihre Datenbank mehr normalisiert bleibt (ein Konzept, das leicht in Mongo zu verlieren). z.B.:

class Bar < Property
  key :beer_ids, Array
  many :beers, :in => :beer_ids
end
class Beer
  include MongoMapper:Document
  key :name, String
end

0voto

Scott Watermasysk Punkte 652

Erwarten Sie, dass sowohl Restaurants als auch Bars in der gleichen Abfrage zurückgegeben werden?

Wenn nicht, sollten Sie überlegen, ob Sie sie nicht von einem Basistyp ableiten wollen.

Standardmäßig fasst Mongo_Mapper sowohl Restaurants als auch Bars in einer einzigen Sammlung zusammen. Dies könnte die Leistung beeinträchtigen und die Skalierung in Zukunft erschweren.

Schauen Sie durch einige der Mongo_Mapper-Code, es sieht aus wie Sie möglicherweise in der Lage, diese on the fly mit set_collection_name festgelegt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X