DynamoDB şemasız mı?
Evet. DynamoDB şemasızdır. Birincil anahtar dışında, bir tablo oluşturduğunuzda hiçbir öznitelik ya da veri türü tanımlamazsınız. Her öğe kendi ayrı öznitelik kümesini taşıyabilir ve bunlar öğeden öğeye serbestçe değişebilir — dolayısıyla veri modelinizi şema göçleri çalıştırmadan uyarlarsınız.
Önden ne tanımlarsınız
Yalnızca birincil anahtarı: bir bölüm anahtarı (zorunlu) ve isteğe bağlı bir sıralama anahtarı, artı türleri. Geri kalan her şey serbesttir. Sütun bildirmezsiniz.
Öğe başına ne değişir
Aynı tablodaki herhangi iki öğenin öznitelikleri tamamen farklı olabilir. Bir öğe email ve status tutabilir; bir diğeri orderTotal ve iç içe bir address map'i tutabilir. DynamoDB ne yazarsanız onu saklar.
Şemasızlık nerede durur
Şemasızlığın kesin bir sınırı vardır. Birincil anahtar her yazmada doğrulanır; başka hiçbir şey doğrulanmaz. Ortak hiçbir özniteliği olmayan iki öğe aynı tabloya şikâyetsiz girer:
await client.send(
new PutItemCommand({
TableName: 'people',
Item: {pk: {S: 'USER#1'}, email: {S: 'a@b.c'}, status: {S: 'active'}}
})
);
await client.send(
new PutItemCommand({
TableName: 'people',
Item: {
pk: {S: 'ORDER#1'},
orderTotal: {N: '42.5'},
address: {M: {city: {S: 'Madrid'}}},
tags: {SS: ['a', 'b']}
}
})
);İkisi de başarılı olur. Şimdi aynı bölüm anahtarını string yerine sayı olarak yazın:
ValidationException: One or more parameter values were invalid: Type mismatch for key
HTTP 400Ve pk'yi tamamen atlayın:
ValidationException: One of the required keys was not given a value
HTTP 400Şemanın tamamı o iki reddir. Anahtar özniteliği var olmak ve AttributeDefinitions'ta bildirilen türle eşleşmek zorundadır. Bunun ötesindeki her şey yazıldığı gibi kabul edilir.
Bir yazım hatası da geçer. staus'un status olması gerektiğini yazma anında size hiçbir şey söylemez.
Neden işe yarar
- Göç yok — istediğiniz zaman öznitelik ekleyin ya da çıkarın.
- Karışık varlıklar — birçok varlık türü tek bir tabloyu paylaşabilir (tek tablo tasarımı).
- Geliştirilebilir — model, gereksinimler değiştikçe değişir.
Dayandığın her biçimi veritabanı değil, uygulaman zorunlu kılar.
Şemasızlığın gevşetmediği şeyler
Şemasızlık yalnızca anahtar olmayan öznitelikler için geçerlidir. DynamoDB'nin diğer her limiti hâlâ bağlar:
- Öğe başına 400 KB — öznitelik adları ve değerleri tavanı birlikte doldurur.
- Bir değerin içindeki map ve list'ler için 32 yuvalama düzeyi.
- Tek bir öznitelik adı için en fazla 65.535 bayt.
BatchWriteItemçağrısı başına en fazla 25 öğe.
Bir öğeye status string'i koyup sonrakinde atlayabilirsin, ama ikisinde de 500 KB'lık bir blob saklayamazsın. Yazmadan önce bir payload'u ölçmek için öğe boyutu hesaplayıcısını kullan ve bir tabloda varlık türlerini karıştırırken tek tablo tasarımını oku.
DynoTable'da: herhangi bir tabloda Ayarlar'ı aç ve dizinle. Çıkarılan şema örneklenmiş öğelerden kurulur ve dürüstçe etiketlenir — beyan ettiğini değil, yazdığını gösterir. Yerel indeksin nasıl örneklediği ve yenilendiği için Tablo genel bakışı ve dizinleme'e bak.
Daha derine inin
Karışık öğeler için tek tablo tasarımı ve type özniteliği desenine bakın. Gerçek öğe biçimlerini incelemek için DynoTable'ı indirin.
Kaynaklar
- Core components of Amazon DynamoDB — Amazon DynamoDB Developer Guide
- What is Amazon DynamoDB? — Amazon DynamoDB Developer Guide
- Data modeling for DynamoDB tables — Amazon DynamoDB Developer Guide
En son 2026-07-13 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.
2026-07-28 tarihinde, Node v24.18.0 üzerinde @aws-sdk/client-dynamodb 3.1095.0 ile DynamoDB Local 3.3.0'a karşı yeniden üretildi. Her iki ValidationException mesajı da birebir motor çıktısıdır.