2012-11-27 14 views
5

Amazon'un AWS'sine ve Java için API'sine oldukça yeniyim, bu yüzden ne yaptığım için en etkili yöntemden tam olarak emin değilim yapmaya çalışıyorum. Temel olarak, bir kullanıcının kimliğini, durumunu ve aynı zamanda bir kullanıcı tarafından bir S3 paketine yüklendiğinde kova ve konum depolayacak bir veritabanı kurmaya çalışıyorum. Sorun yaşıyorum durum özniteliği altında "hazır" durumu olan tüm proje kimlikleri listesi almaktır. "Hazır" durumundaki herhangi bir projede, daha sonra başvurmak üzere ID numaralarının bir diziye veya arraylist'e yüklenmesi gerekir. Herhangi bir tavsiye?Amazon DynamoDB Nitelik değerlerine sahip olan öğeleri al ... (Java API)

cevap

4

Bunu yapmanın yolu, tarama API'sini kullanmaktır. Ancak, bu, dinamo'nun masanızdaki her öğeye bakması ve "durum" özelliğinin "hazır" durumuna eşit olup olmadığını kontrol etmesi anlamına gelir. Bu işlemin maliyeti büyük olacak ve masanızdaki her öğeyi okumak için sizden ücret alacaktır.

kodu şöyle görünecektir: o verilerinizi denormalizing gerektirir olsa

Condition scanFilterCondition = new Condition() 
    .withComparisonOperator(ComparisonOperator.EQ.toString()) 
    .withAttributeValueList(new AttributeValue().withS("ready")); 
Map<String, Condition> conditions = new HashMap<String, Condition>(); 
conditions.put("status", scanFilterCondition); 

ScanRequest scanRequest = new ScanRequest() 
    .withTableName("MasterProductTable") 
    .withScanFilter(conditions); 

ScanResult result = client.scan(scanRequest); 

, bu daha iyi yapmak için bir yolu yoktur. "Status" hash anahtarıyla ikinci bir tabloyu ve "proje kimliğini" içeren bir aralık anahtarını tutmayı deneyin. Bu mevcut tablonuza ek olarak. Bu, Sorgu API'sini (taramanın çok daha ucuz kuzeni) kullanmanıza ve "hazır" olan bir hash anahtarıyla tüm öğeleri sormanızı sağlar. Bu, ihtiyacınız olan proje kimliklerinin bir listesini alacaktır ve bunları daha önce sahip olduğunuz proje kimliği tablosundan alabilirsiniz.

bunun için kodu aşağıdaki gibi olacaktır: Bu yaklaşıma olumsuz durum alanını güncelleştirmek her iki tablo güncellemek zorunda olduğunu

QueryRequest queryRequest = new QueryRequest() 
    .withTableName("ProductByStatus") 
    .withHashKeyValue(new AttributeValue().withS("ready")); 

QueryResult result = client.query(queryRequest); 

ve size saklayın emin olmak zorunda senkron. Dynamo işlemselliği sunmaz, bu nedenle ana proje tablosundaki güncellemenin başarılı olduğu durum için hazır olmanız gerekir, ancak ikincil durum tablonuz bunu yapmaz. Ya da tam tersi. Detaylı bilgi için

: hile yapmak olacak gibi http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/QueryAndScan.html

+0

Bu görünüyor. Süreç şelale tipi bir iş akışında zaten ele alınır, bu nedenle eğer herhangi bir kısmı son adımdan önce başarısız olursa (bu durum güncellenecektir) erken sona erer, bu nedenle durum yalnızca her şey başarılı olursa güncellenir. Yardım için teşekkürler! – DGolberg

+0

Bir buçuk yıl sonra, bunun için bir hak kazandım, ama kendimi suçlu hissediyorum: DynamoDB, başka bir tabloyu yönetmek zorunda kalmanın karmaşıklığı olmadan bu amaç için yapılan ikincil endeksleri yayınladı. Onları kontrol et! –

+0

Lol, Ben de bunu fark ettim ve ayrıca gönderiyi güncellemeyi de düşündüm. Ama evet, ikincil indeks güzel ... yine de orijinal cevabın hala geçerli olduğu durumlar var. Bu gönderiyle ilgilenen herkes, sizin için en iyisi olup olmadığına karar verirken dokümantasyonu okuduğunuzdan emin olun, özellikle de neden merak ediyorsanız belgelerin "Dizinin Endeksini Kullanın" bölümüne bakın (http://docs.aws adresine buradan ulaşabilirsiniz) .amazon.com/amazondynamodb/son/developerguide/GuidelinesForLSI.html). – DGolberg