DynamoDB 항목 컬렉션
항목 컬렉션은 테이블(또는 인덱스)에서 항목을 공유하는 모든 항목의 집합입니다. 동일한 값 — 키 스키마의 긴급 속성입니다.
두 항목이 동일한 파티션 키를 전달하는 순간 컬렉션이 형성되고
컬렉션은 DynamoDB가 단일 Query로 함께 읽을 수 있는 단위가 됩니다.
이것을 올바르게 수행하면 한 번의 왕복으로 읽은 내용이 다시 나타납니다. 잘못하면 당신은
Scan이 붙어 있습니다.
DynamoDB 항목 컬렉션이란 무엇입니까?
DynamoDB 항목 컬렉션은 동일한 14값을 공유하고 함께 저장되고 정렬 키를 기준으로 정렬되는 모든 항목의 집합입니다. 컬렉션은 키 스키마에서 나타납니다. 컬렉션은 단일 Query가 효율적으로 읽는 단위인 반면, Scan는 모든 파티션을 탐색합니다.
- 컬렉션은 단지 "동일한 파티션 키"입니다. 동일한 파티션 키를 가진 두 개 이상의 항목 파티션 키 값은 로 정렬되어 함께 저장됩니다.
- 효율적인
Query의 단위입니다.Query는 하나의 컬렉션을 읽습니다.Scan모든 파티션을 탐색합니다. 이것이 전체 공연 이야기입니다. - 정렬 키 없음, 수집 없음. 파티션 키 전용 테이블은 키당 하나의 항목을 보유합니다. 수집할 것이 없습니다.
- 두 가지 제한 바이트: 이 존재할 때 컬렉션당 10GB 한도, 핫 낮은 카디널리티 키의 파티션.
문제: 관련 항목을 함께 읽는 것
여러 대의 차량을 운영한다고 가정해 보겠습니다. 각 스트리밍 원격 측정은 속도, 냉각수입니다.
온도, 연료 수준 — 몇 초마다. 지배적 인 읽기는 "나에게 ~을주세요"입니다.
차량 V-7741"에 대한 최근 판독값.
SQL에서 8개 열을 인덱싱하고 플래너가 작업을 수행하도록 합니다. 일반 키-값 저장소에는 그런 사치가 없습니다.
모든 판독 내용을 격리된 기록으로 처리하므로 해당 질문은 해당 내용을 스캔하는 것을 의미합니다. 전체 테이블 및 필터링. 속도가 느리고, 비용이 많이 들고, 함대가 성장함에 따라 더욱 악화됩니다.
DynamoDB의 대답은 "한 차량에 대한 모든 판독값"을 물리적으로 그룹화하는 것입니다. 직접적으로 주소를 지정할 수 있는 것. 해당 그룹이 항목 컬렉션입니다.
실제로 컬렉션이란 무엇입니까?
DynamoDB는 항목을 파티션에 저장하고 다음을 통해 각 항목을 파티션으로 라우팅합니다. 파티션 키를 해싱합니다. 동일한 파티션 키 값을 가진 모든 항목이 저장됩니다. 정렬 키를 기준으로 함께 정렬됩니다. 하나의 파티션에서 시작하지만 LSI는 없습니다. DynamoDB는 정렬 키 경계에서 파티션 전체에 대규모 또는 핫 컬렉션을 분할할 수 있습니다. LSI만이 전체 컬렉션을 단일 파티션에 고정합니다(이것이 10GB가 아래 캡은 LSI 전용입니다).
AWS 개발자 안내서에서는 이를 파티션 키 값을 공유하는 항목으로 정확하게 명명합니다. _아이템 컬렉션_으로, 함께 저장되고 정렬 키에 따라 정렬됩니다.
이는 2007년 Amazon Dynamo 문서에서 소개된 것과 동일한 아이디어입니다. 노드에 키 할당 — 정렬 차원으로 확장되어 관련 항목이 노드에 인접하게 배치됩니다. 디스크.
이들은 인접하고 순서가 지정되어 있으므로 DynamoDB는 다음을 사용하여 연속 실행을 반환합니다.
하나를 추구합니다. 이것이 Query가 저렴하고 Scan가 그렇지 않은 이유입니다. Query은 단일 값을 읽습니다.
수집; Scan는 모든 파티션을 탐색합니다.
컬렉션을 구성하려면 — 파티션 키 및 정렬 키. 파티션 키만으로 구성된 테이블에는 키 값당 정확히 하나의 항목이 있으므로 수집할 것이 없습니다.
우리의 작업 예: 차량 → 원격 측정 판독값
복합 키를 사용하여 원격 분석 스트림을 모델링합니다. 파티션 키는 다음을 식별합니다. 차량; 정렬 키는 판독값의 타임스탬프이며 판독값을 타임스탬프에 유지합니다. 순서(기본적으로 오름차순, 최신 항목부터 스캔하려면 ScanIndexForward=false 전달)
| PK (vehicleId) | SK (recordedAt) | attributes |
|---|---|---|
| VEH#V-7741 | META | plate, model, depotCode |
| VEH#V-7741 | TS#2026-06-23T09:00:01Z | speedKph, coolantC, fuelPct |
| VEH#V-7741 | TS#2026-06-23T09:00:06Z | speedKph, coolantC, fuelPct |
| VEH#V-7741 | TS#2026-06-23T09:00:11Z | speedKph, coolantC, fuelPct |
| VEH#V-7742 | META | plate, model, depotCode |
| VEH#V-7742 | TS#2026-06-23T09:00:02Z | speedKph, coolantC, fuelPct |
여기에는 두 개의 컬렉션이 있습니다(차량당 하나씩). META 항목(차량 메타데이터) 및
V-7741의 모든 판독값은 하나의 모음을 형성합니다. V-7742의 항목은 또 다른 항목을 형성합니다.
요령에 유의하세요. 메타데이터에 TS#... 이전에 정렬되는 정렬 키(META)를 제공하세요.
값을 가지며, PK = "VEH#V-7741"의 단일 Query는 차량의 프로필을 반환합니다.
그리고 그 내용을 함께 읽습니다.
이것이 바로 부모와 자식 패턴의 핵심입니다. single-table design.
각 점선 상자는 하나의 항목 컬렉션입니다. 즉, 동일한 파티션 키, 정렬 키로 정렬된 항목입니다.
Query은 정확히 하나의 상자를 나타냅니다.
컬렉션 쿼리하기
컬렉션은 정렬 키를 기준으로 정렬되므로 범위 읽기는 무료로 제공됩니다. 당기다 한 대의 차량에 대해 10분 동안 기록된 판독값에 대해 정렬 키를 바인딩했습니다.
# Query
KeyConditionExpression vehicleId = :v AND recordedAt BETWEEN :from AND :to
ScanIndexForward false # newest first
주요 조건은 하나의 컬렉션(vehicleId = :v)으로 제한한 다음
연속된 조각(recordedAt BETWEEN ...)입니다. DynamoDB는 해당 항목만 읽고
그들에 대해서만 비용을 청구합니다. 메타데이터만 원하시나요? recordedAt = "META"는 다음을 가져옵니다.
단일 META 항목.
이러한 주요 조건과 프로젝션 표현식을 직접 작성하는 것은 까다롭습니다. 는
DynamoDB Expression Builder는 다음을 생성합니다.
KeyConditionExpression, ExpressionAttributeNames, 그리고
ExpressionAttributeValues이므로 예약어와 자리 표시자 세부정보는
물지 마십시오.
인덱스 컬렉션
보조 인덱스에는 own 키 스키마가 있으므로 own 항목 컬렉션을 형성합니다.
depotCode(파티션) 및 recordedAt(정렬)을 입력한 글로벌 보조 인덱스를 추가합니다.
그리고 "저장소 DEP-LON-3의 모든 판독값, 최신 항목부터"는 단일 Query가 됩니다.
해당 인덱스의 컬렉션에 대해 — 기본 테이블이 제공할 수 없는 읽기입니다.
이것이 바로 인덱스 유형이 중요한 이유입니다. 어떤 컬렉션을 구성할 수 있고 어떻게 구성할 수 있는지를 결정합니다. 그들은 행동합니다. 절충안은 GSI vs LSI을 참조하세요.
한 가지 뚜렷한 차이점: 로컬 보조 인덱스(LSI)는 기본 테이블의 파티션 키이므로 해당 컬렉션은 기본 항목 컬렉션에 _물리적으로 연결_되어 있습니다. 그리고 그 유대는 아래와 같이 엄격한 제한을 만듭니다.
물어뜯는 한계
항목 컬렉션은 강력하지만 두 가지 제약 조건에 따라 키 구성 방법이 결정됩니다.
- 10GB LSI 제한. 테이블에 하나 이상의 로컬 보조 인덱스가 있는 경우,
단일 항목 컬렉션 — 하나에 대한 기본 항목과 해당 LSI 프로젝션
파티션 키 — 10GB를 초과할 수 없습니다. 그것을 넘어서서 성장시키는 글을 쓴다.
ItemCollectionSizeLimitExceededException로 인해 수집 시작이 실패했습니다. _no_가 있는 테이블 LSI에는 컬렉션당 한도가 없습니다. 이것이 바로 무한한 이유입니다. 끊임없이 증가하는 스트림(멈추지 않는 원격 측정)은 LSI에 적합하지 않습니다. 컬렉션만 늘어납니다. GSI는 자체 파티션을 가지므로 제한을 피합니다. - . 컬렉션은 파티션에 있으며 단일 파티션에는
제한된 처리량. 차량 한 대(또는
depotCode한 대)가 트래픽 점유율이 불균형한 경우에도 해당 파티션을 핫스팟할 수 있습니다. 테이블 전체가 프로비저닝된 처리량보다 훨씬 낮습니다. 적응형 용량 - AWS에서 다룹니다. "DynamoDB를 위한 고급 설계 패턴" re:Invent 심층 분석 — 격리 및 향상 단축키는 자동으로 작동하지만 스프레드가 전혀 없는 키는 복구할 수 없습니다. 선택 카디널리티가 높은 파티션 키를 사용하므로 트래픽이 여러 컬렉션으로 분산됩니다.
DynoTable에서 보기
컬렉션에 대한 직관을 구축하는 가장 빠른 방법은 컬렉션을 살펴보는 것입니다. DynoTable에서는
파티션 키를 쿼리하면 전체 컬렉션이 연속적으로 렌더링됩니다.
정렬 키 순서 목록 — META 항목은 타임스탬프가 표시된 판독값 바로 앞에 위치합니다.
화면에서는 정신적 재건이 필요하지 않습니다.

함정과 다음 단계
- 정렬 키 없음, 수집 없음. 파티션 키 전용 테이블은 관련 항목을 그룹화할 수 없습니다. 항목. 항목을 함께 읽어야 하는 경우 복합 키가 필요합니다.
- LSI 컬렉션이 무제한으로 늘어나도록 허용하지 마세요. 추가 전용 스트림은 10GB 한도 때문에 LSI가 아닌 GSI(또는 시간 버킷 파티션 키)입니다.
- 파티션 키를 분산하세요. 컬렉션은 파티션만큼만 확장 가능합니다. 그것은 존재합니다. 낮은 카디널리티 파티션 키는 핫스팟을 생성합니다.
Scan이 아닌Query에 도달하세요. 관련 항목을 읽을 수 있도록 컬렉션이 존재합니다.Query를 하나의 목표로 삼고;Scan로 다시 떨어지면 그 이점이 사라집니다. Query vs Scan를 참조하세요.
자신만의 키 스키마를 스케치하고, 실제 파티션 키에 대해 Query를 실행하고,
컬렉션이 다시 주문되었습니다. DynoTable 다운로드 그리고 테이블을 탐색해보세요'
직접 컬렉션.


