글로벌 보조 인덱스로 작업: .NET - Amazon DynamoDB

글로벌 보조 인덱스로 작업: .NET

AWS SDK for .NET 하위 수준 API를 사용하여 하나 이상의 글로벌 보조 인덱스가 포함된 Amazon DynamoDB 테이블을 만들고, 테이블의 인덱스를 설명하고, 인덱스를 사용하여 쿼리를 수행할 수 있습니다. 이러한 작업은 해당 DynamoDB 작업에 매핑됩니다. 자세한 내용은 Amazon DynamoDB API 참조를 참조하세요.

다음은 .NET 하위 수준 API를 사용하여 테이블 작업을 할 때 따라야 할 공통 단계입니다.

  1. AmazonDynamoDBClient 클래스의 인스턴스를 만듭니다.

  2. 해당하는 요청 객체를 만들어 작업의 필수 및 선택적 파라미터를 제공합니다.

    예를 들어 CreateTableRequest 객체를 만들어 테이블을 생성하거나 QueryRequest 객체를 만들어 테이블 또는 인덱스를 쿼리합니다.

  3. 이전 단계에서 만든 클라이언트가 제공한 적절한 메서드를 실행합니다.

글로벌 보조 인덱스가 있는 테이블 생성

글로벌 보조 인덱스는 테이블을 만들 때 동시에 만들 수 있습니다. 이렇게 하려면 CreateTable을 사용하고 하나 이상의 글로벌 보조 인덱스에 대한 사양을 제공합니다. 다음에 예로 나오는 C# 코드는 날씨 데이터에 대한 정보를 담고 있는 테이블을 만듭니다. 파티션 키는 Location이고 정렬 키는 Date입니다. PrecipIndex라는 이름의 글로벌 보조 인덱스를 사용하면 다양한 위치의 강수 데이터에 빠르게 액세스할 수 있습니다.

다음은 .NET 하위 수준 API를 사용하여 글로벌 보조 인덱스가 포함된 테이블을 생성하는 단계입니다.

  1. AmazonDynamoDBClient 클래스의 인스턴스를 만듭니다.

  2. CreateTableRequest 클래스 인스턴스를 만들어 요청 정보를 입력합니다.

    이때 입력해야 하는 정보는 테이블 이름, 기본 키, 그리고 프로비저닝된 처리량 값입니다. 글로벌 보조 인덱스의 경우 인덱스 이름, 프로비저닝된 처리량 설정, 인덱스 정렬 키의 속성 정의, 인덱스의 키 스키마, 속성 프로젝션을 제공해야 합니다.

  3. 요청 객체를 파라미터로 입력하여 CreateTable 메서드를 실행합니다.

다음 C# 코드 예제에서는 이전 단계를 설명합니다. 이 코드는 글로벌 보조 인덱스(PrecipIndex)가 있는 테이블(WeatherData)을 생성합니다. 인덱스 파티션 키는 Date이고 정렬 키는 Precipitation입니다. 모든 테이블 속성이 인덱스로 프로젝션되지 않습니다. 이 인덱스를 쿼리하여 특정 날짜에 대한 날씨 데이터를 가져와서 필요에 따라 강수량을 기준으로 데이터를 정렬할 수 있습니다.

Precipitation은 해당 테이블의 키 속성이 아니므로 필요하지 않습니다. 그러나 Precipitation이 없는 WeatherData 항목은 PrecipIndex에 표시되지 않습니다.

client = new AmazonDynamoDBClient(); string tableName = "WeatherData"; // Attribute definitions var attributeDefinitions = new List<AttributeDefinition>() { {new AttributeDefinition{ AttributeName = "Location", AttributeType = "S"}}, {new AttributeDefinition{ AttributeName = "Date", AttributeType = "S"}}, {new AttributeDefinition(){ AttributeName = "Precipitation", AttributeType = "N"} } }; // Table key schema var tableKeySchema = new List<KeySchemaElement>() { {new KeySchemaElement { AttributeName = "Location", KeyType = "HASH"}}, //Partition key {new KeySchemaElement { AttributeName = "Date", KeyType = "RANGE"} //Sort key } }; // PrecipIndex var precipIndex = new GlobalSecondaryIndex { IndexName = "PrecipIndex", ProvisionedThroughput = new ProvisionedThroughput { ReadCapacityUnits = (long)10, WriteCapacityUnits = (long)1 }, Projection = new Projection { ProjectionType = "ALL" } }; var indexKeySchema = new List<KeySchemaElement> { {new KeySchemaElement { AttributeName = "Date", KeyType = "HASH"}}, //Partition key {new KeySchemaElement{AttributeName = "Precipitation",KeyType = "RANGE"}} //Sort key }; precipIndex.KeySchema = indexKeySchema; CreateTableRequest createTableRequest = new CreateTableRequest { TableName = tableName, ProvisionedThroughput = new ProvisionedThroughput { ReadCapacityUnits = (long)5, WriteCapacityUnits = (long)1 }, AttributeDefinitions = attributeDefinitions, KeySchema = tableKeySchema, GlobalSecondaryIndexes = { precipIndex } }; CreateTableResponse response = client.CreateTable(createTableRequest); Console.WriteLine(response.CreateTableResult.TableDescription.TableName); Console.WriteLine(response.CreateTableResult.TableDescription.TableStatus);

