Başlangıç5 dakikalık okuma

DynamoDB Bileşik Birincil Anahtar

Bir bileşik birincil anahtar iki niteliktir: bir bölüm anahtarı ve bir sıralama anahtarı. Bölüm anahtarı bir öğenin nerede yaşadığına karar verir; sıralama anahtarı öğeleri o bölümün içinde sıralar.

SQL'den geliyorsanız, bunu benzersiz bir id sütunundan çok, tablonun kendisine gömülmüş bir GROUP BY partition, ORDER BY sort olarak düşünün.

DynamoDB bileşik birincil anahtarı nedir?

DynamoDB bileşik birincil anahtarı iki niteliği birleştirir: bir bölüm anahtarı ve bir sıralama anahtarı. Bölüm anahtarı bir öğenin hangi fiziksel bölümde yaşadığına karar verir; sıralama anahtarı öğeleri o bölümün içinde sıralar. Birlikte öğenin benzersiz kimliğini oluştururlar ve tek bir Query'nin tek bir öğe yerine sıralı bir aralık döndürmesine olanak tanırlar.

  • İki parça, iki iş. Bölüm anahtarı öğeyi fiziksel bir bölüme yönlendirir; sıralama anahtarı o bölüm anahtarını paylaşan her öğeyi sıralar.
  • Benzersizlik çifttir. İki öğe, sıralama anahtarları farklı olduğu sürece bir bölüm anahtarı değerini paylaşabilir — tek bir bölümün birçok satır tutmasının yolu budur.
  • Asıl mesele sıralama anahtarıdır. Bir Query'nin bir öğe yerine bir aralık (>=, between, begins_with) döndürmesini sağlayan, Scan olmadan, odur.
  • Anahtarlar skaler olmalıdır. Bölüm ve sıralama anahtarları yalnızca dize, sayı ya da ikili olabilir — map yok, list yok (AWS belgeleri).

Basit anahtar ile bileşik anahtar

Bir basit birincil anahtar yalnızca bir bölüm anahtarıdır. Bir öğeyi benzersiz biçimde tanımlar ve onu GetItem ile geri okursunuz. Hepsi bu — aralık okuması yok, "bana en yeni N'i ver" yok.

Bir bileşik anahtar, sıralama anahtarını ekler ve bu tek ekleme, DynamoDB'yi bir hash map yerine bir veritabanı gibi hissettiren şeydir.

Basit anahtarBileşik anahtar
NiteliklerYalnızca bölüm anahtarıBölüm anahtarı + sıralama anahtarı
BenzersizlikBölüm anahtarı değeriDeğerlerin çifti
Bölüm başına birden fazla öğeHayırEvet
Bir aralık Query etmeHayır (yalnızca GetItem)Evet (begins_with, between, >)
Doğal uyumKimliğe göre aramaZaman serisi, birden çoğa, geçmiş

Bir sensör-okuması tablosu modelleyin

Diyelim ki bir saha sensörü filosundan sıcaklık örnekleri topluyorsunuz. Erişim deseni "bir cihazın okumalarını, en yeniden başlayarak, bir zaman penceresi içinde al"dır. Bu, ders kitabı bir bileşik anahtardır.

Cihaz kimliğini bölüm anahtarı ve okuma zaman damgasını sıralama anahtarı olarak kullanın:

deviceIdreadingTstempChumidity
DEV#a1b22026-06-23T08:00:00Z21.448
DEV#a1b22026-06-23T08:05:00Z21.747
DEV#a1b22026-06-23T08:10:00Z22.146
DEV#c9d82026-06-23T08:00:00Z19.855

Üç DEV#a1b2 okumasının hepsi aynı bölüme düşer, fiziksel olarak bir arada saklanır ve readingTs'e göre sıralanır.

AWS, bölüm anahtarına hash niteliği ve sıralama anahtarına range niteliği der — sıralama anahtarı içinde tarayabileceğiniz bir aralıktır (AWS belgeleri).

