DynamoDB에서 개수 세는 법

태그
서버엔지니어링
데이터베이스
NoSQL
AWS DynamoDB

노트

  • 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); // 근사 아이템 개수 } });
    • Stream을 써서 Counting Table 또는 Counting Record를 기록하는 방법이 있다.
      • 이 방식에 대한 자세한 아티클이 있다.
    • 당연하게도 하면 안되겠지만 그냥 FullScan 도 방법이라면 방법일 것이다.
  • DDB는 Aggregate 연산과 같은 통계적 연산을 잘 지원하지 않는다. 대체로 단일 항목에 대한 일관된 읽기/쓰기를 높은 성능을 유지하는 경우에 쓰기 좋다.
  • 그렇기 때문에 본질적으로 개수 세기가 빈번한 경우에 DDB를 쓰는건 그닥 좋은 선택지는 아니다.

요약

📌
요약: DDB는 개수세기에 부적합한 DB이다.