0

은행 계좌에서 그래프 데이터베이스로 간단한 거래를 상상해보십시오.Azure CosmosDB 그래프 통과 성능 문제

  1. + $ 1000현금 입력 :이 같은 행사로.
  2. - $ 10VISA에서 책 구입하기.
  3. + $ 100오래된 자전거 판매용 현금.
  4. - $ 50 012식료품 구매시 현금. 그래프 구조에

우리는 거래로 노드를 정의 할 수있는 특성을 가진 :

  • ID - 트랜잭션 ID
  • 시간 - 트랜잭션이 일어 났을 때의 타임 스탬프 .
  • 델타 - 트랜잭션에 대한 이유 - 트랜잭션
  • 설명에 (+/-) 사용의 금액.

가장자리는 이전의 트랜잭션을 가리킬 것입니다. 우리는 다른 계정 (계정 간 전송), 소유자 등을 가리키는 다른 모서리를 가질 수 있지만 단순성을 위해이 구조를 갖습니다. 이제

g.addV('transactions').property('id','1').property('time',0).property('delta',1000).property('description','cash input') 
g.addV('transactions').property('id','2').property('time',1).property('delta,-10).property('description','for buying a book by VISA') 
g.V('2').addE('previous').to(g.V('1')) 
g.addV('transactions').property('id','3').property('time',2).property('delta',100).property('description','cash for selling an old bike.') 
g.V('3').addE('previous').to(g.V('2')) 
g.addV('transactions').property('id','4').property('time',3).property('delta',-50).property('description','cash for buying groceries') 
g.V('4').addE('previous').to(g.V('3')) 

는 다음과 같이, 특정 날짜까지, 또는 처음으로, 우리가 최신의 거래에서 이전 가장자리를 통과 할이 계정의 현재 목록을 얻을 수 있습니다 :

g.V('4').emit().repeat(out('previous')).until(has('time',0)).properties('delta').value().sum() 

==>4 좋은 빠른 전부입니다 1040

거래. 그러나 트랜잭션의 경우 약 8 분이 걸리며 더 복잡한 작업이나 더 많은 데이터의 경우 더 오래 걸립니다.

제 테스트의 경우 그래프 API와 처리량 2000 RU/s로 Azure Cosmos-DB를 설정했습니다.

저는 그래프 데이터베이스와 쿼리에 대해 상당히 익숙하지 않기 때문에이 작업을 더 빠르고 더 잘 수행 할 수있는 방법과이를 최적화하는 방법에 대해 알고 있습니다. 어쩌면 그래프 데이터베이스조차도이 작업에 적합한 도구가 아닐까요?

여기에서 달성하고자하는 것은 트랜잭션에 대한 합리적인 빠른 쿼리, 여러 계정으로 분기 할 수있는 쿼리 및 더 많은 이벤트입니다.

이 작업을 어떻게 개선 할 수 있습니까?

답변

3

각 트랜잭션 버텍스에 current 속성을 추가하면 어떨까요? 이렇게하면 현재의 기록을 유지할 수있을뿐만 아니라 현재 시점의 재고 값에 대한보다 신속한 액세스를 제공 할 수 있습니다. 또한 트랜잭션의 가치가 이후에 변경되면 이에 따라 모든 최신 트랜잭션을 쉽게 업데이트 할 수 있습니다 (그러나 이것은 장기 실행 쓰기 쿼리 일뿐 읽기는 여전히 맹렬 할 것입니다).

OLTP 쿼리에서 너무 많은 홉을 사용하는 것은 일반적으로 바람직하지 않습니다.

+0

안녕하세요. 답변 해 주셔서 감사합니다. 실제로 이것은 해결책 일 수 있지만 이러한 솔루션으로는 제대로 작동하지 않는 더 복잡한 쿼리가 있습니다. 결과를 캐싱하는 것은 우리가 고려하고있는 것이지만, 우선 제한을 결정하고 싶습니다. OLTP 쿼리에서 합리적인 수의 홉이 무엇이라고 말하는가? 이 순회 속도를 향상시키기 위해 할 수있는 일이 있습니까? – ifxdev

+0

Cosmos-DB에서 어떻게 처리되는지 모르겠지만 각 홉이 새 백엔드 쿼리를 트리거하므로 빠르게 추가됩니다. 만약 내가 숫자를 버리면, 나는 50 이하로 유지 될 것이라고 말하고 싶다. (매우 낮은 브랜치 팩터는 유스 케이스의 경우이다.) 그러나 그것은 단지 야생의 추측이며, 스스로를 더 잘 시험해야합니다. –