0

私のプロジェクトでは、3 つのモデルがあります。

  1. プラザ

都市には広場と店舗があります。広場には店舗があります。

私の最初の設計は、関係に「外部キー」を使用することです。(私はmysqlから来て、jsutはmongodbを拾い始めました)

class City(Document):
     name = StringField()

class Plaza(Document):
     name = StringField()
     city = ObjectIdField()

class Store(Document):
     name = StringField()
     city = ObjectIDField()
     plaza = ObjectIdField()

この設計は、SQL アプローチに非常に似ていると思います。

プロジェクトの範囲は次のとおりです。5 つの都市。各都市には 5 つの広場があります。プラザには200店舗あります。ストアには多数の製品があります (上記のコードではモデル化されていません)

都市または広場にあるすべての店舗にクエリを実行します。都市のすべての広場。

City コレクションにすべての店舗と広場を埋め込む必要がありますか? mongodb では参照を使用せず、代わりに埋め込みドキュメントを使用すると聞いています。私の特定のプロジェクトでは、どちらがより良いアプローチですか? 私にとっては、「外部キー」の設計には満足していますが、mongodb を利用しないことを恐れています。

4

2 に答える 2

0

店舗のコレクションを1つにするのは理にかなっていると思います。

各ストアドキュメントには、cityという属性を含めることができ、属性プラザを含めることもできます。より複雑な(サブドキュメント)値など、属性を構造化する方法は他にもたくさんあります。

ドキュメントが次の場合:

{ storeName:  "Books and Coffee",
  location:   "plaza 17",
  city:       "Anytown",
}

Anytownのすべての店舗を簡単に照会できます。

db.stores.find({"city":"Anytown"})

都市とプラザを別々のコレクションに保存することは意味がありません。その場合、店舗とその都市、または都市のすべての店舗など、複数のコレクションにまたがる情報が必要になるたびに複数のクエリを実行する必要があるためです。 "。

于 2012-06-15T20:55:43.587 に答える
0

プロジェクトの説明からすると、組み込みのアプローチはおそらく必要ないようです。都市と広場でインデックスを使用すると、言及したクエリを非常にすばやく実行できます。埋め込みは、キャッシュや、埋め込まれたデータ自体があまり意味をなさず、常に親データと同時にアクセスされる場合に役立つ傾向があります。ここでは実際にはそうではなく、アドレスのようなものが良い例です。

于 2012-06-14T15:33:48.990 に答える