Ключевые понятия DynamoDB

Допустим, вы хотите сохранить информацию о списке клиентов, включая их name, email, и phone.

DynamoDB - Ключевые понятия

В этом посте мы углубимся в ключевые концепции DynamoDB. Итак, приступим!

1. База данных «ключ-значение»

Допустим, вы хотите сохранить информацию о списке клиентов, включая их name, email, и phone

В key-valueбазе данных каждый клиент будет храниться как отдельный элемент с уникальным ключом, который идентифицирует этого клиента. Например:

Key: Customer1
Value:
{
   "name":"Ahmad Mayahi",
   "email":"ahmad@mayahi.net",
   "phone":"0123456789"
}

С помощью этой key-valueмодели вы можете быстро получить всю информацию, относящуюся к конкретному клиенту, с помощью ключа.

Но в чем разница между key-valueRDBMS и (например, MySQL)?

Основное различие между key-valueбазой данных и key-columnбазой данных (например, MySQL) заключается в их возможностях моделирования данных и запросов.

База key-valueданных использует простую key-valueпару для представления и организации данных.

В нашем примере все данные клиента хранятся как одно значение , и это значение связано с уникальным идентификатором, называемым ключом.

 

Хотя технически значение представляет собой единый объект, оно может содержать множество атрибутов, представляющих связанные данные. В наших примерах я использовал формат JSON для представления этих атрибутов.

 

Звучит запутанно?

Нет проблем, позвольте мне объяснить это другими словами.

При сохранении данных клиента в DynamoDB вы фактически отправляете набор атрибутов, которые представляют данные клиента ( name, email, phoneи т. д.), аналогичные полям MySQL.

 

Просто представьте, что данные клиента в формате JSON.

 

Хотя DynamoDB хранит все эти атрибуты как единую сущность ( под капотом ), вы этого не заметите, потому что по-прежнему можете просматривать атрибуты и взаимодействовать с ними по отдельности.

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

 

Я объясню primary-keyи secondary-indexesпозже в этом посте.

 

Если мы хотим представить пару ключ-значение в СУБД, все, что нам нужно сделать, это создать таблицу, состоящую из двух полей, ключа и значения, следующим образом:

CREATE TABLE customers (
  `key` VARCHAR NOT NULL UNIQUE,
  `value` TEXT NOT NULL,
  PRIMARY KEY (`key`)
);

Добавление нового клиента:

INSERT INTO customers SET id = 'User#123', value = '{"name":"Ahmad Mayahi","email":"ahmad@mayahi.net","phone":"0123456789"}';

Как насчет ключевого столбца?

В key-columnбазах данных (таких как MySQL) данные хранятся в отдельных столбцах, что позволяет нам выполнять гибкие запросы к отдельным полям.

Это отличается от key-valueбаз данных, где запросы обычно ограничиваются файлом primary-key.

Например, в MySQL мы можем легко запросить поле phoneследующим образом:

SELECT * FROM customers WHERE phone = '9999';

В то время как в DynamoDB мы можем запрашивать только первичный ключ:

$dynamodb = new Aws\DynamoDb\DynamoDbClient([
    'region' => 'eu-central-1',
    'version' => 'latest'
]);

// Execute the query
$result = $dynamodb->query([
    'TableName' => 'customers',
    'KeyConditionExpression' => 'id = :id',
    'ExpressionAttributeValues' => [
        ':id' => ['S' => '123']
    ]
]);

2. Бессхемный

В отличие от традиционных реляционных баз данных, таких как MySQL, которые требуют, чтобы вы определили схему заранее и строго применяли ее, DynamoDB позволяет добавлять или изменять данные без предопределенной схемы.

Однако важно отметить, что наличие схемы на уровне приложения по-прежнему необходимо для обеспечения структурированности и согласованности хранимых данных. Таким образом, схему можно применять с помощью проверки кода и данных на уровне приложения, а не полагаться на базу данных для ее применения.

Например, в приложениях Laravel это $fillableсвойство можно использовать для указания атрибутов (полей) модели. Любые атрибуты за пределами определенных будут отклонены.

