2014-09-30 2 views
3

아래 구조로 dynamoDB에 테이블을 생성하고 싶습니다. 자습서 및 문서의 모든 곳DynamoDB : 중첩 된 JSON 구조로 테이블을 만들려면 어떻게해야합니까?

{ 
    "CartId": 123, 
    "UserId": 356, 
    "CartItems": [ 
    { 
     "ProductId":100, 
     "Quantity": 50 
    }, 
    { 
     "ProductId": 121, 
     "Quantity": 51 
    } 
    ] 
} 

는 우리가 단지 테이블의 속성 유형 아래 가질 수 있다고 말한다 끈

숫자의
  • 설정의

    1. 설정

    2. 이진 세트

    위의 구조를 DynamoDB에 저장하는 방법을 생각할 수 없습니다. 도와 주실 수 있겠습니까?

    자바의 객체 매퍼 Api를 사용하고 있습니다. 이 특정 테이블 구조에 매핑 할 수있는 클래스를 어떻게 만들 수 있는지 알려주는 것이 좋을 것입니다.

  • 답변

    -4

    JSON 구조에서 알 수 있듯이 DynamoDB를 간단한 플랫 키 - 값 저장소로 생각할 때 관계형 데이터베이스처럼 DynamoDB를 만들려고합니다. 그래서 당신이 제안한 테이블 구조 대신, 나는 그것을 평평하게하고 고객이 장바구니에 가지고있는 각 항목에 대해 많은 행을 가지고 있습니다. 이와 예

    Primary hashkey (UserId) | Hash range key (CartId) | ProductId | Qty 
    356      123      100   50 
    356      123      121   51 
    

    들어

    하면 이것은 인덱싱하고 쿼리 가능 데이터를 저장하는 DynamoDB의 방식이다 (123) 키 범위 356의 기본 키를 제공함으로써 카트의 모든 항목을 얻을 수있다. 그러나 이것은 두 개의 별도 행을 저장한다는 의미입니다.

    이와 같은 형식은 많은 이점을 가지고 있습니다. 특히 ProductId에 로컬 보조 색인을 만들어 몇 명의 고객이 특정 제품을 장바구니에 넣었는지 확인할 수 있습니다. 또한이 테이블 구조에서 오브젝트 매퍼가 어떻게 작동하는지 쉽게 알아야합니다.

    +0

    안녕하세요, 고맙습니다, 제 제안이 내 문제를 해결했습니다 :). 지금 당신이 지정한 형식을 사용하고 있습니다. 또한, 나는 HashKey가 유일해야한다는 인상하에있었습니다. 명확히 해 주셔서 감사합니다. – Amit

    +0

    해시 키는 전체 데이터 집합에 대해 고유해야합니다. 5 명의 사용자 만 있지만 수백만 개의 행이있는 경우 성능이 저하됩니다. 이 특별한 사용 사례의 경우 기본 해시 키가 고유하지 않은 것이 좋습니다. Amazon DynamoDB가 관심있는 경우 성능을 위해 데이터를 분할하는 방법에 대해 자세히 읽을 수 있습니다. – kurtzbot

    +6

    이 답변은 잘못되었습니다. DynamoDB 테이블은 단순하지 않은 (파티션 키 만) 또는 복합 (파티션 및 정렬 키) 일 수있는 고유하지 않은 기본 키가있는 항목을 가질 수 없습니다. * 파티션 키 = 해시 키. 정렬 키 = 범위 키 – golem

    1

    JSON을 Dynamodb에 String으로 저장할 수 있습니다. 그것은 모두 당신이 데이터로 무엇을하고 싶은지, 어떻게 검색하는지에 달려 있습니다.

    DynamoDB Java API는 Java 객체를 String으로 변환하는 Marshaller 객체를 도입하여이를 저장하고 DynamoDB 속성에서 자동으로 가져올 수 있습니다.

    +0

    우리가 이것을 어떻게 달성 할 수 있습니까? – Amit

    +0

    DynamoDB는 문자열 집합을 원하지만 문자열을 저장할 수도 있다고 말했습니까? 어떤 SDK/프로그래밍 언어를 사용하고 있습니까? –

    +0

    자바를 사용하고 있습니다. – Amit

    0

    이 질문을 할 때 데이터 유형을 사용할 수 있었는지는 확실하지만 (그렇지 않은 경우도 있음) 요즘은 CartItems에 List 데이터 형식을 사용하고 각 장바구니 항목은 Map 데이터 유형 .

    참조 : 나는 솔루션을 쉽게 찾을 생각하지 않았기 때문에 오래된 질문에 DynamoDB Data Types

    2

    게시. 희망이 사람을 도움이됩니다.

    1 단계 : 원하는 구조를 반영하는 복잡한 Java 객체를 만듭니다.

    List<HashMap<String, Integer>> cartItems = new ArrayList<HashMap<String, Integer>>(); 
        HashMap<String, Integer> item1 = new HashMap<String, Integer>(); 
        item1.put("ProductId", 100); 
        item1.put("Quantity", 50); 
        cartItems.add(item1); 
        HashMap<String, Integer> item2 = new HashMap<String, Integer>(); 
        item2.put("ProductId", 121); 
        item2.put("Quantity", 51); 
        cartItems.add(item2); 
    

    2 단계 : DynamoDB 항목을 복합 개체로 업데이트합니다.따라서 전화 후

    private void updateAttribute(int id, String newAttribute, Object newValue){ 
        Map<String, Object> newValues = new HashMap<String, Object>(); 
        newValues.put(":value", newValue); 
    
        UpdateItemSpec updateItemSpec = new UpdateItemSpec() 
          .withPrimaryKey("id", id) 
          .withUpdateExpression("set " + newAttribute + " = :value") 
          .withValueMap(newValues); 
    
        siteTable.updateItem(updateItemSpec); 
    } 
    

    과 :

    "CartItems": [ 
        { 
         "ProductId": 100, 
         "Quantity": 50 
        }, 
        { 
         "ProductId": 121, 
         "Quantity": 51 
        } 
        ], 
    

    내가하지 않은 :

    updateAttribute(123, "CartItems", cartItems); 
    

    새로 추가 된 카트 항목처럼 DynamoDB의에 표시 속성

    나는 헬퍼 방법을 사용 upsert 시나리오를 테스트했습니다. 과거에는 upsert 기능이있을 것 같지 않았다 관해서는 https://forums.aws.amazon.com/thread.jspa?threadID=162907

    깊이 중첩 된 항목으로 읽 http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.AccessingItemAttributes.html#DocumentPaths

    4

    가장 간단한 방법은 @DynamoDBDocument

    1. 은 메이븐 의존성을 추가 사용할 수 있습니다

      <dependency> 
           <groupId>com.amazonaws</groupId> 
           <artifactId>aws-java-sdk-dynamodb</artifactId> 
           <version>1.11.186</version> 
      </dependency> 
      
    2. POJO 만들기

      그런 다음 customerRepository.save(customer) 전화
      @DynamoDBTable(tableName = "Customer") 
      public class Customer 
      { 
          @DynamoDBHashKey 
          @DynamoDBAutoGeneratedKey 
          private String id; 
      
          private String firstName; 
      
          private List<Foo> fooList; 
      } 
      
      @DynamoDBDocument 
      public static class Foo { 
          private String name; 
      } 
      
    3. 16,는 저장소

      @EnableScan 
      public interface CustomerRepository extends CrudRepository<Customer,String> 
      

      을 만듭니다. 그 결과는 다음과 같이 될 것입니다 :

      { 
          "firstName": "Test", 
          "fooList": [ 
          { 
           "name": "foo" 
          }, 
          { 
           "name": "foo2" 
          } 
          ], 
          "id": "e57dd681-8608-4712-a39a-f3e0f31a5e27", 
      ] 
      } 
      
    +0

    안녕하세요, 우리가이 솔루션을 사용할 때 내부 클래스에 새 필드를 추가하면 어떻게됩니까? 다이너 모 데이터베이스에 존재합니까? – Bhargav

    +0

    예, 거기에있을 것입니다. – sendon1982

    관련 문제