Что такое DynamoDB?

Amazon DynamoDB — это полностью управляемая служба базы данных NoSQL. Позволяет работать с большими данными. Он предоставляет такие функции, как:

  • Плавное масштабирование по запросу
  • Неограниченное количество одновременных операций чтения/записи
  • Одноразрядная миллисекундная задержка
  • Задержка в микросекундах с DAX (сервис кэширования)
  • Отказоустойчивость, поддержка межрегиональной репликации и высокая масштабируемость
  • Может обрабатывать в значительной степени неструктурированные данные с большим объемом и частотой
  • Цены основаны на емкости, которую вы предоставляете для каждой таблицы.

DynamoDB должен иметь первичный ключ.

Типы данных в DynamoDB

1. Скалярные типы:представляет ровно одно значение, которое может быть строкой, числом, двоичным, логическим значением или нулевым значением.

2. Типы наборов:представляет несколько скалярных значений, которые могут принимать значения набора строк, набора чисел или двоичного набора.

3. Типы документов: Он имеет сложную структуру с вложенными атрибутами, которые могут быть картой или списком.

Необходимые условия для использования DynamoDB с AWS SDK в Node.js/Javascript

Во-первых, убедитесь, что в вашей системе установлен aws-cli вместе с переменной среды aws и настроенными конфигурациями. Вы можете проверить это, просто выполнив команду: aws — version.

Перейдите в терминал и выполните инструкции:

  1. инициализация нпм
  2. npm установить aws-sdk — -save

Основные операции с таблицами в DynamoDB с использованием AWS SDK

  1. Список таблиц DynamoDB
//referencing sdk in js file
const AWS = require("aws-sdk");
//specifying aws region where dynamodb table will be created
AWS.config.update({ region: 'us-east-1' });
//instantiate dynamodb class
const dynamodb = new AWS.DynamoDB();
//listing tables
dynamodb.listTables({}, (err, data)=>{
    if(err) {
        console.log(err);
    } else {
        console.log(data);
    }
});

2. Описать таблицы

 dynamodb.describeTable({
     TableName: "demo_sdk"
 }, (err, data)=>{
     if(err) {
         console.log(err);
     } else {
         console.log(JSON.stringify(data, null, 2));// '2' is to beautify the output 
     }
 });

3. Создать таблицу

Выделенная здесь пропускная способность обеспечивает предсказуемую производительность в любом масштабе. Это основной фактор ценообразования, который определяется в единицах емкости чтения (RCU) и единицах емкости записи (WCU).

1 единица емкости = 1 запрос в секунду

dynamodb.createTable({
    TableName: "demo_sdk",
    AttributeDefinitions: [
        {
            AttributeName: "id",
            AttributeType: "S" //string
        },
        {
            AttributeName: "timestamp",
            AttributeType: "N" //number
        }
    ],
    KeySchema: [
        {
            AttributeName: "id",
            KeyType: "HASH"
        },
        {
            AttributeName: "timestamp",
            KeyType: "RANGE"
        }
    ],
    ProvisionedThroughput: {
        ReadCapacityUnits: 1,
        WriteCapacityUnits: 1
    }
}, (err, data)=>{
    if(err) {
        console.log(err);
    } else {
        console.log(JSON.stringify(data, null, 2));
    }
});

4. Обновить таблицу

//Changing read capacity units from 1 to 2 for the table
dynamodb.updateTable({
    TableName: "demo_sdk",
    ProvisionedThroughput: {
        ReadCapacityUnits: 2,
        WriteCapacityUnits: 1
    }
}, (err, data) => {
    if(err) {
        console.log(err);
    } else {
        console.log(JSON.stringify(data, null, 2));
    }
});

5. Удалить таблицу

dynamodb.deleteTable({
    TableName: "demo_sdk"
}, (err, data) => {
    if(err) {
        console.log(err);
    } else {
        console.log(JSON.stringify(data, null, 2));
    }
});

Вы можете просмотреть изменения после каждой операции, используя функцию descriptionTable Dynamodb. Все изменения будут отражены в консоли управления AWS. Для этого нужно написать всего несколько строк кода и не выполнять утомительные действия вручную.

Если вы внимательно изучите синтаксис фрагментов кода, это довольно просто, не так ли? Итак, предполагая, что теперь вы немного освоились с использованием AWS SDK для dynamodb, мы перейдем к более подробным операциям с таблицами.

Ранее мы использовали класс AWS.DynamoDB, который использует низкоуровневый подход к программированию. Теперь мы будем использовать другой класс DynaModb, AWS.DynamoDB.DocumentClient, который предоставляет нам доступ высокого уровня при работе с элементами. Мы говорим, что он обеспечивает доступ высокого уровня, потому что он абстрагирует от пользователя все ненужные детали, такие как сопоставление внутренних типов данных DynamoDB с типами данных JavaScript.

