如何在DynamoDB中将排序键设置为全局二级索引(另一个分区键)..?

时间:2016-12-30 09:20:42

标签: database-design primary-key amazon-dynamodb

我在DynamoDB表中使用了以下字段:

主分区键 => user_id

主要排序键 => conversation_id

样本表数据

+---------+--------------------+ | user_id | conversation_id | +---------+--------------------+ | 10 | aaaa | | 10 | bbbb | | 10 | cccc |
| 11 | aaaa | | 11 | bbbb | | 11 | cccc | +---------+--------------------+

我在dynamodb中有两个单独的查询:

  1. 按特定conversation_id提取所有user_id 如果输入10 =>输出=> aaaa,bbbb,cccc
  2. 如何从特定user_id获取所有conversation_id如果输入aaaa =>输出=> 10,11
  3. 我可以获得第一个查询的结果,但是如何获取第二个查询结果。

    使用主要排序键conversation_id)或

    获取数据是一种好习惯吗

    如何将conversation_id分配或创建为全局二级索引(另一个分区键) ..?

    注意:我使用的是PHP(Codeigniter框架)

1 个答案:

答案 0 :(得分:0)

1)您需要使用query来获取分区键的所有排序键。请参考以下链接。

Query API

Query sample code

2)使用AWS CLI命令创建GSI。

本地DynamoDB: -

您可能需要删除端点网址并包含相应的区域--region us-east-1。另外,请相应更改表名。

aws dynamodb update-table --table-name Movies --attribute-definitions file://create_gsi_attributes.json --global-secondary-index-updates file://create_gsi.json --endpoint-url http://localhost:8000

<强> create_gsi_attributes.json: -

请将属性名称(和类型)更改为conversation_iduser_id

[{
    "AttributeName": "title",
    "AttributeType": "S"
},
{
    "AttributeName": "yearkey",
    "AttributeType": "N"
}]

<强> create_gsi.json: -

请将关键架构属性名称更改为conversation_iduser_id

[{
    "Create": {
        "IndexName": "Movies_Gsi",
        "KeySchema": [{
            "AttributeName": "title",
            "KeyType": "HASH"
        },
        {
            "AttributeName": "yearkey",
            "KeyType": "RANGE"
        }],
        "Projection": {
            "ProjectionType": "ALL"
        },
        "ProvisionedThroughput": {
            "ReadCapacityUnits": 100,
            "WriteCapacityUnits": 100
        }
    }
}]

修改: -

<强>命令: -

aws dynamodb update-table --table-name message_participants_tbl --attribute-definitions file://create_gsi_attributes_conversation.json --global-secondary-index-updates file://create_gsi_conversation.json --endpoint-url http://localhost:8000

<强> create_gsi_conversation.json: -

[{
    "Create": {
        "IndexName": "message_participants_tbl_gsi",
        "KeySchema": [{
            "AttributeName": "conversation_id",
            "KeyType": "HASH"
        },
        {
            "AttributeName": "user_id",
            "KeyType": "RANGE"
        }],
        "Projection": {
            "ProjectionType": "ALL"
        },
        "ProvisionedThroughput": {
            "ReadCapacityUnits": 100,
            "WriteCapacityUnits": 100
        }
    }
}]

<强> create_gsi_attributes_conversation.json: -

[{
    "AttributeName": "user_id",
    "AttributeType": "S"
},
{
    "AttributeName": "conversation_id",
    "AttributeType": "S"
}]