2012-03-03 70 views
3

我正在构建电子商务网站,并决定试用MongoDB。我的目标是实现充分的灵活性,因此最终我不会被束缚于销售特定的产品,这受限于系统最初的组装方式。MongoDB电子商务产品文档设计

因此,灵活性的目标,我必须能够创建基于属性的产品。 FX。颜色,制造,速度等。所有属性必须是可选的。用户可以创建新的属性,有些是默认的系统属性(不可删除)。根据属性的配置,它将与“基础” - 或可配置产品分层。

  • 在目录中,我想分割具有颜色属性的产品,以便每种颜色以单个产品的形式呈现。我可以使用我当前的文档设计在MongoDB中实现吗?
  • 我得出的结论是,在从MongoDB中选择产品时,在呈现之前,我必须“填充”文档或进行大量数据映射。我错了吗?
  • 考虑到某些产品有选项(颜色,尺寸)等,没有哪种做库存管理的最好和最有效的方法?

正如在我的例子中看到的,我有属性下存储的普通属性,以及文档选项下的“required”属性。

为了让事情变得简单,我的产品文档可以以某种方式进行改进吗?我担心自己要么过度执行某些任务,要么因为通过使用关系数据库而发现自己的想法“受损”。

问候

(
      [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 

没有必要为“溢出”您的文档 - 我相信你的意思是为每个可能的属性存储空值?您的应用程序代码应该简单地检查文档中是否存在可选值,并基于此进行渲染或业务逻辑决策。 MongoDB的优势在于它的灵活性。并非所有文件必须相同。您的应用程序代码应该写成处理没有所有可能字段的文档。