0

目前,db4o不允许对收藏内容进行索引。什么对象数据库允许索引数据库中的任何单个字段?什么对象数据库允许索引数据库中的所有内容?

实施例:

class RootClass 
{ 
    string thisIsIndexed; // Field can be indexed for quick searching. 
    IList<SubClass> contentsNotIndexed = new ArrayList(); // Creates a 1-to-many relationship. 
} 

class SubClass 
{ 
    string thisIsNotIndexed; // Field cannot be indexed. 
} 

对于db4o的由字段“thisIsNotIndexed”进行搜索,那就要加载完整的对象到内存中,然后使用LINQ到对象通过场进行扫描。这很慢,因为这意味着您可能必须将整个数据库加载到RAM中才能执行搜索。解决此问题的方法是在根对象中包含要搜索的所有字段,但这看起来像是一种人为限制。

是否有任何不受此限制的对象数据库,并允许索引子对象中的任何字符串?

更新

答案#1:

我发现这给两全其美的方法:使用全索引的易用性(具有层次结构),以及令人眼花缭乱的快速机查询整棵树。它涉及到一个位一招,那缓存父节点的内容的方法:

  1. 创建嵌套层级为正常。
  2. 对于每个子节点,创建对父节点的反向引用。
  3. 您现在可以查询叶节点。现在我们已经到了一半 - 但是,我们可以查询它的速度慢,因为如果要通过父节点中的某个参数进行搜索,它必须执行连接才能导航树节点。
  4. 为了加快速度,创建一个“缓存”参数,在父节点中缓存搜索条件。它的一个方法最初设置为null,它第一次调用它进行昂贵的连接,然后它反映了该领域,从那时起搜索就非常快速。
  5. 这适用于永不改变的数据,即温度样本随着时间的推移。如果数据将要改变,那么如果根节点中的值发生变化,您可能需要通过在每个叶节点中设置一个“脏”标志来清除缓存的值。

答案#2:

如果你使用一个数组,而不是一个列表,你可以下降到使用SODA的子节点。如果您使用List,SODA不支持它,所以您不能使用SODA(或任何其他依赖SODA的查询,如LINQ,QBE,Native查询等)进行查询。

回答

1

我这个基础上根据斯卡拉&的Java我的DB40经验,但希望这是仍然有效:字段“contentsNotIndexed”持有ArrayList的实例,因此该索引字段应该只assit您在查询这些ArrayList的实例。如果您想要有效地查询这些列表的内容,则必须为您希望在列表中找到的对象定义一个索引,然后在“contentsNotIndexed”字段下面查询ArrayList。我不知道ArrayList的内部来建议可能下降的地方。

根据您的需要,您还可以设计您的类以在某些情况下使用数组而不是ArrayList来实现所需的效果。

+0

您引用了“根据您的需要,您还可以设计您的课程以在某些情况下使用数组而不是ArrayList来实现您想要的效果。” - 我很好奇你会如何做这个设计?也许添加一个从“子查询”到“rootclass”的反向链接,这将允许您半效创建一个查询,通过“子类”和“主类”的内容进行过滤? – Contango 2011-02-27 23:18:39

+0

在DBO4O中,至少在Java/Scala下,可以将(SODA方式)下降到数组值域并按照您对其他域的查询方式进行查询。 – 2011-02-28 03:18:57

+0

非常好,感谢您的反馈。 – Contango 2011-02-28 12:44:31

2

那么,你可以在你的例子中索引SubClass.thisIsNotIndexed。因此您可以快速找到子类实例。

但是,当然你是对的,你不能索引集合。由此我的意思是,如果一个集合包含某些元素等,则不可能有效的查询。例如,如果您想查询包含某个子类的所有RootClass。由于缺乏适当的收集索引,这种情况会比较缓慢。

在db4o中,您必须解决此问题。一个例子是在SubClass上添加一个包含对父级引用的字段。然后你可以有效地进行查询。

另一个小东西。您可以在收集字段上设置索引。但那只是对收集对象的引用的索引。这将允许你找到对某个collection-instance有引用的对象。这通常很没用。

我猜更大的对象数据库确实支持与它一起收集和查询索引。

+0

谢谢,我非常感谢澄清。我很喜欢db4o,它是一个非常棒的数据库 - 但为了记录,您是否知道任何品牌名称对象数据库都允许引用“支持收集和查询的索引”? – Contango 2011-02-27 23:16:03

+0

感谢您的评论“在db4o中,你必须解决这个问题,一个例子就是在SubClass中添加一个包含父对象引用的字段,然后你就可以有效地进行查询。”实际上,每个查询都会在“子类”和“rootclass”之间进行按ID查找,或者它是否是一个真正有效的查询,它将根据“rootclass”中的索引字段和“子类中的索引字段“? – Contango 2011-02-27 23:20:57

+0

不,我不能支持这种索引的对象数据库,因为我没有使用它们/试用过它。在添加对根类的引用时查询的效率如下:是的,这基本上是一个连接,当您还为根类添加条件时。如果标准只影响子类,那么它是一个简单的查询。但是你通过引用导航到根类。 – Gamlor 2011-02-27 23:30:12

相关问题