2014-04-18 3 views
1

포크, DynamoDB 테이블 구조가 다음 객체에 대한 것이 어떨지 제안 하시겠습니까? 약 2 백만 개의 개체가 있으며, 이메일 및/또는 조직을 통해 검색 할 수 있어야합니다.개체의 DynamoDB 테이블 구조

{ 
    email: '[email protected]', 
    organization: 'foobar' 
} 

해시/범위 키를 어떻게 만들겠습니까? email

내가 테이블에 임의의 id 매개 변수를 추가해야 특정 삭제

  • 특정 organization
  • 에 대한 모든 이메일을 검색 : 나는 한 아래와 같은 작업을 수행 할 수 있어야합니다?

    • organization 레인지 키되는 해시 키, email 인 : 내가 상상 다음은 올바른 방법입니다. 그 중 하나가 당신의 객체뿐만 아니라 해시 키를 배포 것, 그래서 그들 중 하나가 반드시 더 나은 해시 키 자체는 것을 모르는 것 같다

    감사

답변

1

. 나는 organization에 대한 특정 이메일을 모두 가져와야한다는 사실이 해시 키의 더 나은 후보라고 생각합니다. 조직의 모든 전자 메일을 가져 오기 위해 조직을 사용하여 쿼리를 수행 할 수 있습니다.

설명한 사용 사례를 지원하려면 전역 보조 인덱스가 필요합니다. This answer은 이유를 보여주는 데 도움이 될 수 있지만 Organization을 테이블 해시 키로 사용한다고 가정하면 email에 글로벌 보조 인덱스가 있어야 특정 이메일을 검색하거나 삭제할 수 있습니다.

+0

그래서'organization'이 hashKey이고'email'이 rangeKey 인 경우 모든 조직을 얻으려면 테이블 스캔을 수행하고 특정 조직에 대해서는 전자 메일을 수신하도록 쿼리해야합니다. 옳은? – Cmag

+0

따라서 1 백만 레코드, 86 바이트, 86000KB가 있으면 21,500 개의 준비된 읽기가 필요합니다. – Cmag

+0

hashKey를 say '1'의 알려진 값으로 설정하는 것이 더 좋겠습니까? 그렇다면 rangeKey는'organization'이고 보조 인덱스는'email'이거나 해킹입니까? – Cmag

0

문제는 제공된 용량과 스캔 작업입니다. 레코드가 1 백만 개 (각각 85 바이트) 인 경우 86000KB로 21,000 개의 준비된 읽기가 필요합니다! 즉

| Hash Key | Range Key | Secondary Range Key | 
| 1  | organization | email    | 

: 비용을 유지하는이 시점에서

는, 나는 다음과 같은 구조를 가지고보다 다른 대안을 볼

| Hash Key | Range Key | Secondary Range Key | 
| 1  | foo   | [email protected]  | 
| 1  | bar   | [email protected]  | 
| 1  | foo   | [email protected]  | 

이 항상 알고 의미를 당신의 HashKey. 그리고이를 사용하여 특정 RangeKeys에 대한 쿼리를 수행 할 수 있습니다.

생각하십니까?

+0

아마존은 테이블 해시 키가 항목을 비교적 균일하게 배포해야한다는 것을 분명히 알기 때문에 모든 항목에 동일한 키를 사용하는 것은 좋은 아이디어라고 생각하지 않습니다. 애플리케이션에서 지원해야하는 쿼리를 파악한 다음 로컬 및 글로벌 보조 인덱스를 사용하여 테이블을 적절하게 설계하는 것이 좋습니다. 어떤 경우에는 필연적 일 수도 있지만 피할 수 있다면'스캔 '을하고 싶지는 않을 것입니다. – rpmartz

+0

@RyanM 내 예제를 사용하여 어떤 스캔 작업도 피하고 있습니다. 쿼리 만. 예, 읽기가 분산되지는 않지만 그게 유일한 옵션 인 것 같습니다. '스캔'또는 하나의 알려진 해시 키가 있음 – Cmag

+0

스캔을 피하는 경우 내 대답에 내 의견에서 제안한대로 1 백만 개의 레코드를 모두 읽을 필요가 없습니다. – rpmartz

0

C 귀하의 기본 테이블에서 전자 메일을 해시 키로 사용하십시오. 부서보다 ​​무작위이므로 전자 우편을 사용하여 잘 정리할 수 있습니다.

조직과 함께 GSI를 해시 키로 생성하십시오.

1) 특정 조직에 대한 hashkey와 GSI 대상 조직에 동일

쿼리를 모든 이메일을 검색합니다.

2) 특정 전자 메일

이메일이 기본 테이블의 hashkey이기 때문에 쉽게 수행을 삭제합니다.

낮은 프로비저닝 처리량은 여전히 ​​작동합니다. 유일한 효과는 스캔 시간이 오래 걸리는 것입니다. 읽기 프로비저닝 읽기 처리량이 10이면 검색에 약

21000/10 = 2100 초가 소요됩니다.

스캔 작업에서 반환해야하는 항목 수에 대한 제한을 설정할 수 있다고 생각합니다. 결과에는 다음 페이지에 대한 검색 호출에서 제공 할 수있는 lastEvaluatedKey도 포함됩니다.