0

비용 추적자를 만들고 싶습니다. 알아야 할 사항 중 하나는 카테고리 당 매월 지출 한 금액입니다.FireStore/CloudDatastore에서 집계. 생성/업데이트시 클라우드 기능 사용?

FireStore/DataStore에서 어떻게해야합니까?

  1. 필요한 데이터를 가져 와서 집계를 로컬에서 수행 하시겠습니까? 아주 느린 것 같니?
  2. 트랜잭션이 생성/갱신 될 때마다 집계를 수행하고이를 테이블에 저장 하시겠습니까? 그러나 이로 인해 많은 기능이 호출 될 수 있으며 비용이 많이 듭니다.

더 좋은 방법이 있습니까? 현재 2가 최선의 선택이라고 생각하십니까? 하지만 어쨌든 내가 비용을 줄일 수 있는지 궁금해?

실시간 데이터로 집계 된 데이터가 필요하지 않을 수 있으므로 클라우드 기능 실행을 디버깅 할 수있는 방법이 있습니까? 나는 때때로 트랜잭션의 묶음을 일괄 적으로 삽입 할 것이라고 언급했기 때문에. 특정 쿼리에 대한 기능을 사용하지 않도록 설정하고 일괄 처리가 완료된 후 수동으로 호출하는 방법이 궁금한가요?

답변

0

설명하는 두 가지 방법이 실제로 가장 일반적입니다.

최상의 접근 방식은 주로 거래 수에 따라 다릅니다. 트랜잭션이 거의 없다면 각 클라이언트에서 집계를 수행하는 것이 좋습니다. 그러나 더 많은 거래가 발생하면 데이터를 다운로드하는 데 따르는 오버 헤드가 엄청나게 커지고 데이터베이스에 누적 합계를 유지하려는 경향이 커집니다.

일반적으로 모든 거래에 대해 최신 상태로 유지하는 것이 좋습니다. 트랜잭션을 사용하여 (여러 사용자가 서로의 업데이트를 덮어 쓰지 못하도록) 및 서버 측 보안 규칙 (악의적 인 행위자가 트랜잭션과 일치하지 않는 집계를 작성하지 못하도록)을 사용하여 클라이언트 측 코드로이를 수행 할 수도 있습니다.

일괄 적으로 집계하려면 제어하는 ​​서버 또는 클라우드 기능에서 코드를 주기적으로 실행해야합니다.

문서 작성을 디버깅하기 위해 클라우드 기능에 내장 된 기능은 없습니다. Firestore에서 디 바운스 카운터를 유지할 수는 있지만 각 트랜잭션마다 읽기/쓰기가 가능합니다.

이 블로그 게시물에 설명되어 있고이 비디오에 표시된 것처럼 더 합리적인 타이머 기능을 실행하는 것 같습니다. 그러나이 경우 데이터 구조가 코드에서 집계해야하는 트랜잭션을 감지 할 수 있도록해야합니다.

이렇게하는 한 가지 방법은 트랜잭션을 어떤 방식 으로든 정렬 할 수 있도록하는 것입니다. 그들에게 timestamp을 부여하고 집계 코드가 집계 한 마지막 시간 소인을 추적합니다 (데이터베이스에 있음). 그런 다음 수집기는이 실행될 때마다 :

  1. 가 집계 된 값
  2. 업데이트,
  3. 가 마지막으로 이러한 트랜잭션을 통해
  4. 루프를 실행 한 이후에 추가 된 트랜잭션에 대한 데이터베이스를 조회 현재 집계 된 값을 읽고 집계 된 값과 마지막 시간 소인을 트랜잭션의 데이터베이스에 다시 기록합니다 (둘 다 기록되는지 또는 기록되지 않도록 보장)