노트
- DynamoDB에서 개수세기는 어려움, 왜그럴까? 이유는 추측컨대 DDB는 안정해시 기반의 파티셔닝으로 데이터를 관리하고 있기 떄문에 산발적인(Sparse) 데이터에 대한 관리가 어렵기 때문일까? (개인 의견)
- → 그렇다. DynamoDB는 분산형 NoSQL 데이터베이스이다. DynamoDB는 CP(때때로 AP) 시스템이다. 기본적으로 데이터를 분산하여 저장하므로, 모든 아이템을 읽고 개수를 계산하는 것은 불가능하다.
- 또는 DDB는 아주 많은 데이터 처리(최소 1억개 이상의 데이터)에서도 균등한 성능을 보장하기 위해서 사용되는 경우가 많기 때문에, 모든 데이터를 일일히 추적하고 관리하긴 어려워서 그럴까? (개인 의견)
- → 위 답변과 같은 맥락으로 생각하면 분산되어 있기 때문에 모든 데이터를 추적하고 관리하는게 불가능(?) 한 것이다.
- 그럼에도 불구하고 DDB에서 개수를 세는 방법은 대충 다음 방법들이 있다.
- 가장 정석적(?)인 방법은 query를 끝까지 그냥 반복해서 계산하는 방식이다.
- 근사적으로 계산해도 된다면 다음과 같이
describeTable
을 사용할 수 있다.
const AWS = require('aws-sdk'); AWS.config.update({ region: 'REGION' }); // DynamoDB 테이블이 있는 AWS 리전으로 업데이트 const params = { TableName: 'TABLE_NAME', }; const dynamoDB = new AWS.DynamoDB(); dynamoDB.describeTable(params, (err, data) => { if (err) { console.log(err, err.stack); } else { console.log(data.Table.ItemCount); // 근사 아이템 개수 } });
- 이 방식에 대한 자세한 아티클이 있다.
- DDB는 Aggregate 연산과 같은 통계적 연산을 잘 지원하지 않는다. 대체로 단일 항목에 대한 일관된 읽기/쓰기를 높은 성능을 유지하는 경우에 쓰기 좋다.
- 그렇기 때문에 본질적으로 개수 세기가 빈번한 경우에 DDB를 쓰는건 그닥 좋은 선택지는 아니다.
요약
요약: DDB는 개수세기에 부적합한 DB이다.