如何设计非sql数据库的查询

时间:2010-05-04 03:11:04

标签: nosql db4o

任何人都可以为非sql数据库查询界面设计模式提供一些参考吗?

对于基于sql的数据库,可以通过组合查询令牌来实现查询。 但对于非sql,如何设计查询,因为查询可能非常复杂。

修改

我使用db4o存储一些对象,我可能需要根据某个ID,时间范围或它们的组合进行查询。

如何设计查询方法?

public IEnumerable<Foo> GetFoos(int id);
public IEnumerable<Foo> GetFoos(int id, TimeRange range);

构建大量的重载似乎很愚蠢,如果需要新的查询怎么办?

2 个答案:

答案 0 :(得分:3)

在C#中,最好使用Linq。本机查询通常无法优化,这将导致db4o水合所有对象,并实际调用实例化对象上的lambda表达式。这只不过是对linq到对象的自动回退,而且相比之下它本来就很慢。仅仅保湿60k的典型物体需要几秒钟。

提示:绝不能调用lambda表达式的断点。

即使使用Db4oTool.exe优化本机查询作为构建后步骤,即使简单查询在域对象中使用属性或自动属性时也会出现问题。

linq提供商总是给我最好的结果。它具有最简洁的语法,并且它的优化工作。 linq提供程序也非常完整,只有它可能会比你期望的更频繁地回归到linq-to-objects。

此外,linq提供程序在项目文件夹中包含某些dll非常重要。这些取决于版本。如果您是using builds >= 14204,请确保{app}文件夹中有Mono.Reflection.dll

对于旧版本,必须存在以下所有内容:

Db4obects.Db4o.Instrumentation.dll
Db4objects.Db4o.NativeQueries.dll
Mono.Cecil.dll
Cecil.FlowAnalysis.dll

请注意,对于本机查询,即使在较新的版本中,这些仍然是必需的。

答案 1 :(得分:1)

看起来db4o使用自己的查询,Versant调用Native Queries(注意:.Net和Java native queries有单独的语法)。类似的东西:

IObjectContainer container = Database();
container.Query(delegate(Foo foo) {
    return foo.id == id;
});

container.Query(delegate(Foo foo) {
        return foo.id == id;
    },
    delegate(Foo foo) {
        return range.IsIn(foo.time);
    });
相关问题