해시 및 범위 기본 키란 무엇입니까?


답변:


571

" 해시 및 범위 기본 키 DynamoDB의 단일 행이 모두 이루어진 고유 한 기본 키 가지고"란 해시범위 키를 누릅니다. 예를 들어, 해시 키가 X 이고 범위 키가 Y 인 경우 기본 키는 사실상 XY 입니다. 동일한 해시 키에 대해 여러 범위 키를 가질 수도 있지만 조합은 XZXA 와 같이 고유해야합니다 . 각 테이블 유형에 대한 예제를 사용하십시오.

해시 기본 키 – 기본 키는 해시 속성이라는 하나의 속성으로 구성됩니다. 예를 들어 ProductCatalog 테이블은 ProductID를 기본 키로 가질 수 있습니다. DynamoDB는이 기본 키 속성에 정렬되지 않은 해시 인덱스를 구축합니다.

이것은 모든 행이이 값에서 제외됨을 의미합니다. DynamoDB의 모든 행에는이 속성에 필요한 고유 한 값이 있습니다. 정렬되지 않은 해시 인덱스는 의미하는 바를 의미합니다. 데이터는 정렬되지 않으며 데이터 저장 방법에 대한 보장이 없습니다. ProductID가 X보다 큰 모든 행 가져 오기 와 같은 정렬되지 않은 인덱스에 대해서는 쿼리를 수행 할 수 없습니다 . 해시 키를 기반으로 항목을 작성하고 가져옵니다. 예를 들어 ProductID X가있는 테이블에서 행을 가져옵니다 . 정렬되지 않은 인덱스에 대해 쿼리를 수행하므로 기본적으로 키-값 조회이며 매우 빠르며 처리량이 거의 없습니다.


해시 및 범위 기본 키 – 기본 키는 두 가지 속성으로 구성됩니다. 첫 번째 특성은 해시 특성이고 두 번째 특성은 범위 특성입니다. 예를 들어, 포럼 스레드 테이블은 기본 키로 ForumName 및 Subject를 가질 수 있습니다. 여기서 ForumName은 해시 속성이고 Subject는 범위 속성입니다. DynamoDB는 해시 속성에 정렬되지 않은 해시 인덱스를 만들고 범위 속성에 정렬 된 범위 인덱스를 만듭니다.

이것은 모든 행의 기본 키가 해시와 범위 키조합 임을 의미합니다 . 해시 키와 범위 키가 모두있는 경우 단일 행에서 직접 가져 오기를 수행하거나 정렬 된 범위 인덱스 에 대해 쿼리를 작성할 수 있습니다 . 예를 들어, 범위 키가 Y보다 큰 해시 키 X 또는 그 영향을받는 다른 쿼리가 있는 테이블에서 모든 행을 가져옵니다 . 인덱싱되지 않은 필드에 대한 스캔 및 쿼리에 비해 성능이 향상되고 용량 사용량이 적습니다. 에서 해당 설명서 :

쿼리 결과는 항상 범위 키를 기준으로 정렬됩니다. 범위 키의 데이터 유형이 숫자 인 경우 결과는 숫자 순서로 리턴됩니다. 그렇지 않으면 결과는 ASCII 문자 코드 값 순서로 리턴됩니다. 기본적으로 정렬 순서는 오름차순입니다. 순서를 반대로하려면 ScanIndexForward 매개 변수를 false로 설정하십시오.

내가 이것을 타이핑 할 때 아마 몇 가지를 놓 쳤고 표면 만 긁었습니다. 있습니다 많은DynamoDB의 테이블로 작업 할 때 고려해야 할 측면 (처리량, 일관성, 용량, 기타 인덱스, 키 분배 등). 예제 테이블과 데이터 페이지를 살펴보십시오 .


53
이것은 내가 읽은 가장 유용한 스택 오버플로 답변 중 하나입니다.
Tommy

7
해시없이 범위 만 사용하는 옵션이없는 이유는 무엇입니까? 예를 들어, 모든 데이터가 기본 키로 타임 스탬프와 함께 저장되는 경우 "
2015 년

