잡다한 시리즈/AWS

DynamoDB의 Hash key와 Sort key

GGOBOOGI 2021. 3. 19. 18:01
반응형

DynamoDB의 Hash keySort key에 대해서 알아보자. 이를 알아보기 전에 먼저 primary key에 대한 이해가 필요하다.

 

DynamoDB에서는 테이블을 생성할 때 모든 attribute들에 대한 스키마를 미리 정의해 둘 필요가 없다. 오직 primary key (PK)에 대한 스키마만 테이블을 생성할 때 정의하면 된다.

DynamoDB에서의 Primary Key

PK에는 단일 PK(simple key)복합 PK(composite key) 두 가지 종류가 존재한다.


단일 PK는 하나의 attribute만을 primary key로 사용하며, 복합 PK는 두 개의 attribute들을 결합하여 사용한다. 복합 PK에서 첫 번째 attribute는 partition key, 두 번째 attribute는 sort key라고 부른다.

 

구분 key 형식
단일 PK (attribute 1개)
복합 PK (partition key(첫 번째 attribute), sort key(두 번째 attribute))

 

DynamoDB에서 검색을 하기 위해서는 기본 키(PK)로 인덱스를 생성하게 되어 있다. 테이블을 생성할 때 반드시 지정해야 하는 기본 키를 이용하여 생성되는 인덱스가 table index이다.

DynamoDB에서의 Primary Key Type

아까 위에서 PK로는 단일 PK와 복합 PK가 있다고 했다.

 

단일 PK는 Hash type key로 사용하며, 키의 기본 값은 스칼라 데이터 형식만 가능하다.

 

복합 PK는 2개의 attribute의 조합을 기본키로 사용하며, 첫 번째 attribute는 Hash type key로 사용하고 두 번째 attribute는 Range type key로 사용한다.

 

구분 key 형식
단일 PK (KEY TYPE : HASH)
복합 PK (partition key(KEY TYPE : HASH), sort key(KEY TYPE : RANGE))
try:
    resp = client.create_table(
        TableName="Books",
        # Declare your Primary Key in the KeySchema argument
        KeySchema=[
            {
                "AttributeName": "Author",
                "KeyType": "HASH"
            },
            {
                "AttributeName": "Title",
                "KeyType": "RANGE"
            }
        ],

Hash type key

Hash type key는 일치(Equal) 방식의 검색만 지원한다.

위에서처럼 Author가 Hash 타입이라면, Author가 "홍길동"인 것을 검색했을 때 정확히 저자가 "홍길동"인 아이템들만 내뱉는다는 뜻이다. Hash type key에는 또 다른 특징이 있는데, DynamoDB의 partitioning(sharding)에 사용된다는 것이다.

 

DynamoDB는 Partition의 크기가 10G를 초과하거나, Provisioning Throughput이 일정 수준 이상이 되면 데이터에 대한 Partition을 나눈다 (Sharding을 수행한다).

이때, partition을 나누는 기준이 되는 것이 Hash Key이다.

Hash Key가 같은 데이터는 같은 partition에 저장된다. 이때, Hash key가 같은 데이터에 요청할 수 있는 throughput은 해당 partition이 지원하는 throughput을 넘지 못한다는 이슈가 발생하게 된다.

 

이러한 Hash type key의 특징 때문에 아까 복합 PK가 (partition key(Hash key), sort key(Range Key))와 같이 구성된다고 한 것이다.

PK의 첫 번째 attribute는 Hash type key이며, 이 특징으로 인해 해당 키가 partitioning에 쓰이기 때문에 partition key라고도 불리는 것이다.

Range type key

그렇다면 Range type key는 무엇일까?

 

Range type key는 일치 검색만 지원했던 Hash Key와 달리 일치, 부등호, 포함 등의 범위를 지정할 수 있는 검색을 지원한다.

Hash type keypartition key의 역할을 했던 것과 같이 Range type keysort key라는 역할을 하는데, sort key를 신중하게 설계하면 begins_with, between, >, <등 연산자를 사용하는 범위 쿼리를 사용하여 관련 항목의 필요한 그룹을 검색할 수 있다.

 

또한 복합 정렬 키는 계층 구조의 어느 수준에서 쿼리를 할 수 있도록 데이터의 계층적(일대다) 관계를 정의할 수 있도록 도와준다.

https://dev-punxism.tistory.com/entry/DynamoDB%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4-Ranking-%EA%B5%AC%ED%95%98%EB%A0%A4%EB%8B%A4-%EC%82%BD%EC%A7%88%EB%A7%8C-%ED%95%98%EB%8B%A4
https://interconnection.tistory.com/60
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-sort-keys.html

반응형