使用相同的主键动态数据存储数据

时间:2018-07-17 20:25:11

标签: database amazon-web-services amazon-dynamodb

我正在尝试以如下方式存储数据:

它们有100种不同类型的水果,每个水果的主键类型均为“水果”,因此当我查询“水果”时,将返回所有水果。

但是,Dynamodb要求主键必须是唯一的。

所以我想知道如何设计数据库方案以获得这些结果,或者我应该在AWS中使用另一种解决方案?

1 个答案:

答案 0 :(得分:1)

来自https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html#HowItWorks.CoreComponents.PrimaryKey

主键有两种类型:

  • 分区键–一个简单的主键,由一个称为分区键的属性组成。
  • 分区键和排序键–称为复合主键,此类型的键由两个属性组成。第一个属性是分区键,第二个属性是排序键。

不可能在一个DynamoDB表中以单个分区键的格式存储相同的主键。

要实现所需的功能,您将需要在此表上创建一个复合主键。

让我们创建一个新表 OganicProduct ,然后在该表上创建一个复合主键。主键的属性名称为 type subType 。现在,您需要分别将 type 的值设置为“水果”,将 subType 的值设置为其水果类型。

(请注意,type和subType的组合应该能够唯一标识此表中的项目。)

现在,要列出所有水果,您只需执行查询即可获得结果:

aws dynamodb query \
    --table-name OganicProduct \
    --key-condition-expression "type = :type" \
    --expression-attribute-values  '{":type":{"S":"fruit"}}'

要获得具有特定水果类型的单个水果,您可以做的是在关键条件表达式中指定一个排序关键字。现在查询如下:

aws dynamodb query \
    --table-name OganicProduct \
    --key-condition-expression "type = :type and subType=:fruitType" \
    --expression-attribute-values  '{":type":{"S":"fruit"}, ":fruitType":{"S":"apple"}}'

请注意,您还可以将蔬菜存储在同一张表中,因为主键的属性名称是通用的。要存储蔬菜记录,只需将类型的值设置为蔬菜

查询列出所有蔬菜:

aws dynamodb query \
    --table-name OganicProduct \
    --key-condition-expression "type = :type" \
    --expression-attribute-values  '{":type":{"S":"vegetable"}}'

查询获取给定类型的单个蔬菜

aws dynamodb query \
    --table-name OganicProduct \
    --key-condition-expression "type = :type and subType=:vegeType" \
    --expression-attribute-values  '{":type":{"S":"vegetable"}, ":vegeType":{"S":"broccoli"}}'