3
@Teofrostus, 해시 키는 항목이 포함 된 파티션을 식별하는 데 사용됩니다. 그것이 없으면 DynamoDB는 어떤 파티션을 찾아야하는지 알 수 없습니다. 어디를 찾아야할지 모르는 것은 쿼리를 물리치며 Scan (또는 Global Secondary Index)의 유스 케이스이지만 시간 만 사용하는 유스 케이스에는 적합하지 않습니다. 데이터를 선택하는 시리즈).
sheldonh

1
@ mkobit 스캔하지 않고 파티션 키가 주어진 모든 정렬 키를 검색 할 수있는 방법이 있습니까?
unknownerror

1
@VNR DynamoDB의 맥락에서 귀하의 질문을 이해하지 못했습니다. 해시 키를 제공 할 때 모든 해시 + 범위 키를 얻는다고 말하고 있습니까?
mkobit

19

모든 것이 믹싱됨에 따라 기능과 코드를 살펴보고 그것이 의미하는 바를 시뮬레이션합니다.

행을 얻을 수있는 방법은 기본 키를 통해입니다

getRow(pk: PrimaryKey): Row

기본 키 데이터 구조는 다음과 같습니다.

// If you decide your primary key is just the partition key.
class PrimaryKey(partitionKey: String)

// and in thids case
getRow(somePartitionKey): Row

그러나이 경우 기본 키가 파티션 키 + 정렬 키임을 결정할 수 있습니다.

// if you decide your primary key is partition key + sort key
class PrimaryKey(partitionKey: String, sortKey: String)

getRow(partitionKey, sortKey): Row
getMultipleRows(partitionKey): Row[]

결론은 다음과 같습니다.

  1. 기본 키가 파티션 키 전용이라고 결정 했습니까? 파티션 키로 단일 행을 가져옵니다.

  2. 기본 키가 파티션 키 + 정렬 키라고 결정 했습니까? 2.1 (파티션 키, 정렬 키)로 단일 행 가져 오기 또는 (파티션 키)로 행 범위 가져 오기

어느 쪽이든 기본 키로 단일 행을 얻는 경우 유일한 질문은 해당 기본 키를 파티션 키 전용 또는 파티션 키 + 정렬 키로 정의한 경우입니다.

빌딩 블록은 다음과 같습니다.

  1. 안건
  2. KV 속성.

항목을 행으로, KV 속성을 해당 행의 셀로 생각하십시오.

  1. 기본 키로 항목 (행)을 얻을 수 있습니다.
  2. (HashKey, RangeKeyQuery)를 지정하여 여러 항목 (여러 행)을 얻을 수 있습니다.

PK가 (HashKey, SortKey)로 구성되어 있다고 판단한 경우에만 (2)를 수행 할 수 있습니다.

더 복잡한 것처럼 시각적으로 보았습니다.

+----------------------------------------------------------------------------------+
|Table                                                                             |
|+------------------------------------------------------------------------------+  |
||Item                                                                          |  |
||+-----------+ +-----------+ +-----------+ +-----------+                       |  |
|||primaryKey | |kv attr    | |kv attr ...| |kv attr ...|                       |  |
||+-----------+ +-----------+ +-----------+ +-----------+                       |  |
|+------------------------------------------------------------------------------+  |
|+------------------------------------------------------------------------------+  |
||Item                                                                          |  |
||+-----------+ +-----------+ +-----------+ +-----------+ +-----------+         |  |
|||primaryKey | |kv attr    | |kv attr ...| |kv attr ...| |kv attr ...|         |  |
||+-----------+ +-----------+ +-----------+ +-----------+ +-----------+         |  |
|+------------------------------------------------------------------------------+  |
|                                                                                  |
+----------------------------------------------------------------------------------+

+----------------------------------------------------------------------------------+
|1. Always get item by PrimaryKey                                                  |
|2. PK is (Hash,RangeKey), great get MULTIPLE Items by Hash, filter/sort by range     |
|3. PK is HashKey: just get a SINGLE ITEM by hashKey                               |
|                                                      +--------------------------+|
|                                 +---------------+    |getByPK => getBy(1        ||
|                 +-----------+ +>|(HashKey,Range)|--->|hashKey, > < or startWith ||
|              +->|Composite  |-+ +---------------+    |of rangeKeys)             ||
|              |  +-----------+                        +--------------------------+|
|+-----------+ |                                                                   |
||PrimaryKey |-+                                                                   |
|+-----------+ |                                       +--------------------------+|
|              |  +-----------+   +---------------+    |getByPK => get by specific||
|              +->|HashType   |-->|get one item   |--->|hashKey                   ||
|                 +-----------+   +---------------+    |                          ||
|                                                      +--------------------------+|
+----------------------------------------------------------------------------------+

