我注意到在我的应用程序中花费了大量时间用于使用Java API在文档之间添加链接。我试图尽可能减少这段时间。
假设两个文档类Car
和Engine
的{{1}} LINK
到Car
。还假设在单独的事务中,引擎始终在任何依赖汽车之前插入数据库。鉴于这种情况,假设汽车只知道碰巧被索引的相应引擎业务密钥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
)后,情况有了显着改善。但是,我仍然对推荐的方法感到好奇。