Amazon DynamoDB’de Verileri Düzenlemek için Sıralama Anahtarlarını Kullanma
Orijinal makale: Link (AM Grobelny)
Bir Amazon DynamoDB tablosunu verilerle doldurmaya başlamak kolaydır. Ancak, verilerinizi düzenlemeyi önceden düşünmezseniz, daha sonra veri alma seçeneklerinizi sınırlayabilirsiniz.
Veri organizasyonu ve veri alımı için planlama, bir tablo tasarlarken kritik adımlardır. Uygun veri organizasyonu olmadan, verileri almak için tek seçenek bölüm anahtarı (partition key) veya tablonun tam taraması ile almaktır. Bu alma yöntemleri bir tabloda fiyat ve performans açısından sınırlı veya pahalıdır.
Bu yazıda, sıralama anahtarlarıyla (sort keys) veri alımı için tabloları optimize etmenin gerçek hayattan örneklerini keşfediyorum. Sıralama anahtarlarını yalnızca verileri gruplamak ve düzenlemek için değil, aynı zamanda bir tablodaki ögelere karşı sorgulama için ek araçlar sağlamak için de kullanırsınız.
Bölüm anahtarlarına kısa bir giriş
Verilerinizi nasıl düzenleyeceğinizi daha iyi anlamak için verilerin DynamoDB’de nasıl depolandığını anlamak önemlidir. DynamoDB tablosundaki her öge, DynamoDB belgelerinde açıklandığı gibi tablo için bir birincil anahtar (primary key) oluşturmanızı gerektirir. Birincil anahtar, bir bölüm anahtarı veya bir bölüm anahtarı ile sıralama anahtarının birleşimi olabilir. Birincil anahtar tablo genelinde benzersiz olmalıdır.
Birincil anahtar olarak yalnızca bir bölüm anahtarı kullanıldığında, bir bölüm anahtarı için uygun olmayan bir seçim, tablonun genel performansını etkileyebilir. Örneğin, aynı birincil anahtarın sık sık alınması, iş hacminin aşıldığı istisnalara ve tablonuza kısıtlama isteklerine neden olabilir.
Bölüm anahtarları ve en iyi uygulamaları hakkında daha fazla bilgi için AWS Veritabanı Blogunda Doğru DynamoDB Bölüm Anahtarını Seçme gönderisine bakın.
Veri alma seçeneklerini genişletmek için sıralama anahtarlarını kullanma
Bazı durumlarda, tablo oluştururken birincil anahtar olarak yalnızca bir bölüm anahtarı sağlayabilirsiniz. Bu durumlarda, bölüm anahtarıyla veya tarama işlemiyle bir tablodaki tüm ögeleri döndürerek veri alımıyla sınırlandırılırsınız. Bu şekilde bir tablo oluşturmak basittir ve bazı durumlarda ihtiyacınız olan tek şey basit olan seçenektir.
Ancak, veri kümeniz büyüdükçe tablo taramaları fiyat ve performans açısından maliyetli bir yük haline gelebilir. Tablo taramaları, okuma kapasitenizi hızla tüketebilir ve böylece faturanızı artırabilir. Okuma ve yazma kapasitesi birimleri ve bu birimlerin DynamoDB faturanızı nasıl etkilediği hakkında daha fazla bilgi için DynamoDB belgelerinde Amazon DynamoDB Fiyatlandırması ve Okuma ve Yazma İşlemleri için Çıktı Kapasitesi bölümüne bakın. Ek olarak, ögeleri her zaman yalnızca bölüm anahtarıyla alamazsınız. Belirli bir tarihten önce müşteri siparişlerini alma ve bir kategoriyle eşleşen tüm ürünleri alma örneklerini düşünün. Bir tabloya sıralama anahtarı eklemek, taramaların ve bölüm anahtarlarının ötesinde daha fazla veri alma işlevi açar.
Sıralama anahtarlarının yalnızca bir sorgu tarafından döndürülen ögeler için bir sıralama düzeni belirlemek için olmadığını unutmayın. Bu gönderide gösterildiği gibi, sıralama anahtarları, ögeleri almak için doğrudan sıralamaya bağlı değildir, bunun yerine veri alma seçeneklerini genişletir.
Bir bölüm anahtarı ile sıralama anahtarını birleştirdiğinizde, bir bileşik anahtar (composite key) oluştururlar ve bu bileşik anahtar, bir tablodaki bireysel ögeler için birincil anahtardır. Bileşik anahtarla, sıralama anahtarına karşı KeyConditionExpression içeren sorguları kullanma yeteneği kazanırsınız. Bir sorguda, bir anahtara göre değerlendiren ve döndürülen ögeleri sınırlayan karşılaştırma operatörlerini kullanarak koşullu ifadeler yazmak için
KeyConditionExpression‘ı kullanabilirsiniz. Diğer bir deyişle, ögeleri sıralama anahtarı değerlerine göre dahil etmek, hariç tutmak ve eşleştirmek için özel operatörler kullanabilirsiniz.
Sıralama anahtarı ile sorgulama ve zamana göre sorgulamanın hızlı bir örneğini inceleyelim. Belirli bir tablonun sıralama anahtarının, sayı olarak saklanan bir Unix zaman damgası olduğunu varsayalım. Bu durumda, < karşılaştırma operatörünü kullanarak tüm ögeleri belirli bir zamandan önce döndüren bir anahtar koşula sahip bir sorgu oluşturabilirsiniz. Bu zamana bağlı alma örneğini daha sonra daha derinlemesine ele alacağım.
Aralıklarla çalışma
Sorgu oluşturmak için sıralama anahtarlarıyla birlikte aralıkları kullanırsınız.
KeyConditionExpressions sorgusunda aşağıdaki operatörler kullanılabilir:
- =
- <
- >
- <=
- >=
- between
- begins_with
between operatörü, bir aralığı belirlemek için iki değeri kabul eder ve
begins_with bir dizenin bir alt dize ile başlayıp başlamadığını kontrol eder. Bu operatörlerin çoğunu sayısal değerler üzerinde kullanabilirsiniz, ancak
begins_with operatörü, verileri sorgulamanın bazı ilginç yollarını etkinleştirir.
Örneğin, konumları nasıl gruplayabileceğinizi düşünün. Amerika Birleşik Devletleri’nde konumlar genellikle şehir, eyalet ve ülkeye göre gruplandırılır. Bir ögenin konumunu
city-state-country şablonuyla bir dizede saklayan bir sıralama anahtarı oluşturduğumuzu varsayalım.
city-state-country sıralaması, konum verilerinin en spesifik kısmı ile başlar. Sonuç olarak,
begins_with operatörünü kullanan sorgularınız şehirle sınırlıdır. Konum dizesinin sırasını
country-state-city olarak değiştirirsem, bunun yerine
begins_with operatörü üç düzeyde sorgulama sağlar:
begins_with(USA)– Amerika Birleşik Devletleri’nde bulunan tüm ögeleri döndürür.
begins_with(USA-TX)– Yalnızca Teksas’ta bulunan ögeleri döndürür.
begins_with(USA-TX-Houston)– Yalnızca Houston’da bulunan ögeleri döndürür.
Konumları bu şekilde gruplarken, yalnızca yaratıcılığınızla sınırlısınız.
Veri organizasyonu ve alımı için sıralama anahtarları nasıl kullanılır?
Sıralama anahtarları bilgilerini gerçek hayattaki örneklere uygulamak, gelecekte oluşturacağınız tablolarda veri organizasyonu ve alımı için kullanabileceğiniz tekrarlanabilir teknikleri ve kalıpları vurgular.
Önce olay izleme, pub/sub olaylar, servis günlükleri ve benzerleri gibi günlük verilerini ele alalım. Bazı veri kaynağı örnekleri, Salesforce gibi iş üretkenliği ve hizmet olarak yazılım (SaaS) platformlarından tıklama akışları,
systemd günlükleri, olay günlükleri veya akış API’leri olabilir.
Örnek 1: Günlük verileriyle çalışma
Basit bir örnekle başlıyorum ve daha önce Unix zaman damgalarını tartışırken bahsettiğim zamana bağlı alma kavramını uyguluyorum. Birden fazla cihazdan telemetri verileri topladığınızı varsayalım. Her cihazın bir cihaz kimliği, her benzersiz olay için bir olay kimliği ve bir zaman damgası vardır. Günlükler genellikle günlükte yakalanan olaylarla ilişkili zaman verilerine sahiptir. Genellikle, belirli bir zaman aralığını sorgulayarak günlükleri alırsınız.
DynamoDB konsoluna gidin ve yeni bir tablo oluşturun. Günlük verilerini düzenlemek için, aşağıdaki ekran görüntüsünde gösterildiği gibi günlük verilerini oluşturan hizmete özgü bir bölüm anahtarı sağlarsınız. Örneğin, bölüm anahtarı bir
hostname veya
deviceID değeri olabilir. Sıralama anahtarı için bireysel olayın
timestamp değerini sağlayın.
Ardından,
between operatörü ve iki zaman damgası, > veya < kullanarak sorgular oluşturabilirsiniz. Aşağıdaki ekran görüntüsünde gösterildiği gibi,
deviceID‘si
123 olan bir aygıt için üç kayıt depolanıyor. Unix zaman damgası olarak depolanan tarihler şunlardır: 29 Ağustos 2018, saat 12:00 UTC; 4 Eylül 2018, saat 13:00 UTC; ve 9 Temmuz 2011, saat 13:00 UTC. Zaman damgalarını insan tarafından okunabilir biçimlere dönüştürmek için Epoch Unix Zaman Damgası Dönüştürücü web sitesine bakın.
4 Eylül 2018 saat 12:00 UTC’den önceki tüm günlükleri sorgulamak için, < operatörünü ve o zamana ait Unix zaman damgasını (
1536019200) kullanarak bir sorgu yayınlıyorum.
Örnek 2: Sohbet mesajlarıyla çalışma
Bu örnek, sıralama anahtarı için bir şablon dizesi kullanma konseptine dayanmaktadır. Daha önce tartıştığım konum verileri örneğini hatırlayın. Bu yeni durum için bir sohbet uygulamasından gelen verileri değerlendiriyorum. Başvuru için, kullanıcıların bir kullanıcı adı olduğunu ve sohbet odalarının benzersiz kimlikleri olduğunu ve her sohbet mesajını saklamak istediğinizi varsayalım. Mesajları kullanıcıya ve ayrıca kullanıcı ve zaman çerçevesine göre alabilmek istiyorum.
chatroomID, bölüm anahtarı görevi görebilir. Meşgul bir sohbet odanız varsa, bölümler arasında veri erişimini dağıtmak için
chatroomID‘ye
seattle-1 veya
seattle-2 gibi artan bir sayısal sonek ekleyebilirsiniz. Bu uygulama, etkin bölüm oluşturmayla ilgili sorunlardan kaçınmanıza yardımcı olabilir. Sıcak bölümler ve bir tablo için en iyi bölüm anahtarını seçme hakkında daha fazla bilgi için, AWS Veritabanı Blogunda Doğru DynamoDB Bölüm Anahtarını Seçme konusuna bakın.
Bileşik sıralama anahtarı (compound sort key) şu biçimi izlemelidir:
user_name#datetime.
datetime değeri için,
yyyy-MM-dd:HH:mm:ss gibi bir dize gösterimi kullanmak, en çok sorgulama seçeneklerini sağlar.
Bu örnekte, aşağıdaki ekran görüntüsünde gösterildiği gibi mesajlar iki kullanıcı için çeşitli zamanlarda saklanır.
Bileşik sıralama anahtarının oluşturulması,
begins_with operatörüyle sorgulamak için birkaç seçenek sunar. Oda ve belirli bir kullanıcı tarafından sınırlandırılan mesajları sorgulayabilirsiniz.
chatMessageIdentifier şablon dizesinin tarih bölümü, en az özelden en özele doğru düzenlenir. Bir sohbet odasındaki mesajları kullanıcıya göre sorgulayabilir ve örneğin bir yıla (
amsg#2018) veya bir yıl ve belirli bir aya (
amsg#2018-08) ait tüm mesajları döndürebilirsiniz.
Sorgulama, ödünleşimlerle birlikte gelir. Örneğin, şablon dizesini
user_name ile başlatmayı seçtiğimiz için burada zamana dayalı verileri sorgulayamazsınız. Zaman sizin için daha önemli bir alma faktörüyse, şablon dizenizi farklı şekilde sıralayabilir veya orijinal şablon dizesini tersine çeviren ek bir sıralama anahtarıyla ikincil bir dizin ekleyebilirsiniz:
datetime#user_name.
Örnek 3: Belgeleri izleme
Son olarak, sıralama anahtarının rastgele bir değer olduğu ve aynı nesne hakkında farklı veri kümelerinin alınmasına yardımcı olmak için değişebileceği daha gelişmiş bir kullanım durumunu ele alalım. Gerçek hayattan bir belge takip sistemi örneğini kullanıyorum. Belge takip sistemleri genellikle bir belgeye kimin izinleri olduğu, belgenin hangi sürümde olduğu, belgenin nerede saklandığı ve belgeyle ilgili meta veriler hakkında verileri tutar. Bölüm anahtarını belgeye bağlı benzersiz bir kimlik olacak şekilde ayarladım ve belge izleme sisteminde bu değişkenlerin her birini temsil etmek için sıralama anahtarını kullanıyorum.
Bu genel ancak bağlama duyarlı sıralama anahtarını kullanarak,
metadata‘nın bir sıralama anahtarı değerini ekleyerek rastgele meta verilerin depolanmasına ve alınmasına izin verebilirim. Veya
permissions sıralama anahtarı değeriyle bu belgeye kimlerin erişebileceğini belirtmek için erişim tanımlayıcılarını depolamak için alanı kullanabilirim. Veritabanı şemasını önceden tanımlamak yerine, uygulamamın belgeler hakkında ne tür veriler depoladığımın bağlamını sağlamasına izin verebilirim. Bu esneklik sayesinde uygulamam veritabanı yerine verinin tanımını sağlayabilir.
Önceki ekran görüntüsünde görebileceğiniz gibi, verilerin yapısı her öge için farklılık gösterir ve her rastgele sıralama anahtarı değeriyle ilgili bilgileri depolar. Bu ögelerden birini almak için = operatörünü kullanarak ihtiyacım olan belge bilgisi türünü içeren bir sorgu yayınlarım. Örneğin, belge meta verilerini almak için sorgumda = operatörünü ve
metadata değerini kullanıyorum.
Bu belge izleme örneğine dayanarak, sıralama anahtarı için gelişmiş bir kullanım örneğini ele alalım. Belge sürüm oluşturmayı uygulamak için aynı
documentInfo sıralama anahtarını kullanabilirim. Bir kez daha, bir şablon dizgisi ile
begins_with operatörünü kullanarak, bir belgenin her versiyonu için tabloda ögeler yaratırım. Sıralama anahtarı değeri şu şablona bağlıdır:
v_# burada #, sürüm kimliği veya belge sürüm numarasıdır. Sıralama anahtarı değeri
v_0, belgenin en son sürümünü depolamak için ayrılmıştır ve her zaman, en son eklenen belge sürümünün yinelenen bir satırıdır. Bu örnekte
v_0,
v_2 ile aynı verileri depolar çünkü
v_2 en son belgedir.
Bu model ile, aşağıdaki ekran görüntüsünde gösterildiği gibi, tam bir belge geçmişinin
begins_with(v_) ile alınmasını sorgulayabilirsiniz.
Özet
Sıralama anahtarları, DynamoDB’nin sorgulama yeteneklerine daha fazla güç katabilir. Ancak, biraz öngörü kullanmalısınız.
begins_with operatöründen yararlanan dize şablonlarını kullanmayı ve dizeyi en az özel verilerden en özel verilere göre sıralamayı unutmayın. Sıralama anahtarı ayrıca, almaya yardımcı olmak için
metadata ve
permissions gibi benzersiz, rastgele dize değerlerini depolayabilir.
Daha yoğun veri sorgulama, arama ve analiz ihtiyaçlarınız olduğunda DynamoDB verilerini diğer hizmetlerle birlikte kullanmaktan korkmayın. Örneğin, Amazon OpenSearch Service‘e akış verilerini yüklemek için Amazon DynamoDB Streams‘i kullanabilirsiniz. DynamoDB’nin bazı güçlü yönleri, otomatik ölçeklendirme özelliğinde ve veri depolamak için basit arayüzünde yatmaktadır. Diğerleri, Amazon DynamoDB Accelerator (DAX) gibi zorlu uygulamalar için hızlı yanıt sürelerini ve sunucusuz mimarilerde eşleştirmesini içerir. Buna göre düşünür ve planlarsanız, verileri sorgulamak ve almak zor olmak zorunda değildir.