Başlangıç7 dakikalık okuma

DynamoDB Item Tabanlı Eylemler

DynamoDB'nin API'si üç aileye ayrılır: bir item üzerinde birincil anahtarıyla çalışan item tabanlı eylemler, tek bir partition içinde bir aralığı okuyan Query ve her şeyi okuyan Scan. Bu kılavuz ilk aile — en sık kullandığınız dört işlem: GetItem, PutItem, UpdateItem, DeleteItem. Bunlar DynamoDB'nin sunduğu en ucuz, en hızlı çağrılardır ve aralarındaki ayrımları doğru anlamak (özellikle Put vs Update) bir sınıf kazara veri kaybı hatasını önler.

DynamoDB'nin item tabanlı işlemleri nelerdir?

DynamoDB'nin item tabanlı işlemleri, tek bir item'a tam birincil anahtarıyla erişen dört çağrıdır: GetItem onu okur, PutItem onu oluşturur veya tamamen değiştirir, UpdateItem belirli attribute'ları yerinde değiştirir ve DeleteItem onu kaldırır. Her biri tam olarak bir item'ı hedefler ve bu da onları en hızlı, en ucuz çağrılar yapar — çok sayıda item okuyan Query ve Scan'in aksine.

  • GetItem — bir item'ı tam birincil anahtarıyla okur.
  • PutItem — bir item'ı oluşturur veya tamamen değiştirir.
  • UpdateItem — bir item'ı oluşturur veya yerinde belirli attribute'larını değiştirir.
  • DeleteItem — bir item'ı tam birincil anahtarıyla siler.
  • Dördü de tam birincil anahtarı gerektirir (partition key, tablo varsa sort key dahil) — tam olarak bir item'a erişirler.
  • PutItem item'ın tamamını üzerine yazar; UpdateItem cerrahidir — bunları karıştırmak attribute'ların sessizce kaybolma şeklidir.

Belirleyici özellik: tek item, tam anahtar

Her item tabanlı eylem tam birincil anahtarıyla tek bir item'ı hedefler. Bunları hızlı ve ucuz yapan da budur — DynamoDB partition key'i hash'ler, doğrudan item'a gider, biter. Filtreleme yok, tarama yok. Tam anahtarı bilmiyorsanız, bunlar doğru araç değildir; Query ve Scan bunun içindir.

Diyelim ki USER#<id> ile anahtarlanmış kullanıcı hesapları çalıştırıyorsunuz:

PK: USER#204   email, displayName, plan, createdAt
  • USER#204 üzerinde GetItem → doğrudan o kullanıcı.
  • USER#204 üzerinde DeleteItem → o senyı kaldırır.

İkisi de kesin anahtarı gerektirir. Anahtar yoksa, item tabanlı eylem yok.

PutItem vs UpdateItem — sizi ısıran ayrım

İçselleştirmeye değer ayrım budur:

  • PutItem item'ın tamamını yazar. USER#204 zaten varsa ve yalnızca {email, displayName} ile PutItem yaparsanız, mevcut plan ve createdAt attribute'ları gider — bir put item'ın tamamını değiştirir, birleştirmez.
  • UpdateItem yalnızca adını verdiğiniz şeyi değiştirir. Bir SET email = … içeren UpdateItem diğer her attribute'a dokunmaz ve item yoksa onu oluşturur (bir upsert).
Öğenin tamamını değiştirBazı öznitelikleri değiştir, kalanıkoruMevcut bir öğeyi değiştir?PutItemUpdateItem

Pratik kural: mevcut bir item'ı değiştirmek için UpdateItem'a başvurun ve PutItem'ı yalnızca gerçekten "bu item'ı tam yeni durum olarak yaz" anlamına geldiğinde kullanın. Hem PutItem hem de UpdateItem bir koşul ifadesi kabul eder, böylece yazma işlemini koşullu yapabilirsiniz ("yalnızca zaten yoksa").

DynoTable'da item tabanlı eylemler

Bu aksiyonların arkasındaki ham API çağrılarını görmek ister misiniz? Altta yatan ifadeleri ve türlü değer haritalarını DynamoDB expression builder'da birleştirin ve düz JSON bir item'ı API'nin türlü formatına DynamoDB JSON dönüştürücü ile dönüştürün.

DynoTable'da aynı çalışma görseldir: ızgarada bir item açıp okuyun (bir GetItem), attribute'ları düzenleyip işleyin (bir UpdateItem), bir satır ekleyin veya değiştirin (bir PutItem) ya da birini silin — aynı anda bir item.

DynoTable'ın Quick View'ında tek bir item'ı okuma; Edit Item ve Copy as JSON eylemleriyle.
DynoTable'ın Quick View'ında tek bir item'ı okuma; Edit Item ve Copy as JSON eylemleriyle.

