2012-03-03 10 views
3

私はeコマースサイトを構築しており、MongoDBを試してみることにしました。私の目標は完全な柔軟性を達成することです。その結果、最終的には、システムが元々組み合わされた方法によって制限された特定の製品の販売に縛られることはありません。MongoDB eコマース製品ドキュメントデザイン

したがって、柔軟性の目標は、私は属性に基づいて製品を作成できなければなりません。 Fx。色、製造、スピードなど。すべての属性はオプションでなければなりません。ユーザーは新しい属性を作成することができ、一部はデフォルトのシステム属性(削除不可)です。属性の構成に基づいて、「基本」または構成可能な製品のいずれかに階層化されます。

  • カタログでは、各色が個別の製品として表示されるように、色属性で商品を分割したいと考えています。現在のドキュメントデザインを使用してMongoDBでこれを達成できますか?
  • 私は、MongoDBから製品を選択するとき、そしてプレゼンテーションの前に、私の文書を「過剰に埋める」か、あるいは多くのデータマッピングを行う必要があるという結論に達しました。私が間違っている?
  • オプション(色、サイズ)を持っていて、他の商品にはないと考えると、在庫管理を行う最も効率的な方法は何ですか?

私の例で見てきたように、属性の下には通常の属性が格納され、ドキュメントオプションには「必須」属性があります。

私の製品ドキュメントは、何か改善の余地がありますか?リレーショナルデータベースを使って作業することで自分のアイデアが「傷ついている」ことがわかったので、私は何かを過小評価していると思います。

敬具

(
      [type] => Product 
      [sku] => elin/4191 
      [name] => Array 
       (
        [da] => Sko - Elin 
        [en] => Shoes - Elin 
       ) 

      [url_key] => Array 
       (
        [da] => sko-elin 
        [en] => 1-744 
       ) 

      [categories] => Array 
       (
       ) 

      [shops] => Array 
       (
        [0] => 1 
       ) 

      [images] => Array 
       (
        [0] => test.jpg 
        [1] => test1.jpg 
       ) 

      [options] => Array 
       (
        [0] => Array 
         (
          [color] => Array 
           (
            [da] => Sort 
            [en] => Black 
           ) 

          [size] => Array 
           (
            [da] => Lille 
            [en] => Small 
           ) 

          [shipping] => Array 
           (
            [weight] => 0 
            [width] => 0 
            [height] => 0 
            [depth] => 0 
           ) 

          [pricing] => Array 
           (
            [price] => 899 
            [retail] => 0 
            [cost] => 333 
            [vat] => 25 
            [special] => Array 
             (
              [price] => 0 
              [from] => new Date() 
              [to] => new Date() 
              [pct_savings] => 100 
              [savings] => 0 
             ) 

           ) 

         ) 

        [1] => Array 
         (
          [color] => Array 
           (
            [da] => Sort 
            [en] => Black 
           ) 

          [size] => Array 
           (
            [da] => Medium 
            [en] => Medium 
           ) 

          [shipping] => Array 
           (
            [weight] => 0 
            [width] => 0 
            [height] => 0 
            [depth] => 0 
           ) 

          [pricing] => Array 
           (
            [price] => 899 
            [retail] => 0 
            [cost] => 333 
            [vat] => 25 
            [special] => Array 
             (
              [price] => 0 
              [from] => new Date() 
              [to] => new Date() 
              [pct_savings] => 100 
              [savings] => 0 
             ) 

           ) 

         ) 

        [2] => Array 
         (
          [color] => Array 
           (
            [da] => Orange 
            [en] => Orange 
           ) 

          [size] => Array 
           (
            [da] => Lille 
            [en] => Small 
           ) 

          [shipping] => Array 
           (
            [weight] => 0 
            [width] => 0 
            [height] => 0 
            [depth] => 0 
           ) 

          [pricing] => Array 
           (
            [price] => 899 
            [retail] => 0 
            [cost] => 333 
            [vat] => 25 
            [special] => Array 
             (
              [price] => 0 
              [from] => new Date() 
              [to] => new Date() 
              [pct_savings] => 100 
              [savings] => 0 
             ) 

           ) 

         ) 

        [3] => Array 
         (
          [color] => Array 
           (
            [da] => Orange 
            [en] => Orange 
           ) 

          [size] => Array 
           (
            [da] => Medium 
            [en] => Medium 
           ) 

          [shipping] => Array 
           (
            [weight] => 0 
            [width] => 0 
            [height] => 0 
            [depth] => 0 
           ) 

          [pricing] => Array 
           (
            [price] => 899 
            [retail] => 0 
            [cost] => 333 
            [vat] => 25 
            [special] => Array 
             (
              [price] => 0 
              [from] => new Date() 
              [to] => new Date() 
              [pct_savings] => 100 
              [savings] => 0 
             ) 

           ) 

         ) 

       ) 

      [attributes] => Array 
       (
        [designer] => Array 
         (
          [name] => Array 
           (
            [da] => Manufacturer 
            [en] => Manufacturer 
           ) 

          [type] => text 
          [visible] => 1 
          [required] => false 
          [value] => Array 
           (
            [da] => FunnyShirts 
            [en] => FunnyShirts 
           ) 

         ) 

       ) 

     ) 

答えて

1

私は別のサブ文書に必須およびオプションの属性を分離する必要が表示されませんが、あなたのデザインが、正常に動作すると思います。

私はPHPを知らないが、あなたは、あなたが何か行うことができます表示されたときに、別の製品として、各色の治療のために:

product = db.products.findOne({sku: "..."}) 
for color in product.colors: 
    # render the product with the color 

ドキュメントを「過剰充填」する必要はありませんが - 私は仮定すべての属性に対してnull値を格納することを意味しますか?アプリケーションコードでは、ドキュメント内にオプションの値が存在するかどうかを確認し、それに基づいてレンダリングまたはビジネスロジックの決定を行う必要があります。 MongoDBの強みの中には柔軟性があります。すべての文書が同じである必要はありません。すべての可能なフィールドを持たない文書を処理するために、アプリケーションコードを記述する必要があります。

関連する問題