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,Scanolmadan, 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 anahtar | Bileşik anahtar | |
|---|---|---|
| Nitelikler | Yalnızca bölüm anahtarı | Bölüm anahtarı + sıralama anahtarı |
| Benzersizlik | Bölüm anahtarı değeri | Değerlerin çifti |
| Bölüm başına birden fazla öğe | Hayır | Evet |
Bir aralık Query etme | Hayır (yalnızca GetItem) | Evet (begins_with, between, >) |
| Doğal uyum | Kimliğe göre arama | Zaman 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:
| deviceId | readingTs | tempC | humidity |
|---|---|---|---|
| DEV#a1b2 | 2026-06-23T08:00:00Z | 21.4 | 48 |
| DEV#a1b2 | 2026-06-23T08:05:00Z | 21.7 | 47 |
| DEV#a1b2 | 2026-06-23T08:10:00Z | 22.1 | 46 |
| DEV#c9d8 | 2026-06-23T08:00:00Z | 19.8 | 55 |
Üç 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 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:00Zgibi bir sıralama anahtarı, tek bir bölüm altında varlık türlerini karıştırmanıza ve onlarıbegins_withile 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.