programing

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

css3 2023. 10. 2. 15:20

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

Dynamo의 테이블데이터 작업에 대한 문서에 있는 Range/Primary Key가 무엇인지 이해할 수 없습니다.DB

어떻게 작동합니까?

"해시 속성의 정렬되지 않은 해시 인덱스와 범위 속성의 정렬된 범위 인덱스"는 무엇을 의미합니까?

"해시 범위 기본 키"는 DynamoDB의 한 행에 해시범위 키로 구성된 고유한 기본 키가 있음을 의미합니다.예를 들어 해시 키가 X이고 범위 키가 Y인 경우 기본 키는 사실상 XY입니다.동일한 해시 키에 대해 여러 개의 범위 키를 가질 수도 있지만 XZXA처럼 조합이 고유해야 합니다.각 테이블 유형에 대한 예제를 사용해 보겠습니다.

Hash Primary Key – Primary Key는 하나의 속성, 즉 해시 속성으로 구성됩니다.예를 들어, ProductCatalog 테이블에 Product가 있을 수 있습니다.ID를 기본 키로 합니다.DynamoDB는 이 기본 키 속성에 순서에 맞지 않는 해시 인덱스를 만듭니다.

이는 모든 행이 이 값에서 제외된다는 것을 의미합니다.DynamoDB의 모든 행에는 이 속성에 대한 고유한 필수 값이 있습니다.순서에 맞지 않는 해시 인덱스는 데이터가 순서에 맞지 않고 데이터가 저장되는 방식에 대한 어떠한 보장도 주어지지 않는 것을 의미합니다.Get me all lows with a Product(제품이 있는 모든 행 가져오기)와 같은 순서 없는 인덱스에서는 쿼리를 수행할 없습니다.ID가 X보다 큽니다.해시 키를 기반으로 항목을 작성하고 가져옵니다.예를 들어, 제품이 있는 테이블의 행 가져오기ID X. 순서 없는 인덱스에 대해 쿼리를 수행하므로 기본적으로 키 값 검색이 가능하고 속도가 매우 빠르며 처리량이 매우 적습니다.


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

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

쿼리 결과는 항상 범위 키로 정렬됩니다.범위 키의 데이터 유형이 Number이면 결과가 숫자 순서로 반환되고, 그렇지 않으면 ASCII 문자 코드 값의 순서로 결과가 반환됩니다.기본적으로 정렬 순서는 오름차순입니다.순서를 바꾸려면 ScanIndexForward 매개 변수를 false로 설정합니다.

제가 이걸 타이핑하고 표면만 긁어서 놓쳤나 봐요.DynamoDB 테이블을 사용할 때 고려해야 할 사항훨씬 더 많습니다(처리량, 일관성, 용량, 기타 지수, 키 분배 등).예제는 샘플 표와 데이터 페이지를 살펴봐야 합니다.

잘 설명된 답변은 이미 @mkobit에서 제시하고 있지만, 범위 키와 해시 키의 큰 그림을 추가하겠습니다.

로 .range + hash key = composite primary key Dynamodb 요소enter image description here

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

따라서 둘 다 서로 다른 목적을 가지고 있으며 복잡한 쿼리를 수행하는 데 도움이 됩니다.ehashkey1 can have multiple n-range.및또 사용자 A와임,자 A가다 이 있습니다.(hashkey)NgameNgame를 할 수 .(range)

enter image description here

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

복합 기본 키는 데이터를 조회할 때 추가적인 유연성을 제공합니다.예를 들어 아티스트에 대한 값만 제공하는 경우 DynamoDB는 해당 아티스트의 모든 곡을 검색합니다.특정 아티스트의 곡 일부만 검색하려면 곡 제목에 대한 값 범위와 함께 아티스트에 대한 값을 제공할 수 있습니다.

enter image description here

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

전체적으로 뒤섞이고 있으니 기능과 코드를 살펴봄으로써 의미하는 바를 시뮬레이션해 보겠습니다.

행을 얻는 유일한 방법은 기본 키를 통해서입니다.

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. 아이템
  3. KV 속성.

항목을 행으로 생각하고 KV 속성을 해당 행의 셀로 생각합니다.

  1. 항목(행)은 기본 키로 구할 수 있습니다.
  2. 지정하여 여러 항목(여러 행)을 가져올 수 있습니다(해시키, 범위키).쿼리)

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)에 속합니다.그러면 모든 항목에 기본 키가 있습니다.기본 키를 구성하는 방법은 데이터에 액세스하는 방법에 의미가 있습니다.

Primary Key를 단순히 해시 키로 결정하면 좋은 결과를 얻을 수 있습니다.그러나 기본 키를 hashKey + SortKey로 결정한 경우 항목을 (HashKey + SomeRangeFunction(범위 키))로 얻을 수 있으므로 기본 키에 대해 범위 쿼리를 수행할 수도 있습니다.따라서 기본 키 쿼리로 여러 항목을 얻을 수 있습니다.

참고: 2차 인덱스를 참조하지 않았습니다.

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

용어에 대해서도 혼란스러워 하는 사람들을 위해:

항목의 파티션 키해시 속성이라고도 합니다.해시 속성이라는 용어는 DynamoDB에서 파티션 키 값에 따라 데이터 항목을 파티션에 균등하게 분배하는 내부 해시 함수를 사용한 데서 유래합니다.

항목의 정렬 키범위 속성이라고도 합니다.범위 속성이라는 용어는 DynamoDB가 물리적으로 같은 파티션 키를 가진 항목을 정렬된 키 값에 따라 정렬된 순서로 함께 저장하는 방식에서 유래합니다.

출처 : "Amazon DynamoDB의 핵심 구성 요소"

언급URL : https://stackoverflow.com/questions/27329461/what-is-hash-and-range-primary-key