그래서 위에서 일어나는 일. 다음 관찰 사항을 확인하십시오. 우리가 말했듯이 우리의 데이터는 (Table, Item, KVAttribute)에 속합니다. 그런 다음 모든 항목에 기본 키가 있습니다. 이제 기본 키를 작성하는 방법은 데이터에 액세스하는 방법에 의미가 있습니다.

PrimaryKey가 단순히 해시 키라고 결정하면 하나의 항목을 얻을 수 있습니다. 그러나 기본 키가 hashKey + SortKey라고 결정하면 (HashKey + SomeRangeFunction (범위 키))로 항목을 가져 오기 때문에 기본 키에 대한 범위 쿼리를 수행 할 수도 있습니다. 따라서 기본 키 쿼리로 여러 항목을 얻을 수 있습니다.

참고 : 나는 보조 인덱스를 언급하지 않았다.


4

잘 설명 된 답변은 이미 @mkobit에 의해 제공되었지만 범위 키와 해시 키에 대한 큰 그림을 추가 할 것입니다.

간단한 단어 range + hash key = composite primary key 로 Dynamodb의 CoreComponents 여기에 이미지 설명을 입력하십시오

기본 키는 해시 키와 선택적 범위 키로 구성됩니다. 해시 키는 DynamoDB 파티션을 선택하는 데 사용됩니다. 파티션은 테이블 데이터의 일부입니다. 범위 키는 파티션의 항목이있는 경우이를 정렬하는 데 사용됩니다.

따라서 둘 다 목적이 다르고 복잡한 쿼리를 수행하는 데 도움이됩니다. 위 예제 hashkey1 can have multiple n-range.에서 range와 hashkey의 또 다른 예는 game, userA (hashkey)는 Ngame을 재생할 수 있습니다(range)

여기에 이미지 설명을 입력하십시오

테이블, 항목 및 속성에 설명 된 음악 테이블은 복합 기본 키 (Artist 및 SongTitle)가있는 테이블의 예입니다. 해당 항목에 아티스트 및 SongTitle 값을 제공하면 음악 테이블의 모든 항목에 직접 액세스 할 수 있습니다.

복합 기본 키는 데이터를 쿼리 할 때 추가 유연성을 제공합니다. 예를 들어 Artist 값만 제공하면 DynamoDB는 해당 아티스트의 모든 노래를 검색합니다. 특정 아티스트가 노래의 하위 집합 만 검색하려면 SongTitle의 값 범위와 함께 아티스트 값을 제공 할 수 있습니다.

여기에 이미지 설명을 입력하십시오

https://www.slideshare.net/InfoQ/amazon-dynamodb-design-patterns-best-practices https://www.slideshare.net/AmazonWebServices/awsome-day-2016-module-4-databases-amazon-dynamodb -와 - 아마존 - RDS https://ceyhunozgun.blogspot.com/2017/04/implementing-object-persistence-with-dynamodb.html


로 예에서 Music테이블 한 작가는이 같은 제목의 노래, 그러나 놀라움을 생산할 수 없습니다 - 비디오 게임에서 우리가 2016에서 1993 년부터 운명과 운명이 ) en.wikipedia.org/wiki/Doom_(franchise 같은 "아티스트"로 ( 개발자) : id Software.
비탈리 즈 다네 비치

0

@vnr 당신은 파티션 키를 사용하여 쿼리를 사용하여 파티션 키와 관련된 모든 정렬 키를 검색 할 수 있습니다. 스캔 할 필요가 없습니다. 여기서 요점은 파티션 키가 쿼리에서 필수라는 것입니다. 정렬 키는 데이터 범위를 얻는 데만 사용됩니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.