Tuzaklar ve sonraki adımlar

  • PutItem item'ın tamamını değiştirir — gerisini kaybetmeden birkaç alanı değiştirmek için UpdateItem kullanın.
  • Tam birincil anahtarı bilmeniz gerekir — anahtar yoksa item eylemi değil, Query/Scan.
  • Aynı anda çok item mı? Bunları tek tek döngüye sokmayın — batch işlemleri onları daha az gidiş dönüşe katlar.
  • Eski/yeni değeri geri mi istiyorsunuz? Bir ardıl GetItem yerine ReturnValues ayarlayın.
  • İlgili: query vs scan çok okuma tarafını kapsar.

API kodu yazmadan item'ları okumak, yazmak ve silmek mi istiyorsunuz? DynoTable'ı indirin ve tablolarınızla doğrudan çalışın.

Maliyet: tek item, tek sıçrama

Item tabanlı okumalar, DynamoDB'deki en ucuz adreslenebilir erişimdir. 2 KB'lık bir satırda bir GetItem, 1 nihai tutarlı RCU tüketir (yukarı yuvarlanmış tek bir 4 KB'lık blok). Partition key'i ve sort key'i bildiğiniz için aynı satırı döndüren bir Query aynı kapasiteye mal olur — ancak yalnızca partition key'i bilir ve uygulama kodunda filtrelerseniz, partition'daki her item için ödersiniz.

İşlemGereken anahtarlarTipik kullanımKapasite biçimi
GetItemTam birincil anahtarid'ye göre nokta okumaitem başına 1 blok
PutItemTam birincil anahtarTüm item'ı oluştur veya değiştirKB başına 1 WCU, yuvarlanmış
UpdateItemTam birincil anahtarAttribute'ları yamalaYazılan item boyutu üzerinden
DeleteItemTam birincil anahtarSatırı kaldırItem boyutunda bir yazmayla aynı
Query + filtrePartition (+ isteğe bağlı sort koşulu)Tek partition'da çok itemEşleşen item'ların toplamı

Temsili bir item'ı item boyutu hesaplayıcısına yapıştırın, sonra sıcak bir yol döngü içinde GetItem yerine iyi anahtarlanmış tek bir Query kullandığında saniyedeki istek sayısıyla fiyatlandırma hesaplayıcısında çarpın.

Yazmalarda condition expression'lar

Hem PutItem hem UpdateItem, isteğe bağlı condition expression'ları kabul eder. Tipik desenler:

  • attribute_not_exists(pk) put üzerinde — yarış olmadan yalnızca-oluştur ekleme.
  • attribute_exists(pk) update üzerinde — yanlışlıkla bir taslak oluşturmayı reddeder.
  • plan = :old update üzerinde — iyimser eşzamanlılık; başka bir yazıcı planı önce değiştirdiyse yeniden dene.

DeleteItem de koşulları destekler — örneğin yalnızca status = :closed ise sil. Koşullar ayrı bir okuma ücreti eklemez; DynamoDB bunları yazma denemesi sırasında saklanan item'a karşı değerlendirir.

Koşulları görsel olarak DynamoDB expression builder'da oluşturun; ConditionExpression ile ExpressionAttributeNames ve ExpressionAttributeValues'ı SDK çağrınıza kopyalayın.

İdempotenslik ve üzerine yazma güvenliği

Koşulsuz bir PutItem, tüm item üzerinde son-yazan-kazanır. Webhook işleyicileri veya SQS tüketicileri için, put'ları işlenmiş bir işaretçi attribute'u üzerinde attribute_not_exists ile eşleştirin ya da attribute_not_exists(processed) ile korunan SET processed = :true içeren bir UpdateItem kullanın.

Bir denetim günlüğü için önceki attribute değerlerine ihtiyaç duyduğunuzda, öncesinde bir GetItem yapmak yerine aynı UpdateItem üzerine ReturnValues ekleyin — tek gidiş dönüş, okuma/yazma yarışı yok.

Doğru item eylemini seçmek

AmaçÇağrıKoruma
Kullanıcı id'sine göre profil okumaGetItem
Yoksa kullanıcı oluşturmaPutItemattribute_not_exists(pk)
E-postayı değiştir, diğer alanları koruUpdateItemisteğe bağlı email <> :old
Tüm yapılandırma blob'unu değiştirPutItemyalnızca yük eksiksizse
Kapatılmış talebi kaldırDeleteItemstatus = :closed
Bilinen anahtarlarla 50 talep okumaBatchGetItemseri hâlde 50× GetItem değil

DynoTable'da yazmaları hazırlama

DynoTable, UpdateItem ve PutItem'ı commit'ten önce local olarak hazırlar. Attribute farklarını gözden geçirir, isteğe bağlı PartiQL kontrolleri çalıştırır, sonra commit edersiniz — bu da yukarıdaki gerçek API çağrılarına eşlenir. Toplu satır silmeleri, arka planda işlenmemiş item'lar için yeniden denemeyle BatchWriteItem'a batch'lenir.

SDK kodu üretimi için, update cümlelerini expression builder'da bir araya getirin ve üretilen SDK v3 parçacığını işleyici testlerinizin yanına yapıştırın.

Güncellendi