0Pricing
Cloud & IT Cert Prep · Урок

Таблицы, элементы и первичные ключи

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

«Таблицы, элементы и первичные ключи» — бесплатный урок Cloud & IT Cert Prep на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Cloud & IT Cert Prep, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Cloud & IT Cert Prep содержит 4 уроков всего.

DynamoDB: хранилище типа «ключ–значение» NoSQL

Amazon DynamoDB — это полностью управляемая бессерверная база данных типа «ключ–значение» и документная база данных, рассчитанная на производительность в единицы миллисекунд при любом масштабе. В отличие от реляционных баз данных, DynamoDB не требует фиксированной схемы: каждый элемент может иметь собственный набор атрибутов, если присутствует первичный ключ.

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

Таблицы и элементы

Таблица DynamoDB содержит набор элементов, каждый из которых представляет собой набор атрибутов. Атрибуты имеют типы: строка (S), число (N), двоичные данные (B), логическое значение (BOOL), Null (NULL), список (L), карта (M) и наборы (SS, NS, BS).

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

# Example DynamoDB item structure (JSON)
{
  'UserId': {'S': 'user-abc-123'},
  'Timestamp': {'N': '1719000000'},
  'Username': {'S': 'alice'},
  'Score': {'N': '4200'},
  'Tags': {'SS': ['premium', 'verified']}
}

Простой первичный ключ: только ключ раздела

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

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

# Create a table with a simple (partition key only) primary key
aws dynamodb create-table \
  --table-name Users \
  --attribute-definitions AttributeName=UserId,AttributeType=S \
  --key-schema AttributeName=UserId,KeyType=HASH \
  --billing-mode PAY_PER_REQUEST

Составной первичный ключ: ключ раздела и ключ сортировки

Составной первичный ключ использует и ключ раздела, и ключ сортировки (также называемый ключом диапазона). Элементы с одинаковым ключом раздела хранятся вместе и сортируются по значению ключа сортировки, что позволяет выполнять запросы по диапазону внутри раздела.

Такая схема очень гибкая: несколько элементов могут иметь один и тот же ключ раздела, если их ключи сортировки различаются. Например, таблица Orders может использовать CustomerId как ключ раздела и OrderDate как ключ сортировки, позволяя запрашивать все заказы клиента с сортировкой по дате.

# Create a table with a composite primary key
aws dynamodb create-table \
  --table-name Orders \
  --attribute-definitions \
    AttributeName=CustomerId,AttributeType=S \
    AttributeName=OrderDate,AttributeType=S \
  --key-schema \
    AttributeName=CustomerId,KeyType=HASH \
    AttributeName=OrderDate,KeyType=RANGE \
  --billing-mode PAY_PER_REQUEST

Проектирование ключа раздела и горячие разделы

Выбор правильного ключа раздела — самое важное проектное решение в DynamoDB. Хороший ключ раздела обладает высокой кардинальностью (множеством различных значений) и равномерно распределяет обращения между разделами. Неудачный выбор приводит к горячим разделам, в которых один раздел получает непропорционально большой объём трафика, вызывая ограничение пропускной способности.

Антипаттерны, которых следует избегать: логический флаг (всего два значения), дата, объединяющая все записи за сегодня, или поле состояния с низкой кардинальностью. Хорошие варианты: идентификатор пользователя, идентификатор устройства, случайный UUID или составные значения, такие как tenantId#entityType.

PutItem, GetItem и DeleteItem

Три основные операции DynamoDB с элементами:

  • PutItem: записывает новый элемент или полностью заменяет существующий элемент с тем же первичным ключом
  • GetItem: извлекает один элемент по его точному первичному ключу (требуется полный ключ — ключ раздела и, если ключ составной, ключ сортировки)
  • DeleteItem: удаляет элемент по его точному первичному ключу

Все три операции атомарны на уровне элемента. По умолчанию GetItem использует чтение с конечной согласованностью; добавление --consistent-read принудительно включает чтение со строгой согласованностью, которое всегда возвращает последнее записанное значение.

# PutItem
aws dynamodb put-item \
  --table-name Users \
  --item '{"UserId":{"S":"user-123"},"Name":{"S":"Alice"}}'

# GetItem
aws dynamodb get-item \
  --table-name Users \
  --key '{"UserId":{"S":"user-123"}}' \
  --consistent-read

UpdateItem и условные выражения

UpdateItem изменяет отдельные атрибуты существующего элемента, не заменяя его полностью, в отличие от PutItem. Можно добавлять и удалять атрибуты, а также атомарно выполнять арифметические операции над числовыми атрибутами (например, увеличивать счётчик).

Условные выражения позволяют указать, что операция должна выполняться только при истинности определённого условия. Например, можно обновить состояние элемента, только если сейчас оно равно PENDING. Это позволяет реализовать оптимистическую блокировку без транзакций и является важным приёмом проектирования DynamoDB.

