sql >> データベース >  >> NoSQL >> MongoDB

製品、オプション/タグ、およびカテゴリの保存、整理、およびクエリ

    私もeコマースのウェブサイトを運営しています。これが、あなたが言及した機能をどのように実装するかについての私のアドバイスです。お役に立てば幸いです。

    • カテゴリ

    私はそれらを平らな構造に整理します。あなたの場合は次のようになります:

        {_id: 1, name: "Electronics", parentId: 0, idPath: "/0/1/" ...}
        {_id: 2, name: "Computers", parentId: 1, idPath: "/0/1/2/", ...}
        {_id: 3, name: "Graphic Cards", parentId: 2, idPath: "/0/1/2/3/", ...}
    

    そして、製品は今や葉のカテゴリーにのみある必要があります。あなたの場合:

        {
            _id: asdasfwetrw34tw34t245y45y,
            name: "NVIDIA GTX670",
            price: 99.50,
            ...
            ...
            categoryIds: [3]
        }
    

    もちろん、商品は複数のカテゴリに分類される可能性があるため、 categoryIds 配列のままです。ここで注意が必要な部分があります。 Electronicsをリストする場合 カテゴリでは、次の方法ですべてのサブカテゴリを見つけることができます:

        db.categories.find({idPath: /^\/0\/1/})
    

    idPath インデックスはここで機能するので、高速になります。すべてのサブカテゴリを見つけると、その中のすべての製品を簡単に見つけることができます( categoryIds でインデックスを作成します) 製品の コレクション)。

    または、すべてのカテゴリをメモリに読み込んで、key-> categoryId、value->[すべてのサブカテゴリ]を使用してハッシュテーブルを作成することもできます。通常、カテゴリは頻繁に変更されることはなく、多くのカテゴリはありません。したがって、問題はありません。

    • タグ/オプション

    まず第一に、あなたのカテゴリーに何か問題があると思います。 女性のファッション は一般的なものであり、製品をより具体的なものに配置する必要があり、オプションもそこにある必要があります。たとえば、カテゴリcoatがあるかもしれません sizeがあります & color 女性のファッション以外 。 colorがまだあるかもしれませんが 女性ファッションのオプション これは、すべてのサブカテゴリに共通の特徴であるためです。
    考えてみると、すべてのサブカテゴリが1つの親カテゴリにまとめられているのはなぜですか。彼らには共通点があるからです。その共通部分は、親カテゴリの共通オプションである必要があります。つまり、すべての親カテゴリとサブカテゴリの間に継承が存在する必要があります。例:

    次にcoat 最終的に2つのオプションcolorがあります &サイズサングラス color shape 女性のファッションを表示しているとき 、オプションは1つだけです color womenfashion から継承しているため、サブカテゴリもフィルタリングします 。
    色の値に関しては、私の考えは標準色のみを使用することですストロベリーレッド 実際にはredタンジェリン 実際にはorange 。製品をフィルタリングするときに、それらが実際に表示されることは望ましくありません。そうしないと、オプションが多すぎて、ユーザーエクスペリエンスに間違いなく良くありません。
    ただし、 color以外に カテゴリからのオプション、私のサイトにはカスタマイズ可能なオプションと呼ばれるものもあります 。これらのオプションは、製品でのみ定義されています。カテゴリを表示しているときに表示されることはありません。ここでは、 Strawberry Redを使用できます &タンジェリン 。私の意見では、これらは製品の「自然な」特性ではありません。これらは、ユーザーが製品をより快適に見られるようにするためにのみ使用されます。したがって、 Tangerine with figureのようなこの種のオプションも使用できます。 など
    オプションについてもう1つ。製品のフィルタリングに使用されるオプションをマークすることをお勧めします。例: color 間違いなく1つです。 寸法 そうではないかもしれません。

    オプションの種類について。それがあなたにとって十分であるならば、あなたは大丈夫です。 Numberのようなタイプがたくさんあります 、 String 単一選択複数の選択肢 Unitも実装する予定です 。 Unitのトリッキーな部分 たとえば

    1GB = 1024MB = 1024*1024B
    

    したがって、1GBと1TBのハードディスクを入手した場合は、製品をフィルタリングする前に変換を行うことをお勧めします。これは、私があなたの質問に戻るトピックから外れています。

    異なるカテゴリのオプションは同じ名前ですが、注意してください。それらはおそらく同じものではありません。 素材 コートの およびFurniture 2つの異なるものです。そのため、カテゴリごとに異なるオプションを定義する傾向があります。したがって、おそらく color おもちゃの場合 、および color 女性のファッション 。あるレベルから、サブカテゴリが同じオプションを共有し始めるため、これは上記の継承と競合しません。これは、カテゴリ構造の編成方法に完全に関連しています。また、カテゴリ構造を変更したり、製品を移動したりする場合は、苦痛になります。したがって、カテゴリを定義するときは注意してください。

    それが私の頭に浮かぶすべてです。私は英語を母国語としないので、私の答えの一部を理解するのが難しいかもしれません。お気軽にお知らせください。




    1. mongodbの結果javaから_idを削除します

    2. ハウツー:ApacheHBaseでユーザー認証と承認を有効にする

    3. mongoose findByIdは、文字列リテラルを使用する場合は機能しますが、オブジェクトのプロパティを参照する場合は機能しません

    4. Laravel5.1セッションとSocket.IO+Redis-ログインした(既知の)ユーザーとユーザーのグループに通知を送信する