İşte öğelerin her bölüm anahtarı altında tek bir öğe koleksiyonuna nasıl çöktüğü:

Bölüm: DEV#a1b2readingTs 08:00readingTs 08:05readingTs 08:10Query deviceId = DEV#a1b2

Bölüm anahtarına karşı tek bir Query, o cihazın her okumasını, zaten zaman damgası sırasında okur — istemcide sıralama yok, ikinci gidiş-dönüş yok.

Aralığı sorgulayın, taramayın

readingTs bir ISO-8601 dizesi olduğundan, kronolojik olarak sıralandığı gibi sözlüksel olarak da sıralanır. Yani bir zaman penceresi okuması bir filtre değil, bir anahtar koşulu aralığıdır:

Query
deviceId  = "DEV#a1b2"
readingTs BETWEEN "2026-06-23T08:00:00Z" AND "2026-06-23T08:10:00Z"

Bu bir KeyConditionExpression'dır — DynamoDB veri döndürmeden önce okumayı daraltır, böylece yalnızca penceredeki öğeler için ödersiniz. Bir FilterExpression okumadan sonra çalışır ve taradığı her şey için sizi faturalandırır; bu, küçük ölçekte Scan tuzağıdır.

İfadenin kendisi, yer tutucular ve türlü değerlerle elle yazmak için zahmetlidir. Onu DynamoDB Expression Builder ile görsel olarak oluşturun ve tam KeyConditionExpression'ı SDK çağrınıza kopyalayın.

Sıralama anahtarını bilerek tasarlayın

Sıralama anahtarı bedava bir üst veri değildir — aralık okumaları için tek koldur, bu yüzden onu sorgularınıza göre şekillendirin.

  • Sıralanabilir bir zaman damgası kullanın. ISO-8601 dizeleri ya da sıfırla doldurulmuş epoch sayıları doğru sıralanır; ham yerelleştirilmiş tarihler sıralanmaz.
  • Birden çoğa aşırı yükleme için ona önek verin. READING#2026-06-23T08:00:00Z gibi bir sıralama anahtarı, tek bir bölüm altında varlık türlerini karıştırmanıza ve onları begins_with ile dilimlemenize izin verir. Bu, tek tablo tasarımına açılan dikiştir.
  • Yüksek kardinaliteli boyutu bölüm anahtarına koyun. Sensör kimliğinin binlerce değeri vardır, bu yüzden yazmaları eşit yayar. Düşük kardinaliteli bir bölüm anahtarı (örn. region) sıcak bir bölüm oluşturur.

Bir bileşik anahtar sizi ne zaman ısırır

Bu bir kolaylık değil, bir taahhüttür. Tuzak: bir bölüm anahtarı seçer, yayınlar, sonra farklı bir gruplamaya ihtiyaç duyan bir erişim deseni keşfedersiniz — "tüm filo boyunca 30°C'nin üzerindeki tüm okumalar".

Temel tablo bunu yanıtlayamaz; bölüm anahtarı sabittir. Seçenekleriniz farklı bir anahtara sahip bir global secondary index ya da yeniden yapılandırmadır.

Anahtar şemasını taahhüt etmeden önce okumalarınızı numaralandırın. Bir birincil anahtarı değiştirmek bir ALTER TABLE değil, bir tablo göçü (migration) demektir.

Sonraki adımlar

Bileşik anahtarlar, öğe koleksiyonlarının, birden çoğa ilişkilerin ve çoğu yararlı indeks tasarımının altındaki temeldir — nereye götürdüklerini görmek için sırada tek tablo tasarımı ve GSI vs LSI'yi okuyun.

KeyConditionExpression'ınızı DynamoDB Expression Builder içinde çizin, ardından gerçek bölümlerinize göz atmak ve sıralama düzeninin kendi tablolarınıza karşı hizalandığını izlemek için DynoTable'ı deneyin.

Güncellendi