在OrientDB中添加两个文档之间链接的最有效方法是什么

时间:2016-03-03 00:33:34

标签: java orientdb

背景

我注意到在我的应用程序中花费了大量时间用于使用Java API在文档之间添加链接。我试图尽可能减少这段时间。

上下文

假设两个文档类CarEngine的{​​{1}} LINKCar。还假设在单独的事务中,引擎始终在任何依赖汽车之前插入数据库。鉴于这种情况,假设汽车只知道碰巧被索引的相应引擎业务密钥Engine,将Car链接到Engine的最有效方法是什么?

据我所知,有三种使用Java API的方法:

客户端:engineId

之前的完整文档链接

使用save()的默认fetchplan天真地加载依赖项的完整文档:

*:0

客户端:// Return all of the first level fields val query = "SELECT FROM Engine WHERE engineId = ?"; val engine = db.query(new OSQLSynchQuery<ODocument>(query), engineId).get(0); val car = new ODocument("Car"); ... car.field("engine", engine); car.save(); 之前的@rid链接

不是加载完整文档,而是仅通过其save()

加载对文档的引用
rid

服务器端:// Only return the @rid val query = "SELECT @rid FROM Engine WHERE engineId = ?"; val result = db.query(new OSQLSynchQuery<ODocument>(query), engineId).get(0); val car = new ODocument("Car"); ... car.field("engine", (ODocument) result.field("rid")); car.save();

之后的更新命令

执行更新服务器端:

save()

这些方法之间有区别吗?还有更好的方法吗?

更新

经过一些分析后发现这是一个问题,因为val car = new ODocument("Car"); ... car.save(); // Update on server-side val command = "UPDATE " + car.getIdentity() + " SET engine = (SELECT FROM Engine WHERE engineId = $parent.$current.engineId)"; db.command(new OCommandSQL(command)).execute(); 应该被查找的字段丢失了。因此,该指数未被使用。添加其他字段(比如说Engine)后,情况有了显着改善。但是,我仍然对推荐的方法感到好奇。

0 个答案:

没有答案