MongoDB Schema适用于具有不同SKU,价格和库存变化的电子商务产品

时间:2017-02-17 10:09:58

标签: mongodb e-commerce database-schema non-relational-database

我的目标是让产品具有一些基本信息,例如

  • 名称
  • 描述
  • 品牌/制造商
  • 尺寸&重量

并且可选地,每个产品可以具有基于

的选项
  • 尺寸
  • 颜色
  • 材料

我已经阅读了一些文章,但找不到适合我的问题的答案,这就是如何反映所有可能的选项组合可以有不同的SKU,价格和库存量。 此外,我想为产品的不同颜色提供不同的图像。

所以我目前的想法是为所有选项设置单独的集合:

  • 尺寸
  • 颜色
  • 材料

然后在产品文档中包含所有这些选项的指针数组,以及variations的其他数组,它反映了每个可能的选项组合,并添加了SKUprice和{{ 1}} field。

stock

但不知何故,我觉得可能有更简单的方法来完成我正在寻找的东西。

1 个答案:

答案 0 :(得分:0)

产品信息的数据建模更是一门科学。

根据销售人员考虑的实体来定义产品是很常见的。假设汽车模型。例如。一条“ 5e类以太网电缆”。

此类产品具有属性尺寸。属性可能是

  • 标准/规范(例如EIA / TIA-586)
  • 制造商(Kabelwerk Eupen)
  • 线数(8)
  • 包装(塑料袋)
  • 标签(网络,以太网,电缆,基础设施)
  • RhoS(合规)

属性在不同行业之间甚至在同一公司的不同产品类别之间都不同。

尺寸区分产品的不同变体。一个或多个维度可以定义一个具体的产品。典型的尺寸是大小和颜色。对于我们的电缆,我们可能有:

  • 大小/长度(0.5、1、2、5、10米)
  • 颜色(绿色,红色,蓝色)
  • 阻燃剂(是,不是)

因此,产品是您的商品之一的概念。在纸质目录中,产品通常被描述为单个事物(也许在单个页面上)。夹克有蓝色和棕色可供选择,尺寸为S,M,L和XL。

定义单个产品的定义有些模糊。蓝色和绿色的运动鞋可能是同一产品,但是橙色和金色的运动鞋可能不会被视为同一产品。

在进行电子商务之前,我们倾向于期望产品所有尺寸的价格都相同-不久前,人们对于8号鞋比9号鞋更昂贵感到震惊。

沿着某些尺寸-主要是颜色-用户通常除外图片。沿其他尺寸-例如鞋码-通常没有特定图片的期望 对于某些产品,制造商可能被认为是尺寸(电缆),对于其他产品,可能被认为是无关紧要的(电缆扎带),对于其他产品,来自不同制造商的两种外观相同的商品可能被视为完全不同的产品(例如运动鞋)。

另一个概念是 SKU -库存单位是实际在仓库中的物料。通常,对于每种产品,我们将尺寸与彼此的SKU相乘。因此有5种尺寸x 3种颜色x 2种阻燃剂变体-因此可能有30个SKU。通常,每个SKU都有不同的GTIN / UPC / EAN(“条形码” 4423456789012)。

保持SKU和产品分开是最佳实践,因为它们涉及不同的关注点:产品对于市场营销和销售至关重要。 SKU与审核,簿记和物流有关。产品代表概念,SKU代表实物。通常应将库存数量保持在SKU内或附近-因为在大型商务应用程序中,每秒可能会更新几次。我绝不会设计一个将交易数据-库存量-与主数据-产品说明等混合在一起的系统。

由于产品和价格数据在某种程度上是静态的,但动态定价可能会改变这种情况,因此价格信息一直附加到产品上。

您似乎正在索要产品数据库。无模式数据库为此很好地工作,因为很难预计未来几年的所有所需尺寸。可以肯定地对关系数据库进行整体标准化,但最终会导致代码不够美观,运行缓慢。

{
  name: "Cat 5e Cable",
  …
  dimensions: {
    color: {
       title: "Color", 
       red: {
          title: "Red",
          images: [
            "http://myserver.com/images/product_12345_3",
            "http://myserver.com/images/product_12345_4",
          ],
        },
        green: { … }
    },
    size: {
      title: "Size"
      s05: {
        title: "0.5 m",
        images: [],
      },
      s1: {...},
    fireretardant:           
      title: "Size"
      yes: {
        title: "fire retardant",
        images: [],
      },
      no: {
        title: "not fire retardant",
        images: [],
      }
  }
  // here you need a stable way of generating keys from dimension data    
  variations: [
    {
      dimensions: {color: red, size: s1, fireretardant: no}
      SKU: "98765"
      price: 10,
    },
    {
      dimensions: {color: red, size: s1, fireretardant: yes}
      SKU: "98765"
      price: 10,
    },
  },
  …
]

我已经用这种模式实现了应用程序。通常,您要在Admin GUI中限制可用尺寸和每个尺寸的有效值,以使工作人员不会一直隐藏新尺寸。但这应该是管理上的限制,而不是基础架构之一。

不存在的组合(“阻燃剂仅以绿色而不是0.5 m可用),冲突说明(“使所有5m电缆10欧元,所有红色电缆8欧元”),不同和不一致的想法例如需要图像,尺寸之间应该共享的图像,定义不一致,什么被视为单独的产品(“ USB C”或仅仅是变体(“ 3.5毫米或5.5毫米耳机插孔”)),转换和转换(不要让我开始sho大小)使现实生活中的数据库设计和维护变得有趣……