Mongodb数据建模最佳实践

时间:2018-10-15 08:29:00

标签: mongodb collections model

我目前正在开发一个简单的产品,该产品具有用于市场网站的报价集合。经过一些考虑,我有点被困住了。

我必须为此集合创建一些过滤器,例如分页,按价格,按商店,按产品类别(按库存)。就像任何电子商务网站一样。

因为有很多方式来组织此模型。

1 /每个文档都是一种产品,具有一系列类似的报价:

{
   "_id" : ObjectId("5bbdd5bbbec13b3d867ac672"),
   "type" : "IMES",
   "sku" : "XXXXXX",
   "label" : "Briquet",
   "price" : {
     "value" : 305 (default price in centimes)
   },
   offers: [
       {
          "offerId" : "1825957",
          "price" : {
             "value" : 3830,
             "vat" : 766
        },
        "stock": 12,
        "shop" : {
            "shopId" : "2000",
            "shopName" : "XXXXXX"
        }
      },
      {
         "offerId" : "22222",
         "price" : {
             "value" : 22323,
             "vat" : 500
         },
         "stock": 12,
         "shop" : {
             "shopId" : "2000",
             "shopName" : "XXXXX"
         }
     }
  ]
}

这种方式允许不重复数据。 但是经过几次测试,正确管理offers数组非常烦人。

2 /每个文档都是一个产品,且仅一个报价。

{
    "_id" : ObjectId("5bbdd5bbbec13b3d867ac672"),
    "type" : "IMES",
    "sku" : "XXXXXX",
    "label" : "Briquet",
    "price" : {
        "value" : 305 (default price in centimes)
    },
    offer: 
        {
            "offerId" : "1825957",
            "price" : {
                "value" : 3830,
                "vat" : 766
            },
            "stock": 12,
            "shop" : {
                "shopId" : "2000",
                "shopName" : "XXXXXX"
            }
        }
    }
}

这种方式类似于“展开”聚合,它允许具有最低级别的数据,而无需任何数组。但是,我们正在复制产品。对于产品的每个报价,我都会有一个包含产品和报价的文档。我想这真的很糟糕,因为如果必须更新产品,则必须更新此集合中的“ x”个文档。

3 /要将数据模型分为2个不同的集合:

  • 集合 产品 ,其中包含以下对象:

    {     “ _id”:ObjectId(“ 5bbdd5bbbec13b3d867ac672”),     “ type”:“ IMES”,     “ sku”:“ XXXXXX”,     “ label”:“ Briquet”,     “价钱” : {         “值”:305(默认价格,以厘米为单位)     } }

  • 收藏 报价 ,对象如下:

    {    “ offerId”:“ 1825957”,    “价钱” : {      “值”:3830,      “ vat”:766    },    “库存”:12    “商店”:{       “ shopId”:“ 2000”,       “ shopName”:“ XXXXXX”    } }

我们不再重复数据。这是一个好点。但是,要请求那两个集合,即使使用 $ lookup (?)也很困难 这种方法是一种SQL方法。

4 /我发现的最后一种方式是,我们仅保留产品sku,并且仅提供类似2 /的报价,但是这种方式对我来说毫无用处,因为我们需要拥有另一种收集产品来保留所有产品属性。

所以我的问题是:

为了拥有最佳的模型数据组织,哪种方法更好?

感谢您的预先答复。

0 个答案:

没有答案