Wystarczy wiedzy teoretycznej, przejdźmy, prawie od razu, do przykładów w oparciu o nasz ulubiony język jakim jest C#. Jak już doskonale wiecie, lokalne indeksy wtórne, muszą być tworzone w tym samym czasie, w którym tworzona jest tabela. Aby to zrobić musimy posłużyć się metodą CreateTable podając specyfikację jednego lub więcej lokalnych indeksów wtórnych. W poniższym przykładzie utworzymy tabelę przechowywującą informacje o konkretnych samochodach w kolekcji samochodów. Kluczem partycji jest Brand a kluczem sortowania Model. Indeks pomocniczy, CarCollectionModelIndex ułatwi nam zapytania o rodzinę modeli danej kategorii.
Kolejne kroki, które musimy wykonać to utworzenie instancji klasy AmazonDynamoDBClient (tutaj możecie posłużyć się szablonem projektu dostępnym w tym wpisie: DynamoDB - tworzenie tabeli). Drugi krok to utworzenie instancji klasy CreateTableRequest w którym musimy przekazać informacje takie jak nazwa tabeli, klucz główny oraz wartości przepustowości. Dodatkowo, dla lokalnego indeksu wtórnego, musimy podać nazwę indeksu, nazwę oraz typ danych klucza sortowania indeksu, schemat klucza oraz rzutowane atrybuty. Ostatni krok to wykonanie metody CreateTable podając powyższy obiekt jako parametr żądania.
Spójrzcie na poniższy przykład oraz komentarze dotyczące kolejnych linii kodu:
public async Task<ActionResult<string>> TableWithLocalSecondaryIndex()
{
string tableName = "Car";
var createTableRequest = new CreateTableRequest()
{
TableName = tableName
};
// Konfiguracja przepustowości
createTableRequest.ProvisionedThroughput = new ProvisionedThroughput()
{
ReadCapacityUnits = 5,
WriteCapacityUnits = 5
};
// Definicja atrybutów
var attributeDefintion = new List<AttributeDefinition>()
{
{new AttributeDefinition {AttributeName = "Brand", AttributeType = "S"} },
{new AttributeDefinition {AttributeName = "Model", AttributeType = "S"} },
{new AttributeDefinition {AttributeName = "Class", AttributeType = "N"} },
};
createTableRequest.AttributeDefinitions = attributeDefintion;
// Schemat klucza tabeli
var tableKeySchema = new List<KeySchemaElement>()
{
{new KeySchemaElement {AttributeName = "Brand", KeyType = "HASH"} }, // klucz partycji
{new KeySchemaElement {AttributeName = "Model", KeyType = "RANGE"} },// klucz sortowania
};
createTableRequest.KeySchema = tableKeySchema;
// Schemat klucza indeksu
var indexKeySchema = new List<KeySchemaElement>()
{
{new KeySchemaElement {AttributeName = "Brand", KeyType = "HASH"} }, // klucz partycji
{new KeySchemaElement {AttributeName = "Class", KeyType = "RANGE"} },// klucz sortowania
};
// typ rzutowania atrybutów do indeksu
var projection = new Projection()
{
ProjectionType = "INCLUDE"
};
// atrybyty nie będące kluczami
List<string> nonKeyAttributes = new List<string>();
nonKeyAttributes.Add("Engine");
nonKeyAttributes.Add("Year");
// określając typ projekcji na 'INCLUDE' musimy również określić atrybuty nie będące kluczami,
// które zostaną uwzględnione w projekcji
projection.NonKeyAttributes = nonKeyAttributes;
var localSecondaryIndex = new LocalSecondaryIndex()
{
IndexName = "CarCollectionModelIndex",
KeySchema = indexKeySchema,
Projection = projection
};
var localSecondaryIndexes = new List<LocalSecondaryIndex>();
localSecondaryIndexes.Add(localSecondaryIndex);
createTableRequest.LocalSecondaryIndexes = localSecondaryIndexes;
var result = await _amazonDynamoDB.CreateTableAsync(createTableRequest);
return $"Utworzono tabele: {result.TableDescription.TableName}. Obecny status: {result.TableDescription.TableStatus}";
}
Wykonanie powyższego kodu pozwoli na utworzenie tabeli. Pamiętajcie, że do kolejnego kroku możemy przejść dopiero wtedy, gdy DynamoDB zwróci nam status tabeli ACTIVE - w poprzednich wpisach przygotowaliśmy kod czekający na utworzenie tabeli, dopiero później tabelę możemy wypełnić danymi.