# Atomically increment a counter, only if item exists
aws dynamodb update-item \
  --table-name Orders \
  --key '{"CustomerId":{"S":"c-123"},"OrderDate":{"S":"2026-06-20"}}' \
  --update-expression 'SET ItemCount = ItemCount + :inc' \
  --condition-expression 'attribute_exists(CustomerId)' \
  --expression-attribute-values '{":inc":{"N":"1"}}'

Query и Scan

Query извлекает элементы с одинаковым значением ключа раздела, при необходимости фильтруя их по условиям для ключа сортировки. Query эффективна: она читает только целевой раздел. Для сужения результатов внутри раздела можно использовать условия для ключа сортировки, такие как begins_with, between, =, <, >.

Scan читает каждый элемент таблицы, а затем применяет необязательное выражение фильтра. Операции Scan дороги для больших таблиц, поэтому их следует избегать в рабочих сценариях запросов. Если Вам часто требуется Scan, пересмотрите структуру таблицы или добавьте глобальный вторичный индекс.

# Query: get all orders for customer c-123 after a date
aws dynamodb query \
  --table-name Orders \
  --key-condition-expression 'CustomerId = :cid AND OrderDate >= :dt' \
  --expression-attribute-values \
    '{":cid":{"S":"c-123"},":dt":{"S":"2026-01-01"}}'

Строго согласованные и чтения с конечной согласованностью

DynamoDB хранит три копии Ваших данных в нескольких зонах доступности (AZ). Чтения с конечной согласованностью (используются по умолчанию) могут вернуть немного устаревшее значение, если недавняя запись ещё не распространилась на все копии, но они потребляют вдвое меньше единиц пропускной способности чтения, чем строго согласованные чтения.

Строго согласованные чтения всегда возвращают последнюю зафиксированную запись, но стоят вдвое больше RCU и недоступны для Global Secondary Indexes. Выбирайте чтения с конечной согласованностью для рабочих нагрузок с высокой пропускной способностью и преобладанием операций чтения, а строго согласованные чтения — только когда приложению действительно нужны самые свежие данные.

Транзакции DynamoDB

DynamoDB поддерживает ACID-транзакции с помощью TransactWriteItems и TransactGetItems. Транзакция может объединять до 100 операций записи с несколькими элементами и даже несколькими таблицами, гарантируя, что либо все операции завершатся успешно, либо все они будут атомарно отменены.

Используйте транзакции в таких сценариях, как перевод денег между счетами (списать средства с одного элемента и зачислить на другой) или бронирование места (атомарно проверить доступность и зарезервировать место). Транзакции стоят вдвое дороже обычных RCU/WCU, поэтому используйте их только тогда, когда действительно требуется атомарность операций с несколькими элементами.

Ограничение размера элемента и советы по моделированию данных

Ограничение DynamoDB в 400 KB на элемент влияет на моделирование данных. Для больших полезных нагрузок (например, изображений и больших документов) храните двоичные данные в S3, а в DynamoDB сохраняйте только ключ объекта S3. Для глубоко вложенных иерархических данных моделируйте каждый тип узла с помощью собственного шаблона ключа раздела, используя моделирование одной таблицы: одна таблица содержит несколько типов сущностей, различаемых префиксом ключа раздела и шаблоном ключа сортировки.

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

Быстрая проверка

Проверьте своё понимание концепций AWS Solutions Architect (SAA-C03) из этого урока.

Итоги урока

В этом уроке Вы узнали, что таблицы DynamoDB содержат элементы без фиксированной схемы размером не более 400 KB, простые первичные ключи используют только ключ раздела, а составные ключи дополнительно используют ключ сортировки для запросов по диапазону, а ключи раздела с высокой кардинальностью предотвращают появление горячих разделов. Для эффективного доступа используйте Query вместо Scan. Далее мы рассмотрим режимы выделенной и потребляемой по мере необходимости пропускной способности.

Часто задаваемые вопросы

Урок «Таблицы, элементы и первичные ключи» бесплатный?

Да — полный текст урока «Таблицы, элементы и первичные ключи» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Cloud & IT Cert Prep, подпишись на CoddyKit PRO. Курс Cloud & IT Cert Prep содержит 4 уроков всего.

Чему я научусь в уроке «Таблицы, элементы и первичные ключи»?

Спроектируйте таблицы DynamoDB с ключами разделов и составными первичными ключами и изучите ограничения хранения на уровне элементов. Ты практикуешь Cloud & IT Cert Prep с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Cloud & IT Cert Prep?

Предыдущий опыт не требуется. Cloud & IT Cert Prep на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Таблицы, элементы и первичные ключи»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Cloud & IT Cert Prep?

Да. Каждый урок Cloud & IT Cert Prep включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Таблицы, элементы и первичные ключи
  2. Выделенная и платная по факту ёмкость
  3. Глобальные и локальные вторичные индексы
  4. Потоки DynamoDB и глобальные таблицы
← Назад к Cloud & IT Cert Prep