Başlangıç6 dakikalık okuma

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 Scan finishes but before the results are returned. Therefore, a Scan consumes 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.
  • UpdateItem bir upsert'tür. "If an item with the specified key does not exist, UpdateItem creates 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.

Güncellendi