Orta5 dakikalık okuma

DynamoDB'yi Değişen (Değişebilir) Bir Attribute Üzerinde Sıralamak

Item'ları kendi sırasında sorgulayabilmek için bir attribute etrafında bir sort key modellersiniz — sonra attribute değişir. Bir bilet durumu, bir siparişin hali, bir görevin önceliği. İşte DynamoDB'nin önünüze attığı sorun: bir anahtar attribute'unu yerinde güncelleyemezsiniz. Bir birincil anahtar, item'ın ömrü boyunca değişmezdir. Anahtarın parçası olan bir değeri değiştirirseniz, bir item'ı düzenlemiyorsunuz — onu taşıyorsunuz demektir ve DynamoDB bunu açıkça yapmanızı zorunlu kılar.

DynamoDB'de bir sort key'i değiştirebilir misiniz?

Sort key, birincil anahtarın bir parçasıdır ve DynamoDB'de anahtar attribute'ları değişmezdir — UpdateItem ile bir partition key veya sort key değeri düzenlenemez, ayrıca "item taşı" gibi bir işlem de yoktur. Değeri değiştirmek için eski item'ı silip yenisini eklemeniz ya da değişken değeri temel-tablo anahtarı dışında bir GSI sort key'inde tutmanız gerekir.

  • Anahtar attribute'ları değişmezdir. Bir partition veya sort key değerini UpdateItem ile değiştiremezsiniz — DynamoDB'nin "item taşı" işlemi yoktur.
  • Bir anahtar değerini değiştirmek için eski item'ı silip yenisini koyarsınız — ideal olarak atomik olması için bir transaction içinde.
  • Daha iyisi: değişken değeri temel-tablo anahtarının dışında tutun ve onun yerine bir GSI sort key'ine koyun — GSI anahtarları değişebilir, çünkü temel item'ı güncellemek index girişini yeniden yayar.
  • Erişim deseni izin verdiği her yerde değişmeyen sort key'ler seçin (zaman damgaları, değişmez id'ler).

Sorun: sıralamak istediğiniz, ama sürekli değişen bir durum

Diyelim ki bir destek masası çalıştırıyorsunuz ve bir ekibin biletlerini duruma göre sıralı listelemek istiyorsunuz, bu yüzden durumu sort key'e koyuyorsunuz:

PK: TEAM#7   SK: STATUS#open#TICKET#8842

Şimdi bilet pending'e geçiyor. Sort key'i STATUS#pending#TICKET#8842 olarak yalnızca UpdateItem yapmak istersiniz — ama DynamoDB bir anahtar attribute'unu değiştiren her yazmayı reddeder. Anahtar, item'ın adresidir; adresi yerinde düzenleyemezsiniz. Sıralamak için seçtiğiniz durum, tam da yerinde durmayan şeydir.

Seçenek 1: sil ve yeniden oluştur (atomik olarak)

Değer temel-tablo anahtarında yaşamak zorundaysa, onu değiştirmek eski item'ı kaldırıp yenisini yazmak demektir:

1. DeleteItem  PK=TEAM#7  SK=STATUS#open#TICKET#8842
2. PutItem     PK=TEAM#7  SK=STATUS#pending#TICKET#8842  (aynı attribute'lar)

Bunu bir TransactWriteItems içinde yapın, böylece silme ve put ya ikisi de başarılı olur ya da ikisi de başarısız — aksi halde aralarındaki bir çökme bileti kaybeder veya çoğaltır. Bu işe yarar, ama her durum değişikliği artık iki yazma artı bir transaction'dır; ara sıra olan değişiklikler için uygun, sık olanlar için maliyetli.

Seçenek 2: değişebilir değeri temel anahtarın dışında tutun (tercih edilen)

Daha temiz tasarım: temel-tablo anahtarını değişmez bir şey (bilet id'si) yapın ve değişken, sıralanabilir değeri bir GSI sort key'ine koyun.

Temel:  PK: TICKET#8842   status: "open"   teamId: TEAM#7
GSI:    GSI1PK: TEAM#7    GSI1SK: STATUS#open#TICKET#8842

Şimdi durumu değiştirmek, temel item'ın status attribute'u üzerinde sade bir UpdateItem'dır — ki DynamoDB buna izin verir, çünkü status bir temel-tablo anahtarı değildir. DynamoDB ardından GSI girişini otomatik olarak yeni sıralı konumuna yeniden yayar. Tek yazma, transaction yok, silme dansı yok.

EvetHayır, bir GSI sort key'iDurum open'dan pending'edeğişirDeğer bir temel-tabloanahtarında mı?Bir transaction içinde sil +yeniden oluşturSade UpdateItem; GSI yenidenyayar

Ödünleşim: GSI nihai tutarlıdır ve fazladan depolama/yazma maliyeti vardır — ama sık değişen bir değer için bu, her değişiklikte sil-ve-yeniden-oluşturmaktan çok daha ucuzdur.

DynoTable'da anahtarları tasarlamak

DynamoDB expression builder ile hem temel okuma hem de GSI okuması için anahtar koşullarını oluşturup önizleyin.

DynoTable'da ardından sorgunun hangi index üzerinden çalışacağını seçer ve değişken değerin GSI üzerinde sıralanırken temel öğenin değişmez anahtarını koruduğunu izlersiniz — gerçek veriler üzerinde her iki okuma yan yana.

DynoTable'da temel item değişmez bir anahtar korurken durum-sıralı bir GSI'yi sorgulama.
DynoTable'da temel item değişmez bir anahtar korurken durum-sıralı bir GSI'yi sorgulama.

Tuzaklar + sonraki adımlar

  • Bir anahtar attribute'unu asla UpdateItem ile değiştirmeyi denemeyin — reddedilir; anahtar değerleri item'ın ömrü boyunca sabittir.
  • Onu taşımanız gerekiyorsa, sil+put işlemini bir transaction içinde yapın — asla iki korumasız yazma olarak değil.
  • Hem sıraladığınız hem de değiştirdiğiniz herhangi bir attribute için değişmez temel anahtarlar + bir GSI tercih edin.
  • GSI nihai tutarlılığını unutmayın — yeniden sıralanmış giriş kısa bir yayma gecikmesinden sonra görünür.
  • İlgili: sort-key stratejileri, GSI vs LSI, transactions.

Değişebilir bir attribute'un bir GSI üzerinde temel tabloya kıyasla nasıl sıralandığını görmek mi istiyorsunuz? DynoTable'ı indirin ve index'lerinizi doğrudan keşfedin.

Güncellendi