DynamoDB Verisini Görüntüleme, Gezme ve Düzenleme
Bir DynamoDB tablosunda yaptığınız her "bakma" ya da "değiştirme", küçük bir API işlemi
kümesinden birine karşılık gelir — GetItem, Query, Scan, PutItem, UpdateItem,
DeleteItem. Altta ilişkisel bir tablo görüntüleyici yoktur: "bir tabloya göz atmak"
harfiyen bir Scan'dir ve "bir satırı düzenlemek", bir
karşı UpdateItem'dır. Her tıklamanın hangi işleme
karşılık geldiğini bilmek, ucuz bir okuma ile istemeden çalıştırdığınız bir tam tablo
taraması arasındaki farktır.
DynoTable tam olarak bu işlemlerin üzerinde bir GUI'dir — hangisini çalıştırmak üzere olduğunuzu ve maliyetini, istek hatta çıkmadan önce gösterir.
Bir DynamoDB tablosuna nasıl göz atılır
Bir tabloyu "içinde ne var" diye açmak bir Scan'dir — tablodaki ya da dizindeki her
öğeyi okur (AWS:
"A Scan operation in Amazon DynamoDB reads every item in a table or a secondary index.").
Küçük tablolarda sorun değil; büyük bir tabloda ise
query ile scan sayfasında anlatılan klasik maliyet
tuzağıdır.
Tek bir Scan en fazla 1 MB veri döndürür, sonra bir sonraki sayfayı çekmeniz için size
bir LastEvaluatedKey verir — yani "tüm tabloya göz atmak" aslında bir sayfalama
döngüsüdür
(AWS:
"A single Scan request can retrieve a maximum of 1 MB of data" ve
"the LastEvaluatedKey from a Scan response should be used as the ExclusiveStartKey for the next Scan request").
İmlecin nasıl çalıştığı ve burada neden ofset tarzı sayfa numaraları olmadığı için bkz.
sayfalama.
DynamoDB verisi nasıl filtrelenir / taranır
Bir sizi taramadan kurtarmaz. DynamoDB filtreyi okuma bittikten sonra uygular, yani sakladığınız satırlar için değil, taranan her öğe için ödersiniz.
A filter expression is applied after a
Scanfinishes but before the results are returned. Therefore, aScanconsumes the same amount of read capacity, regardless of whether a filter expression is present. — AWS Scan docs
Yanıt bunu görünür kılar: ScannedCount, "the number of items evaluated, before any
ScanFilter is applied" iken Count filtreden sağ çıkanlardır
(AWS).
Küçük bir Count'un yanındaki yüksek bir ScannedCount, verimsiz bir taramanın
imzasıdır.
Bir DynamoDB tablosu nasıl sorgulanır
Query ucuz ve hedefli okumadır — ama bir bölüm anahtarı ister.
AWS
şöyle diyor: "You must provide the name of the partition key attribute and a single value
for that attribute. Query returns all items with that partition key value.
Optionally, you can provide a sort key attribute and use a comparison operator
to refine the search results."
Yani bir Query yalnızca tek bir bölüm anahtarı altındaki öğeleri okur, isteğe bağlı
olarak bir sıralama anahtarı koşuluyla daraltılır — asla tüm tabloyu değil. Bölüm anahtarı
yoksa Query de yoktur: yeniden bir Scan'e düşersiniz. Bu seçim, DynamoDB'deki en
önemli tek maliyet kararıdır; tam dökümü
query ile scan sayfasında.
us-east-1 bölgesinde on-demand modda, bir tabloyu "göz atmak" için açmak, incelenen öğe
başına nihai tutarlı okumada 4 KB başına 0,5 RCU faturalandıran sayfalanmış bir Scan
çalıştırır — 1 KB'lık satırlardan oluşan 10 GB'lık bir tabloda GUI ile kaydırıp
her şeyi yüklemek 2,5 milyon RCU mertebesindedir. Tek bir bölüm anahtarına yapılan
hedefli bir Query ise yalnızca o öğe koleksiyonunu okur. Göz atma ile sorgulamayı
fiyat hesaplayıcıda karşılaştırın.
KeyConditionExpression / FilterExpression ifadesini yer tutucu sözdizimini elle
yazmadan kurmak için
DynamoDB Expression Builder aracını kullanın —
API'nin beklediği ad/değer haritalarının tam olarak aynısını üretir.
DynamoDB'de bir öğe nasıl düzenlenir
Tek bir öğeyi düzenlemek, onun tam birincil anahtarına karşı bir UpdateItem'dır.
Öğenin tamamını yeniden yazmazsınız — yalnızca değiştirdiğiniz attribute'ları adlandıran
bir verirsiniz:
UpdateItem
Key: { "PK": "USER#42", "SK": "PROFILE" }
UpdateExpression: SET email = :e, updatedAt = :tİnsanları yanıltan iki gerçek, ikisi de AWS öğe belgelerinden:
- Birincil anahtarın bir kısmını değil, tamamını belirtmelisiniz. bir tabloda bu, bölüm anahtarı ve sıralama anahtarı demektir. Bir satırı keyfi bir attribute üzerinden "düzenleyemezsiniz" — bunun için önce anahtarı bulacak bir tarama gerekir.
UpdateItembir upsert'tür. "If an item with the specified key does not exist,UpdateItemcreates a new item. Otherwise, it modifies an existing item's attributes." Anahtardaki bir yazım hatası, hata vermek yerine sessizce yeni bir öğe yaratır.
Bir öğe nasıl silinir
Yine tam birincil anahtarla anahtarlanmış bir DeleteItem:
"DeleteItem deletes the item with the specified key"
(AWS).
Düzenlemedeki kuralın aynısı — anahtarın tamamı gerekir, dolayısıyla "durumu open olan
tüm satırları sil" tek bir çağrı değildir; anahtarları bulmak için tarar/sorgular, sonra
her birini silersiniz. BatchWriteItem en fazla 25 put/delete isteğini paketler
(AWS:
"The BatchWriteItem operation can contain up to 25 individual PutItem
and DeleteItem requests"), ama her biri yine tek bir anahtarı hedefler — DELETE … WHERE
diye bir şey yoktur.
İç içe / JSON veri nasıl görüntülenir
DynamoDB öğeleri tür etiketli bir hat biçiminde (DynamoDB-JSON) saklanır; burada her değer
bir ya da iki harfli bir tür tanımlayıcısı taşır (S, N, M, L, SS… — tam
tanımlayıcı listesi
AWS veri türleri belgelerinde).
Düz JSON'da küme türü yoktur, dolayısıyla bir dizi gidip gelirken string kümesi (SS)
değil, liste (L) olur — bu bir görüntüleme hatası değil, gerçek bir dönüştürme
sınırlamasıdır. Tam tür haritası
DynamoDB veri türleri sayfasında; bir DynamoDB-JSON
verisini düz JSON'a ve geri çevirmek için
DynamoDB JSON dönüştürücüyü kullanın.
Göz at-ve-düzenle'nin ötesi: DynamoDB'nin yapamadığı sorgulama
Scan/Query/UpdateItem görüntülemeyi ve düzenlemeyi kapsar, ama analiz edemezler —
DynamoDB'de JOIN, GROUP BY ya da COUNT/SUM gibi toplama işlevleri yoktur ve
PartiQL de bunları eklemez: SELECT dilbilgisi yalnızca
SELECT … FROM table [WHERE …] [ORDER BY …] biçimindedir, join ya da gruplama yan tümcesi
içermez
(AWS PartiQL SELECT referansı);
dolayısıyla her ifade tek bir Get/Query/Scan/Put/Update/Delete çağrısına karşılık gelir.
DynoTable'ın SQL Workbench'i bu boşluğu, tablolarınızı DynamoDB'nin gerçek sorgu çalışma
zamanı üzerinden materyalize edip üstünde SQL çalıştırarak doldurur —
DynamoDB'nin erişim deseni kuralları içinde SQL — ama gündelik göz at-ve-düzenle işi
için yukarıdaki işlemler alet çantasının tamamıdır.
SSS
DynamoDB verisini AWS Konsolu olmadan nasıl görüntülerim?
Aynı Scan/Query çağrılarını gönderen bir masaüstü GUI kullanın. AWS Konsolu tablolara
sayfalanmış taramalarla göz atar; DynoTable gibi özel bir istemci de aynısını yapar ama
tüketilen kapasiteyi ve çalıştırdığınız işlemi gösterir.
Bir DynamoDB öğesini nasıl düzenlerim?
Öğenin tam birincil anahtarına karşı, yalnızca değiştirdiğiniz attribute'ları adlandıran
bir SET update expression'ıyla UpdateItem gönderin. Bir GUI'de hücreyi satır içi
düzenleyin — sizin yerinize o UpdateItem'a derlenir.
Filtreleme neden hâlâ tam bir taramaya mal oluyor? Çünkü DynamoDB filtreyi, tarama öğeleri okuduktan sonra uygular. Elenen öğeler de okunur ve ölçülür. Maliyeti düşürmek için taramak yerine bir bölüm anahtarına (ya da bir GSI) göre sorgulayın.
Aynı anda çok sayıda öğeyi güncelleyebilir miyim?
UPDATE … WHERE diye bir şey yok — her UpdateItem/DeleteItem tek bir birincil
anahtarı hedefler. Birden çok öğeyi tek bir atomik istekte değiştirmek için
TransactWriteItems, hepsi başarılı olan ya da hepsi geri alınan en fazla 100 yazma
eylemi uygular. Aksi hâlde anahtarları toplamak için tarar/sorgular, sonra her birini
yazarsınız (BatchWriteItem başına en fazla 25).
Bir DynamoDB Local tablosuna da aynı şekilde göz atabilir miyim? Evet — aynı GUI'yi yerel uç noktaya yöneltin. Bkz. DynamoDB Local.
DynamoDB tablolarına göz atmak, filtrelemek, satır içi düzenlemek ve PartiQL'in çalıştıramadığı SQL'i çalıştırmak ister misiniz? DynoTable'ı indirin.