3. Таблица, элементы, атрибуты и коллекция элементов

DynamoDB хранит данные в таблицах, как и любая СУБД. Однако, как упоминалось ранее, ключевое отличие состоит в том, что DynamoDB не применяет строгую схему к таблице.

  • Item: Относится к отдельной записи данных в таблице, очень похожей на строку в таблице MySQL.
  • Attribute: Представляет один фрагмент данных внутри элемента, подобно полям в MySQL.
employees-table.png

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

Например, здесь у меня есть два элемента, которые используют один и тот же ключ раздела Amazon DynamoDB:

thread.png

4. Первичный ключ

Первичный ключ — это уникальный идентификатор для каждого элемента в таблице .

В отличие от MySQL, DynamoDB не имеет доступной опции AUTO_INCREMENT. Это означает, что каждый раз, когда вы создаете новый элемент, вы должны вручную указывать идентификатор.

Если вы используете MySQL, вы можете запросить все поля, например, вы можете написать что-то вроде этого:

SELECT * FROM customers WHERE phone = '0123456789';

Однако запросы по атрибутам, отличным от первичного ключа, в DynamoDB невозможны.

Позвольте мне объяснить.

Как я упоминал ранее, значение, связанное с ключом, представляет собой единую сущность, содержащую все атрибуты этого элемента, тогда как в MySQL поля сохраняются по отдельности в строке таблицы.

Но что, если я хочу сделать запрос по номеру телефона? Как бы я это сделал?

Чтобы сделать это, вы должны создать так называемый a secondary-indexдля этого конкретного атрибута.

Но прежде чем я углублюсь в это, давайте поговорим об partition-key и sort-keyв DynamoDB.

5. Партиции

В DynamoDB первичный ключ состоит из двух атрибутов:

  • Ключ раздела ( обязательно )
  • Ключ сортировки ( необязательно )

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

Но что такое раздел ?

Согласно документации DynamoDB, под разделом понимается часть хранилища, выделенная для таблицы, которая поддерживается твердотельными накопителями (SSD) и автоматически реплицируется в нескольких зонах доступности в заданном регионе AWS.

Например, если у вас есть таблица размером 10 ГБ, и вы хотите запросить данные для определенного ключа раздела, например, User#123DynamoDB может найти раздел, содержащий данные для этого ключа, даже если данные распределены по нескольким SSD. диски/серверы. DynamoDB может определить, какой сервер содержит хранилище для User#123ключа раздела, просто взглянув на первичный ключ.

 

Под капотом DynamoDB использует хеш-функцию для определения раздела, в котором должен храниться элемент, на основе значения атрибута ключа раздела.

 

6. Ключ сортировки

Ключ сортировки (также известный как «ключ диапазона») специально используется для сортировки элементов с одним и тем же разделом и позволяет выполнять запросы диапазона, которые извлекают элементы на основе диапазона значений ключа раздела и/или диапазона сортировки. ключевые значения.

Предположим, у вас есть таблица под названием «заказы», ​​и вам нужно получить заказы, размещенные в период с 01 января 2023 г. по 01 января 2024 г. Это можно сделать, выполнив следующие действия:

$result = $dynamodb->query([
    'TableName' => 'orders',
    'KeyConditionExpression' => 'customer_id = :customerId AND order_date BETWEEN :startDate AND :endDate',
    'ExpressionAttributeValues' => [
        ':customerId' => ['S' => '12345'],
        ':startDate' => ['S' => '2023-01-01'],
        ':endDate' => ['S' => '2024-01-01']
    ]
]);

7. Вторичные индексы

Чтобы иметь возможность запрашивать определенный атрибут таблицы, необходимо создать вторичный индекс.

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

Например, если мы хотим найти клиентов по их номеру телефона, мы можем создать вторичный индекс, который использует атрибут phoneв качестве первичного ключа.

Я знаю, что вторичные индексы могут сбивать с толку, однако в следующих постах я расскажу все, что вам нужно о них знать. Просто помните, что вторичный индекс необходим, если вы хотите запросить поле, отличное от первичного ключа.