Tabele, elementy i klucze główne
Zaprojektują tabele DynamoDB z kluczami partycji i złożonymi kluczami głównymi oraz poznają limity przechowywania na poziomie elementów.
Tabele, elementy i klucze główne to bezpłatna lekcja Cloud & IT Cert Prep na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Cloud & IT Cert Prep, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Cloud & IT Cert Prep zawiera 4 lekcji w sumie.
DynamoDB: magazyn klucz-wartość NoSQL
Amazon DynamoDB to w pełni zarządzana, bezserwerowa baza danych klucz-wartość i dokumentowa, zaprojektowana z myślą o czasie odpowiedzi liczonym w pojedynczych milisekundach przy dowolnej skali. W przeciwieństwie do relacyjnych baz danych DynamoDB jest bez schematu — każdy element może mieć inny zestaw atrybutów, o ile zawiera klucz główny.
DynamoDB przechowuje dane w tabelach, które są kontenerami najwyższego poziomu, analogicznymi do tabel SQL. Tabele są automatycznie rozprowadzane między wieloma węzłami pamięci masowej w różnych strefach AZ, co zapewnia wbudowaną nadmiarowość bez konieczności konfigurowania jej przez Państwa.
Tabele i elementy
Tabela DynamoDB zawiera kolekcję elementów, z których każdy jest kolekcją atrybutów. Atrybuty są wartościami określonych typów: String (S), Number (N), Binary (B), Boolean (BOOL), Null (NULL), List (L), Map (M) oraz typy Set (SS, NS, BS).
Każdy element tabeli musi zawierać atrybuty klucza głównego — wszystkie pozostałe atrybuty są opcjonalne i mogą różnić się między elementami. Pojedynczy element może mieć rozmiar najwyżej 400 KB, uwzględniając wszystkie nazwy i wartości atrybutów.
# Example DynamoDB item structure (JSON)
{
'UserId': {'S': 'user-abc-123'},
'Timestamp': {'N': '1719000000'},
'Username': {'S': 'alice'},
'Score': {'N': '4200'},
'Tags': {'SS': ['premium', 'verified']}
}Prosty klucz główny: tylko klucz partycji
Prosty klucz główny składa się z pojedynczego atrybutu zwanego kluczem partycji (nazywanym również kluczem haszującym). DynamoDB stosuje wewnętrzną funkcję skrótu do wartości klucza partycji, aby określić, w której partycji pamięci masowej znajduje się element. Wszystkie elementy o tej samej wartości klucza partycji są przechowywane razem.
W przypadku prostego klucza głównego żadne dwa elementy w tabeli nie mogą mieć tej samej wartości klucza partycji — jednoznacznie identyfikuje ona każdy element. Ten projekt sprawdza się w tabelach, w których dane są zawsze pobierane na podstawie unikatowego identyfikatora, takiego jak identyfikator użytkownika lub zamówienia.
# 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_REQUESTZłożony klucz główny: klucz partycji i sortowania
Złożony klucz główny wykorzystuje zarówno klucz partycji, jak i klucz sortowania (nazywany również kluczem zakresu). Elementy z tym samym kluczem partycji są przechowywane razem i sortowane według wartości klucza sortowania, co umożliwia wykonywanie zapytań zakresowych w obrębie partycji.
Ten projekt jest niezwykle elastyczny: wiele elementów może współdzielić ten sam klucz partycji, o ile ich klucze sortowania są różne. Na przykład tabela Orders może używać CustomerId jako klucza partycji i OrderDate jako klucza sortowania, umożliwiając pobieranie wszystkich zamówień klienta posortowanych według daty.
# 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_REQUESTProjektowanie klucza partycji i gorące partycje
Wybór odpowiedniego klucza partycji to najważniejsza decyzja projektowa w DynamoDB. Dobry klucz partycji charakteryzuje się wysoką krotnością (wieloma różnymi wartościami) i równomiernie rozkłada dostęp między partycjami. Niewłaściwy wybór prowadzi do powstawania gorących partycji, do których kierowany jest nieproporcjonalnie duży ruch, co powoduje ograniczanie przepustowości.
Należy unikać następujących antywzorców: używania flagi logicznej (tylko dwie wartości), daty grupującej wszystkie dzisiejsze zapisy lub pola statusu o małej krotności. Dobrymi wyborami są: identyfikator użytkownika, identyfikator urządzenia, losowy UUID lub wartości złożone, takie jak tenantId#entityType.
PutItem, GetItem i DeleteItem
Trzy podstawowe operacje na elementach DynamoDB to:
- PutItem: zapisuje nowy element lub całkowicie zastępuje istniejący element o tym samym kluczu głównym
- GetItem: pobiera pojedynczy element na podstawie dokładnego klucza głównego (wymaga pełnego klucza — klucza partycji oraz, w przypadku klucza złożonego, klucza sortowania)
- DeleteItem: usuwa element na podstawie dokładnego klucza głównego
Wszystkie trzy operacje są atomowe na poziomie elementu. Domyślnie GetItem używa odczytów o spójności ostatecznej; dodanie --consistent-read wymusza odczyt o silnej spójności, który zawsze zwraca najnowszą zapisaną wartość.
# 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-readUpdateItem i wyrażenia warunkowe
UpdateItem modyfikuje określone atrybuty istniejącego elementu bez całkowitego zastępowania go, w przeciwieństwie do PutItem. Można dodawać i usuwać atrybuty lub atomowo wykonywać działania arytmetyczne na atrybutach typu Number (np. zwiększać licznik).
Wyrażenia warunkowe umożliwiają określenie, że operacja ma zakończyć się powodzeniem tylko wtedy, gdy warunek jest spełniony. Można na przykład aktualizować status elementu tylko wtedy, gdy jego bieżąca wartość to PENDING. Umożliwia to implementowanie wzorców optymistycznego blokowania bez transakcji i jest kluczową techniką projektowania rozwiązań 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 a Scan
Query pobiera elementy, które mają tę samą wartość klucza partycji, opcjonalnie filtrując je na podstawie warunków dotyczących klucza sortowania. Query jest wydajne — odczytuje tylko wskazaną partycję. Można używać warunków klucza sortowania, takich jak begins_with, between, =, <, >, aby zawęzić wyniki w obrębie partycji.
Scan odczytuje każdy element tabeli, a następnie stosuje opcjonalne wyrażenie filtrujące. Skanowanie jest kosztowne w przypadku dużych tabel i należy go unikać w produkcyjnych wzorcach zapytań. Jeśli często potrzebują Państwo operacji Scan, należy ponownie rozważyć projekt tabeli lub dodać indeks dodatkowy globalny.
# 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"}}'Odczyty silnie spójne a ostatecznie spójne
DynamoDB przechowuje trzy kopie danych w wielu strefach dostępności (AZ). Odczyty ostatecznie spójne (domyślne) mogą zwrócić nieco nieaktualną wartość, jeśli ostatni zapis nie został jeszcze rozpropagowany do wszystkich kopii — zużywają jednak połowę jednostek przepustowości odczytu w porównaniu z odczytami silnie spójnymi.
Odczyty silnie spójne zawsze zwracają najnowszy zatwierdzony zapis, ale kosztują dwa razy więcej RCU i nie są dostępne dla indeksów Global Secondary Index. Odczyty ostatecznie spójne należy wybierać w przypadku obciążeń o dużej przepustowości, z przewagą odczytów, a odczyty silnie spójne tylko wtedy, gdy aplikacja wymaga absolutnie najnowszych danych.
Transakcje DynamoDB
DynamoDB obsługuje transakcje ACID za pośrednictwem TransactWriteItems i TransactGetItems. Transakcja może grupować do 100 operacji zapisu obejmujących wiele elementów, a nawet wiele tabel, zapewniając, że wszystkie operacje zakończą się powodzeniem albo wszystkie zostaną atomowo wycofane.
Transakcji należy używać w scenariuszach takich jak przelewanie pieniędzy między kontami (obciążenie jednego elementu i uznanie innego) lub rezerwowanie miejsca (atomowe sprawdzenie dostępności i rezerwacja). Transakcje kosztują dwa razy więcej standardowych RCU/WCU, dlatego należy ich używać tylko wtedy, gdy atomowość operacji obejmujących wiele elementów jest rzeczywiście wymagana.
Limit rozmiaru elementu i wskazówki dotyczące modelowania danych
Limit 400 KB na element w DynamoDB wpływa na sposób modelowania danych. W przypadku dużych ładunków (np. obrazów i dużych dokumentów) dane binarne należy przechowywać w S3, a w DynamoDB zapisywać tylko klucz obiektu S3. W przypadku głęboko zagnieżdżonych danych hierarchicznych każdy typ węzła należy modelować za pomocą własnego schematu klucza partycji, używając single-table design — jedna tabela przechowuje wiele typów encji rozróżnianych za pomocą prefiksu klucza partycji i schematu klucza sortowania.
Single-table design minimalizuje liczbę tabel i umożliwia wydajną realizację wzorców dostępu dzięki umieszczaniu powiązanych elementów w tej samej partycji. Jest to zaawansowana technika, która zmniejsza nakład pracy operacyjnej i poprawia wydajność w przypadku złożonych wzorców dostępu.
Szybkie sprawdzenie
Sprawdź swoją wiedzę na temat zagadnień AWS Solutions Architect (SAA-C03) omówionych w tej lekcji.
Podsumowanie lekcji
W tej lekcji poznali Państwo następujące zagadnienia: tabele DynamoDB zawierają elementy bez określonego schematu, których rozmiar jest ograniczony do 400 KB, proste klucze główne składają się wyłącznie z klucza partycji, natomiast klucze złożone dodatkowo zawierają klucz sortowania umożliwiający zapytania zakresowe, a klucze partycji o dużej liczbie różnych wartości zapobiegają powstawaniu gorących partycji. W celu wydajnego uzyskiwania danych należy używać Query zamiast Scan. W następnej części omówimy tryby przepustowości: provisioned i on-demand.
Często zadawane pytania
Czy lekcja „Tabele, elementy i klucze główne” jest bezpłatna?
Tak — pełny tekst „Tabele, elementy i klucze główne” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Cloud & IT Cert Prep, przejdź na CoddyKit PRO. Kurs Cloud & IT Cert Prep zawiera 4 lekcji w sumie.
Co nauczysz się w „Tabele, elementy i klucze główne”?
Zaprojektują tabele DynamoDB z kluczami partycji i złożonymi kluczami głównymi oraz poznają limity przechowywania na poziomie elementów. Ćwiczysz Cloud & IT Cert Prep z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Cloud & IT Cert Prep?
Nie wymagamy żadnego doświadczenia. Cloud & IT Cert Prep w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Tabele, elementy i klucze główne”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Cloud & IT Cert Prep?
Tak. Każda lekcja Cloud & IT Cert Prep zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Tabele, elementy i klucze główne
- Pojemność aprowizowana a tryb On-Demand
- Globalne i lokalne indeksy pomocnicze
- Strumienie DynamoDB i tabele globalne