2012-11-27 28 views
5

Tôi khá mới với AWS của Amazon và API của nó cho Java, vì vậy tôi không chắc chắn chính xác phương pháp hiệu quả nhất cho những gì tôi cố gắng làm sẽ là. Về cơ bản, tôi đang cố gắng thiết lập một cơ sở dữ liệu sẽ lưu trữ ID của một dự án, đó là trạng thái, cũng như thùng và vị trí khi được người dùng tải lên một thùng S3. Điều tôi đang gặp phải là nhận danh sách tất cả các ID dự án có trạng thái "sẵn sàng" trong thuộc tính trạng thái. Bất kỳ dự án nào có trạng thái "sẵn sàng" cần phải có số ID của chúng được tải vào một mảng hoặc danh sách mảng để tham khảo sau này. Bất kỳ đề xuất?Amazon DynamoDB Nhận các mục có giá trị thuộc tính ... (Java API)

Trả lời

4

Cách thực hiện việc này là sử dụng API quét. Tuy nhiên, điều này có nghĩa là máy phát điện sẽ cần xem xét mọi mục trong bảng của bạn và kiểm tra xem thuộc tính "trạng thái" có bằng "sẵn sàng" hay không. Chi phí của hoạt động này sẽ lớn và sẽ tính phí bạn đọc tất cả các mục trong bảng của bạn.

Mã này sẽ giống như thế này:

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

Có một cách để làm điều này tốt hơn, mặc dù nó đòi hỏi denormalizing dữ liệu của bạn. Hãy thử giữ một bảng thứ hai với một khóa băm của "trạng thái", và một phím phạm vi của "dự án ID". Đây là ngoài bảng hiện tại của bạn. Điều này sẽ cho phép bạn sử dụng API truy vấn (người anh em họ rẻ hơn nhiều của scan) và yêu cầu nó cho tất cả các mục có khóa băm "sẵn sàng". Điều này sẽ giúp bạn có được một danh sách các ID dự án mà bạn cần, và sau đó bạn có thể lấy chúng từ bảng ID dự án mà bạn đã có.

Mã cho điều này sẽ giống như thế:

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

QueryResult result = client.query(queryRequest); 

Nhược điểm của phương pháp này là bạn phải cập nhật hai bảng bất cứ khi nào bạn cập nhật các trường trạng thái, và bạn phải chắc chắn rằng bạn giữ chúng trong đồng bộ hóa. Dynamo không cung cấp tính giao dịch, vì vậy bạn phải sẵn sàng cho trường hợp bản cập nhật cho bảng dự án chính thành công, nhưng bảng trạng thái phụ của bạn không thành công. Hoặc ngược lại.

Để tham khảo thêm: http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/QueryAndScan.html

+0

Có vẻ như nó sẽ thực hiện thủ thuật. Quá trình này đã được xử lý trong luồng công việc kiểu thác, vì vậy nếu bất kỳ phần nào của nó thất bại trước bước cuối cùng (sẽ cập nhật trạng thái này) thì nó sẽ kết thúc sớm, vì vậy trạng thái sẽ chỉ được cập nhật nếu mọi thứ khác thành công. Cảm ơn đã giúp đỡ! – DGolberg

+0

Một năm rưỡi sau, tôi nhận được một điều tuyệt vời cho điều này, nhưng tôi cảm thấy tội lỗi: DynamoDB đã phát hành các chỉ mục phụ, được tạo ra cho mục đích này mà không có sự phức tạp của bạn phải quản lý một bảng khác. Kiểm tra xem chúng ra! –

+0

Lol, tôi cũng nhận thấy điều đó và cũng đang xem xét cập nhật bài đăng. Nhưng yeah, chỉ số phụ là tốt đẹp ... mặc dù vẫn còn trường hợp câu trả lời ban đầu của bạn vẫn áp dụng. Bất kỳ ai quan tâm đến bài đăng này, hãy chắc chắn đọc tài liệu khi quyết định xem chúng có tốt nhất cho bạn hay không, đặc biệt là phần "Sử dụng chỉ mục ít" của tài liệu nếu bạn thắc mắc tại sao (tài liệu có tại đây: http://docs.aws .amazon.com/amazondynamodb/latest/developerguide/GuidelinesForLSI.html). – DGolberg

Các vấn đề liên quan