哪些对象数据库允许索引数据库中的所有内容?

时间:2011-02-26 12:51:08

标签: database-design db4o object-oriented-database

目前,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-to-Objects扫描字段。这很慢,因为这意味着您可能需要将整个数据库加载到RAM中进行搜索。解决这个问题的方法是在根对象中包含要搜索的所有字段,但这似乎是一种人为的限制。

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

更新

回答#1:

我发现了一种方法,它提供了两全其美的优点:易用(具有分层结构),以及使用整个树上的完整索引的快速本机查询。它涉及一些技巧,以及缓存父节点内容的方法:

  1. 正常创建嵌套层次结构。
  2. 对于每个子节点,创建对父节点的反向引用。
  3. 您现在可以查询叶节点。我们现在只有一半 - 但是,我们可以查询它的速度很慢,因为如果你想通过父节点中的某个参数进行搜索,它必须进行连接以导航树节点。
  4. 要加快速度,请创建一个“缓存”参数,用于在父节点中缓存搜索项。它是一个最初设置为null的方法,第一次调用它进行昂贵的连接,然后它反映了字段,从搜索的那一点起非常快。
  5. 这适用于永不改变的数据,即温度样本随时间变化。如果数据将发生变化,那么如果根节点中的值发生更改(可能是通过在每个叶节点中设置“脏”标志),则需要某种方法来清除缓存的值。
  6. 回答#2:

    如果使用Array而不是List,则可以使用SODA进入子节点。如果你使用List,SODA不支持它,所以你根本无法使用SODA(或任何依赖SODA的东西,如LINQ,QBE,Native查询等)进行查询。

2 个答案:

答案 0 :(得分:2)

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

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

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

另一件小事。您可以在集合字段上设置索引。但那仅仅是对集合对象的引用的索引。这将允许您找到具有对某个集合实例的引用的对象。那通常很没用。

我认为较大的对象数据库确实支持对其进行索引的集合和查询的索引。

答案 1 :(得分:1)

我的基础是我在Scala&amp; amp; Java,但希望这仍然有效:字段'contentsNotIndexed'包含ArrayList实例,因此索引该字段应该只在您查询那些ArrayList实例时帮助您。如果要有效地查询这些列表的内容,则必须在列表中找到希望找到的对象的索引,然后将查询下移到“contentsNotIndexed”字段下的ArrayList中。我不知道ArrayList的内部结构可以暗示它可能会下降的地方。

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