2012-11-27 11 views
5

Jestem całkiem nowy w AWS Amazon i jego API dla Javy, więc nie jestem do końca pewien, jaka jest najskuteczniejsza metoda będzie próbować. Zasadniczo próbuję skonfigurować bazę danych, która będzie przechowywać identyfikator projektu, jego status, a także zasobnik i lokalizację po przesłaniu do wiadra S3 przez użytkownika. Mam problem z uzyskaniem listy wszystkich identyfikatorów projektów, które mają status "gotowych" w ramach atrybutu statusu. Wszystkie projekty, które mają status "gotowy", muszą mieć załadowane swoje numery identyfikacyjne do tablicy lub listy tablicowej, aby można je było później wykorzystać. Wszelkie zalecenia?Amazon DynamoDB, aby uzyskać przedmioty o wartości atrybutu ... (Java API)

Odpowiedz

4

Aby to zrobić, użyj interfejsu API skanowania. Oznacza to jednak, że dynamo będzie musiał przyjrzeć się każdemu elementowi w tabeli i sprawdzić, czy jego atrybut "status" jest równy "gotowy". Koszt tej operacji będzie duży i pobierze opłatę za przeczytanie każdego elementu w tabeli.

kod będzie wyglądał tak:

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); 

Jest sposób, aby to lepiej, choć wymaga denormalizing danych. Spróbuj zachować drugą tablicę z hashiem "status" i kluczem zakresu "ID projektu". Jest to dodatek do istniejącej tabeli. Umożliwiłoby to korzystanie z interfejsu API zapytań (znacznie tańszego kuzyna skanera) i zapytanie o wszystkie elementy za pomocą skrótu "gotowy". Otrzymasz listę potrzebnych identyfikatorów projektów, które możesz następnie pobrać z tabeli ID projektu, którą już masz.

Kod tego będzie wyglądać mniej więcej tak:

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

QueryResult result = client.query(queryRequest); 

Wadą tego podejścia jest to, trzeba zaktualizować dwie tabele w dowolnym momencie zaktualizować pole stanu, i trzeba upewnić się, że utrzymanie ich w synchronizacja. Dynamo nie oferuje transakcji, więc musisz być gotowy na wypadek, gdy aktualizacja do głównej tabeli projektu się powiedzie, ale twoja tabela statusu drugiego nie. Lub odwrotnie.

Dalsze odniesienia: http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/QueryAndScan.html

+0

To wygląda jak będzie to rade. Proces jest już obsługiwany w przepływie pracy typu wodospadu, więc jeśli jakakolwiek jego część zakończy się niepowodzeniem przed ostatnim krokiem (który aktualizowałby ten status), kończy się wcześnie, więc status zostanie zaktualizowany tylko wtedy, gdy wszystko inne zakończy się powodzeniem. Dzięki za pomoc! – DGolberg

+0

Półtora roku później dostaję do tego wiadomość, ale czuję się winna: DynamoDB opublikował indeksy pomocnicze, które zostały stworzone do tego celu bez konieczności zarządzania innym stołem. Sprawdź je! –

+0

Lol, zauważyłem to również i rozważałem również aktualizację postu. Ale tak, indeks wtórny jest ładny ... chociaż wciąż istnieją przypadki, w których oryginalna odpowiedź nadal ma zastosowanie. Osoby zainteresowane tym postem, pamiętaj, aby przeczytać dokumentację przy podejmowaniu decyzji, czy są one dla ciebie najlepsze, szczególnie w sekcji "Używanie indeksów oszczędnie" w dokumentacji, jeśli zastanawiasz się dlaczego (dokumentacja dostępna tutaj: http://docs.aws .amazon.com/amazondynamodb/latest/developerguide/GuidelinesForLSI.html). – DGolberg

Powiązane problemy