如何在 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 ?
中创建它
我最初被这个问题吸引是在 amazon-dynamodb 仍然与这个问题相关联的时候,所以我的解决方案可能不适用于 mongodb,但是虽然过程应该是相似的。
虽然您将查询描述为一个,但实际上有三种查询:
- 列出所有品牌名称
- 列出每个品牌名称的所有类别
- 列出给定品牌名称的类别中的所有项目
这些可以在单个 table/collection 中解决。
我将在这里使用 DynamoDB Terminology,它有两种键:
- 分区键 (PK) 定义了 partition/shard 数据所在
- 一个排序键 (SK) 定义分区键的项目在分片上的顺序
结合这两个组成主键。还有多种不同效率的操作:
GetItem
,需要同时指定PK和SK,速度非常快
Query
,这需要你指定PK并且可以选择性地在SK上做一些filtering/logic。它还可以 return 多个项目并且高效。
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 演讲。
我是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 ?
中创建它我最初被这个问题吸引是在 amazon-dynamodb 仍然与这个问题相关联的时候,所以我的解决方案可能不适用于 mongodb,但是虽然过程应该是相似的。
虽然您将查询描述为一个,但实际上有三种查询:
- 列出所有品牌名称
- 列出每个品牌名称的所有类别
- 列出给定品牌名称的类别中的所有项目
这些可以在单个 table/collection 中解决。 我将在这里使用 DynamoDB Terminology,它有两种键:
- 分区键 (PK) 定义了 partition/shard 数据所在
- 一个排序键 (SK) 定义分区键的项目在分片上的顺序
结合这两个组成主键。还有多种不同效率的操作:
GetItem
,需要同时指定PK和SK,速度非常快Query
,这需要你指定PK并且可以选择性地在SK上做一些filtering/logic。它还可以 return 多个项目并且高效。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 演讲。