如何在 NoSql 中创建具有类别和品牌名称的产品 table?

How to create products table with category and brand name in NoSql?

我是No-sql数据库结构的新手。我有一个带有品牌名称和类别的产品 table。 例如 Apple 是一个品牌,Apple 有一些子类别(例如:手机、笔记本电脑、汽车等)。我必须创建一个具有品牌和子类别关系的 table。我试过像下面的例子。

我创建了一个名为 brands

的 table
{
     "brand_id":100, 
     "name": "Apple",
     "category":[{
         "id":1,
         "name":"Mobile"
     },{
         "id":2,
         "name":"Laptop"
     }]
}

然后,我创建了另一个 table 产品,如下所示

{
    "product_id":1, 
    "name": "iPhone 11",
    "category_info":{
        "brand_id":100,
        "brand_name":"Apple",
        "category_id":1,
        "category_name":"Mobile"
    }
}

如何查询数据

我的问题是,我走对了吗?或者我应该在一个 table ?

中创建它

我最初被这个问题吸引是在 仍然与这个问题相关联的时候,所以我的解决方案可能不适用于 mongodb,但是虽然过程应该是相似的。

虽然您将查询描述为一个,但实际上有三种查询:

  1. 列出所有品牌名称
  2. 列出每个品牌名称的所有类别
  3. 列出给定品牌名称的类别中的所有项目

这些可以在单个 table/collection 中解决。 我将在这里使用 DynamoDB Terminology,它有两种键:

  1. 分区键 (PK) 定义了 partition/shard 数据所在
  2. 一个排序键 (SK) 定义分区键的项目在分片上的顺序

结合这两个组成主键。还有多种不同效率的操作:

  1. GetItem,需要同时指定PK和SK,速度非常快
  2. Query,这需要你指定PK并且可以选择性地在SK上做一些filtering/logic。它还可以 return 多个项目并且高效。
  3. Scan,搜索所有项目并且非常慢。

我想 mongodb 中也有类似的概念。

NoSQL 设计中的一个想法是使用单个 table/collection 来存储您的所有项目(单一-Table-设计),我们将使用它。要存储不同种类的项目,我们可以 index/key 重载。

这就是您的数据结构的样子,PK 和 SK 属性是必需的:

PK                  SK                  TYPE    ATTRS
BRANDS              NAME#APPLE          BRAND   {name: apple, address:...}
BRANDS              NAME#SAMSUNG        BRAND   {name: Samsung, address:...}
BRANDS              NAME#Google         BRAND   {name: Google, address:...}
BRAND#APPLE         CATEGORY#Phones     CATG    {name: Phones, description:...}
BRAND#APPLE         CATEGORY#Computers  CATG    {name: Computers, description:...}
BRAND#GOOGLE        CATEGORY#Phones     CATG    {name: Phones, description:...}
BRAND#SAMSUNG       CATEGORY#Phones     CATG    {name: Phones, description:...}
B#APPLE#CAT#Phones  PROD#IPHONE6        PROD    {name: iPhone 6, ...}
B#APPLE#CAT#Phones  PROD#IPHONE11       PROD    {name: iPhone 11, ...}
B#APPLE#CAT#Phones  PROD#IPHONE12       PROD    {name: iPhone 12, ...}
B#GOOGLE#CAT#Phones PROD#Pixel3         PROD    {name: Pixel 3, ...}

现在您可以使用我提到的操作来有效地运行您的查询。

要解决 1),您对 PK=BRANDS 进行查询,这将 return 所有品牌商品。

要解决 2),您确实构建了适当的键,因此对于 apple,您可以在 PK=BRAND#Apple 上进行查询,您将获得 apple 的所有类别。

要解决 3),您可以根据品牌和类别构建密钥,因此对于苹果手机,您可以在 PK=B#APPLE#CAT#Phones 上进行查询并获得所有 iPhone 的列表

如果您想了解 NoSQL 设计模式,我强烈建议您在 YouTube 上观看来自 AWS 的 Rick Houlihan 的 re:invent 演讲。