试想在银行帐户上作为一个图形数据库简单的交易。有了这样的活动:天青CosmosDB图的遍历性能问题
- + $ 1000个现金投入。
- - $ 10用VISA购买一本书。
- + $ 100现金用于销售旧自行车。
- - $ 50现金购买食品杂货。
在图形结构,我们可以定义节点作为交易与性能:
- 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()
==> 1040
这是所有又好又快交易。但这样做的交易时,大约需要8分钟,并用更复杂的操作或更多的数据需要花费更长的时间。
在我的测试情况下,我已经设置了一个蓝色的宇宙-DB与图形API和吞吐量2000 RU /秒。
因为我是相当新的图形数据库和查询,我意识到有可能是这样做的更快,更好的方式,以及如何优化这一点,我不知道。也许甚至图形数据库不是这份工作的正确工具?
我想在这里实现什么是合理的快速查询到的交易,可叉多个账户,还有更多的事件。
如何让这项工作更好?
嗨,谢谢你的回答。事实上,这可能是一个解决方案,但有更复杂的查询,这种解决方案不会很好地工作。兑现结果是我们正在考虑的事情,但首先我想确定这些限制。你会说什么是在OLTP查询中合理的跳数?我们能做些什么来改善这种遍历速度吗? – ifxdev
我不确定这是如何在Cosmos-DB中处理的,但我认为每一跳都会触发一个新的后端查询,因此它会快速累加起来。如果我不得不抛出一个数字,我会说保持在50以下(并且分支因数很低,这在你的用例中就是这种情况)。但这只是猜测,你应该更好地尝试一下。 –