Amazon DynamoDB で GSI や LSI のキーは重複や値なしが許容されるのか確認してみた

Amazon DynamoDB で GSI や LSI のキーは重複や値なしが許容されるのか確認してみた

結論:許容されました。
Clock Icon2020.07.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、CX 事業本部の若槻です。

今回は、Amazon DynamoDBで GSI(グローバルセカンダリインデックス)や LSI(ローカルセカンダリインデックス)のキーは重複や値なしが許容されるのか気になったので確認してみました。

確認してみた

次のような DynamoDB テーブルを使用して確認します。

{
  "Table": {
    "AttributeDefinitions": [
      {
        "AttributeName": "createdAt",
        "AttributeType": "N"
      },
      {
        "AttributeName": "objectId",
        "AttributeType": "S"
      },
      {
        "AttributeName": "objectType",
        "AttributeType": "S"
      },
      {
        "AttributeName": "updatedAt",
        "AttributeType": "N"
      }
    ],
    "TableName": "object-master",
    "KeySchema": [
      {
        "AttributeName": "objectType",
        "KeyType": "HASH"
      },
      {
        "AttributeName": "createdAt",
        "KeyType": "RANGE"
      }
    ],
    "TableStatus": "ACTIVE",
    "CreationDateTime": 1594468590.571,
    "ProvisionedThroughput": {
      "NumberOfDecreasesToday": 0,
      "ReadCapacityUnits": 5,
      "WriteCapacityUnits": 5
    },
    "TableSizeBytes": 404,
    "ItemCount": 4,
    "TableArn": "arn:aws:dynamodb:ap-northeast-1:123456789012:table/object-master",
    "TableId": "2055b0a7-88c4-4223-920b-xxxxxxxxxxxx",
    "LocalSecondaryIndexes": [
      {
        "IndexName": "LSI-objectType-updatedAt",
        "KeySchema": [
          {
            "AttributeName": "objectType",
            "KeyType": "HASH"
          },
          {
            "AttributeName": "updatedAt",
            "KeyType": "RANGE"
          }
        ],
        "Projection": {
          "ProjectionType": "ALL"
        },
        "IndexSizeBytes": 404,
        "ItemCount": 4,
        "IndexArn": "arn:aws:dynamodb:ap-northeast-1:123456789012:table/object-master/index/LSI-objectType-updatedAt"
      }
    ],
    "GlobalSecondaryIndexes": [
      {
        "IndexName": "GSI-objectId",
        "KeySchema": [
          {
            "AttributeName": "objectId",
            "KeyType": "HASH"
          }
        ],
        "Projection": {
          "ProjectionType": "ALL"
        },
        "IndexStatus": "ACTIVE",
        "ProvisionedThroughput": {
          "NumberOfDecreasesToday": 0,
          "ReadCapacityUnits": 5,
          "WriteCapacityUnits": 5
        },
        "IndexSizeBytes": 404,
        "ItemCount": 4,
        "IndexArn": "arn:aws:dynamodb:ap-northeast-1:123456789012:table/object-master/index/GSI-objectId"
      }
    ]
  }
}

キーの仕様を抜粋すると以下のとおりです。

  • プライマリパーティションキー:objectType
  • プライマリソートキー:createdAt
  • GSI-objectIdパーティションキー:objectId
  • LSI-objectType-updatedAtソートキー:updatedAt

事前にテーブルには次のようにアイテムを登録しました。 image.png

重複するキーの登録

GSIのキーを重複させてみる

GSI のキーobjectIdが重複するようにアイテムを登録してみます。

$ aws dynamodb put-item --table-name object-master \
    --item '{"objectType": {"S": "Group"}, "createdAt": {"N": "55555555"}, "objectId": {"S": "g0001"}, "updatedAt": {"N": "55555555"}}'

登録できました。GSI のキーが重複するアイテムが併存できています。 image.png

GSI のキーでクエリをしてみると、GSI のキーが重複しているアイテムがすべて取得できました。 image.png

LSIのキーを重複させてみる

LSI のキーobjectType+updatedAtが重複するようにアイテムを登録してみます。

$ aws dynamodb put-item --table-name object-master \
    --item '{"objectType": {"S": "User"}, "createdAt": {"N": "66666666"}, "objectId": {"S": "u0003"}, "updatedAt": {"N": "66666666"}}'

テーブルに登録できました。LSI のキーが重複するアイテムが併存できています。 image.png

LSI のキーでクエリをしてみると、LSI のキーが重複しているアイテムがすべて取得できました。 image.png

GSIおよびLSIのキーを値なしにしてみる

プライマリキーobjectType+createdAtのみ値を持ったアイテムを登録してみます。

$ aws dynamodb put-item --table-name object-master \
    --item '{"objectType": {"S": "User"}, "createdAt": {"N": "77777777"}}'

テーブルに登録できました。 image.png

GSI でスキャンした場合は取得できませんでした。GSI のキーを持っていないアイテムは GSI には登録されないようです。 image.png

同様に、LSI でスキャンした場合も取得できませんでした。 image.png

まとめ

  • GSI や LSI のキーが重複していたり値なしのアイテムもテーブルに登録可能。
  • キーが重複しているアイテムでもインデックスの検索ですべて取得可能。
  • キーの値なしのアイテムはインデックスの検索では取得不可。

参考

以上

この記事をシェアする

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.