DynamoDB에서 테이블을 만들고 테이블 상태가 ACTIVE로 설정될 때까지 기다려야 합니다. 그런 다음 테이블에 데이터 항목을 입력할 수 있습니다.

글로벌 보조 인덱스가 있는 테이블 설명

테이블의 글로벌 보조 인덱스에 관한 자세한 내용은 DescribeTable 단원을 참조하세요. 각 인덱스에 대해 인덱스의 이름, 키 스키마 및 프로젝션된 속성에 액세스할 수 있습니다.

다음은 .NET 하위 수준 API를 사용하여 테이블의 글로벌 보조 인덱스 정보에 액세스하는 단계입니다.

  1. AmazonDynamoDBClient 클래스의 인스턴스를 만듭니다.

  2. 요청 객체를 파라미터로 입력하여 describeTable 메서드를 실행합니다.

    DescribeTableRequest 클래스 인스턴스를 만들어 요청 정보를 입력합니다. 테이블 이름을 입력해야 합니다.

다음 C# 코드 예제에서는 이전 단계를 설명합니다.

client = new AmazonDynamoDBClient(); string tableName = "WeatherData"; DescribeTableResponse response = client.DescribeTable(new DescribeTableRequest { TableName = tableName}); List<GlobalSecondaryIndexDescription> globalSecondaryIndexes = response.DescribeTableResult.Table.GlobalSecondaryIndexes; // This code snippet will work for multiple indexes, even though // there is only one index in this example. foreach (GlobalSecondaryIndexDescription gsiDescription in globalSecondaryIndexes) { Console.WriteLine("Info for index " + gsiDescription.IndexName + ":"); foreach (KeySchemaElement kse in gsiDescription.KeySchema) { Console.WriteLine("\t" + kse.AttributeName + ": key type is " + kse.KeyType); } Projection projection = gsiDescription.Projection; Console.WriteLine("\tThe projection type is: " + projection.ProjectionType); if (projection.ProjectionType.ToString().Equals("INCLUDE")) { Console.WriteLine("\t\tThe non-key projected attributes are: " + projection.NonKeyAttributes); } }

글로벌 보조 인덱스 쿼리

테이블을 Query할 때와 거의 동일한 방식으로 글로벌 보조 인덱스에서 Query를 사용할 수 있습니다. 인덱스 이름, 인덱스 파티션 키 및 정렬 키(있는 경우)의 쿼리 기준, 반환하려는 속성을 지정해야 합니다. 이 예제에서 인덱스는 PrecipIndex이고, 해당 파티션 키는 Date이고, 정렬 키는 Precipitation입니다. 인덱스 쿼리에서는 특정 날짜에 대해 강수량이 0보다 큰 모든 날씨 데이터를 반환합니다.

다음은 .NET 하위 수준 API를 사용하여 글로벌 보조 인덱스를 쿼리하는 단계입니다.

  1. AmazonDynamoDBClient 클래스의 인스턴스를 만듭니다.

  2. QueryRequest 클래스 인스턴스를 만들어 요청 정보를 입력합니다.

  3. 요청 객체를 파라미터로 입력하여 query 메서드를 실행합니다.

속성 이름 Date는 DynamoDB 예약어입니다. 따라서 KeyConditionExpression에서 표현식 속성 이름을 자리 표시자로 사용해야 합니다.

다음 C# 코드 예제에서는 이전 단계를 설명합니다.

client = new AmazonDynamoDBClient(); QueryRequest queryRequest = new QueryRequest { TableName = "WeatherData", IndexName = "PrecipIndex", KeyConditionExpression = "#dt = :v_date and Precipitation > :v_precip", ExpressionAttributeNames = new Dictionary<String, String> { {"#dt", "Date"} }, ExpressionAttributeValues = new Dictionary<string, AttributeValue> { {":v_date", new AttributeValue { S = "2013-08-01" }}, {":v_precip", new AttributeValue { N = "0" }} }, ScanIndexForward = true }; var result = client.Query(queryRequest); var items = result.Items; foreach (var currentItem in items) { foreach (string attr in currentItem.Keys) { Console.Write(attr + "---> "); if (attr == "Precipitation") { Console.WriteLine(currentItem[attr].N); } else { Console.WriteLine(currentItem[attr].S); } } Console.WriteLine(); }