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

Database design 哪些对象数据库允许对数据库中的所有内容进行索引?,database-design,db4o,object-oriented-database,Database Design,Db4o,Object Oriented Database,目前,不允许对集合的内容进行索引。哪些对象数据库允许对数据库中的任何单个字段进行索引 例如: class RootClass { string thisIsIndexed; // Field can be indexed for quick searching. IList<SubClass> contentsNotIndexed = new ArrayList(); // Creates a 1-to-many relationship. } class SubCla

目前,不允许对集合的内容进行索引。哪些对象数据库允许对数据库中的任何单个字段进行索引

例如:

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.
}
class根类
{
字符串ThisIndexed;//可以为字段编制索引以进行快速搜索。
IList contentsNotIndexed=new ArrayList();//创建一对多关系。
}
类子类
{
字符串thisIsNotIndexed;//无法为字段编制索引。
}
为了让db4o按字段“thisisnotindex”进行搜索,它必须将完整的对象加载到内存中,然后使用linqto对象扫描字段。这很慢,因为这意味着您可能必须将整个数据库加载到RAM中才能进行搜索。解决这个问题的方法是将所有要搜索的字段都放在根对象中,然而,这似乎是人为的限制

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

更新

答复#1:

我发现了一种兼顾两方面的方法:易用性(具有层次结构),以及在整个树上使用完整索引盲目快速地进行本机查询。这涉及到一些技巧,以及一种缓存父节点内容的方法:

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


    如果使用数组而不是列表,则可以使用SODA下降到子节点。如果您使用列表,SODA不支持它,因此您无法使用SODA(或任何依赖于SODA的其他内容,如LINQ、QBE、本机查询等)进行查询。

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


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

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


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

    好的,您可以为子类编制索引。在您的示例中,这不是索引。因此,您可以快速找到子类实例

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

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

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


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

    好的,您可以为该子类编制索引。在您的示例中,该子类没有编制索引。因此,您可以快速找到子类实例

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

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

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

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

    谢谢,我真的很感激