1

ショップの構造とデータベースのような商品の構造には2種類あると思います

最初

  ShopSchema = new Schema({
     product_ids:[Schema.Types.ObjectId],
  })

   ProductSchema = new Schema({
     product_name:String,
  })

2番目

  ShopSchema = new Schema({

  })

   ProductSchema = new Schema({
     shop_id:Schema.Types.ObjectId,
     product_name:String,
  })

最初のソリューションは2番目のソリューションと比較してクリーンな製品コレクションを持ち、製品のコレクション内のすべてのドキュメントにはshop_idフィールドがあります(私が思うに無駄なスペースのようなものです)が、最初の構造を介してすべての製品を取得するのは面倒ですが、2番目の構造はかなり簡単です。

だから、どれが一番いいのだろうと思っていました。または、より良い解決策がありますか?

4

2 に答える 2

1

2番目のバージョンは、ほとんどのユースケースではるかに効率的です。非正規化は、NoSQL永続化ソリューションを使用したゲームの名前です。目標は、できるだけ少ないクエリで必要なデータをできるだけ多く取得することです。多くの場合、これにはデータの複製が必要であり、複製されたデータが変更されたときに多数のドキュメントを更新しなければならないという潜在的な頭痛の種に対処する必要があります。

たとえば、Webページにその情報を表示する場合は、ショップ名を製品ドキュメントに追加する必要がある場合もあります。そうしないと、ショップコレクションにクエリを実行する必要があります。ショップ名は変更されない傾向があるという事実を考えると、比較的頭痛の種はないはずですが、スキーマを設計するときに考慮しなければならないのはそのようなものです。ユースケースから始めて、ユースケースを設計するときに作業を進めていきます。

于 2012-10-17T09:08:11.530 に答える
1

次の質問を自問してください。同じ商品を複数のショップで販売できるようにする必要がありますか?

答えが「いいえ」の場合、それshop_idはショップの所有物であると考えることができ、あなたが与えた2番目のオプションは有効な解決策であるはずです。

答えが「はい」の場合、製品を複数のショップにマッピングできる必要があります。2番目のデザインを使用する場合は、商品オブジェクトを複数回複製する必要があります。たとえば、ショップごとに1回販売されます。これは、たとえば呼び出すことができる新しいスキーマと同じですProductInShop

これをモデル化する方法には、まだ2つの非常に有効なオプションがあることに注意してください。1)product_idsプロパティをに追加するShopSchemaか、2)shop_idsプロパティをに追加しますProductSchema

スペースを節約するということは、データを正規化することでもあると思います。リレーショナルデータベースとは異なり、ドキュメントデータベースでは、通常、正規化を避け、代わりに可能な限り非正規化する傾向があります。例:リレーショナルデータベースでは、通常、これを列shop_idと。を持つ新しいテーブルとして追加しますproduct_id。MongoDBのようなドキュメントデータベースでは、通常、「ドキュメントの結合」を避けるために、可能な限り単一のドキュメントに埋め込むことをお勧めします。

また、マングースについてのメモ。マングースのポピュレートを利用したい場合は、コレクション名への明示的な参照を追加で提供してください。例えば:

var ShopSchema = new Schema({
   product_ids: [{ type: Schema.Types.ObjectId, ref: 'Product' }]
});

このようにして、Mongooseを使用して、たとえば「すべてのショップと各ショップで販売されているすべての製品を検索する」ことができます。

Shop.find().populate('product_ids').exec(function (err, shops) {
    // ...
});
于 2012-10-17T09:08:27.463 に答える