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

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

更新

答案#1:

我找到了一种两全其美的方法:易于使用(具有层次结构),以及在整个树上使用完整索引的令人眼花缭乱的快速本机查询。它涉及到一点技巧,以及一个缓存父节点内容的方法:

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

答案#2:

如果您使用 Array 而不是 List,则可以使用 SODA 下降到子节点。如果您使用 List,SODA 不支持它,因此您根本无法使用 SODA(或任何其他依赖于 SODA,例如 LINQ、QBE、Native 查询等)进行查询。

4

2 回答 2

2

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

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

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

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

我猜更大的对象数据库确实支持集合索引和随之而来的查询。

于 2011-02-26T19:47:08.517 回答
1

我基于我在 Scala 和 Java 下使用 DB40 的经验,但希望这仍然有效:“contentsNotIndexed”字段包含 ArrayList 实例,因此索引该字段应该只帮助您查询那些 ArrayList 实例。如果您想有效地查询这些列表的内容,您将必须在您希望在列表中找到的对象上定义一个索引,然后将您查询到 ArrayList 的“contentsNotIndexed”字段下。我不知道 ArrayList 的内部结构来暗示它可能会下降到哪里。

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

于 2011-02-26T13:13:17.890 回答