Операции с таблицами доступа высокого уровня

  1. Поместить элемент

Создание экземпляра aws sdk и региона aws останется таким же, как и в предыдущих кодах.

const docClient = new AWS.DynamoDB.DocumentClient();
docClient.put({
    TableName: 'demo_sdk',
    Item: {
// specify attributes as key value pairs
        user_id: 'first',
  //timestamp is the primary key
        timestamp: 3,
        title: 'The Secret',
        content: 'Book'
    }
}, (err, data)=>{
    if(err) {
        console.log(err);
    } else {
        console.log(data);
    }
});

2. Обновить элементы

Хотите обновить запись элемента, но не хотите тратить время на поиск и изменение его значения? DynamoDB также предлагает решение для этого — функцию docClient.update.

const docClient = new AWS.DynamoDB.DocumentClient();
docClient.update({
    TableName: 'demo_sdk',
    Key: {
        user_id: 'first',
        timestamp: 3
    },
    UpdateExpression: 'set #old = :new',
    ExpressionAttributeNames: {
        '#old': 'The Secret' 
    },
    ExpressionAttributeValues: {
       //Title of item is updated
        ':new': "Hall of Games"
    }
}, (err, data)=>{
    if(err) {
        console.log(err);
    } else {
        console.log(data);
    }
});

3. Удаление элементов

Как только вы начинаете видеть шаблон в синтаксисе кода, становится довольно легко написать его самостоятельно, поэтому попробуйте это сами, а затем сравните свой код.

const docClient = new AWS.DynamoDB.DocumentClient();
docClient.delete({
    TableName: 'demo_sdk',
    Key: {
        user_id: 'first',
        timestamp: 3
    }
}, (err, data)=>{
    if(err) {
        console.log(err);
    } else {
        console.log(data);
    }
});

4. Пакетная запись элементов

Эта функция помогает нам помещать или удалять несколько элементов одновременно, что значительно упрощает нашу работу при работе с большим набором записей в таблице.

const docClient = new AWS.DynamoDB.DocumentClient();
docClient.batchWrite({
    RequestItems: {
        'demo_sdk': [
            {
              // deletes item , here, only one
                DeleteRequest: {
                    Key: {
                        user_id: 'first',
                        timestamp: 3
                    }
                }
            },
            {
              // inserting two items in the table
                PutRequest: {
                    Item: {
                        user_id: 'new',
                        timestamp: 1,
                        title: 'To Kill a MockingBird',
                        content: 'Harper Lee'
                    }
                }
            },
            {
                PutRequest: {
                    Item: {
                        user_id: 'two',
                        timestamp: 2,
                        title: 'Harry Potter',
                        content: 'J.K Rowling'
                    }
                }
            }
        ]
    }
}, (err, data)=>{
    if(err) {
        console.log(err);
    } else {
        console.log(data);
    }
});

5. Получить товар

const docClient = new AWS.DynamoDB.DocumentClient();
// to get an item with the corresponding key parameters
docClient.get({
    TableName: 'demo_sdk',
    Key: {
        user_id: 'two',
        timestamp: 2
    }
}, (err, data)=>{
    if(err) {
        console.log(err);
    } else {
        console.log(data);
    }
});

6. Запрос элемента

const docClient = new AWS.DynamoDB.DocumentClient();
//here we specify th query condition or the where clause, for instance if we
// have multiple table entries for a user_id and want to get all those items at
//once (in this case we don't, but for the sake of learning XD)
docClient.query({
    TableName: 'demo_sdk',
// condition is: user_id must be equal to the value of expression attribute id
    KeyConditionExpression: "user_id = :id",
    ExpressionAttributeValues: {
        ":id": "new"
    }
}, (err, data)=>{
    if(err) {
        console.log(err);
    } else {
        console.log(data);
    }
});

Обзор:

Вы ознакомились с базовым пониманием того, что такое AWS DynamoDB, а затем узнали, как работать с Dynamodb, используя простые коды javascript с AWS SDK. Далее вы узнали о классах Dynamodb и операциях с таблицами низкого и высокого уровня, таких как: Создать таблицу, Удалить таблицу, Описать таблицу, Поместить элемент, Получить элемент, Удалить элемент, Пакетно записать элемент, Запросить элемент и обновить элемент.

Ссылки:

https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html

https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html

Спасибо за чтение!

Ссылка на Github: https://github.com/rashi2911/dynamo-db-aws-sdk