目前,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:
我发现这给两全其美的方法:使用全索引的易用性(具有层次结构),以及令人眼花缭乱的快速机查询整棵树。它涉及到一个位一招,那缓存父节点的内容的方法:
- 创建嵌套层级为正常。
- 对于每个子节点,创建对父节点的反向引用。
- 您现在可以查询叶节点。现在我们已经到了一半 - 但是,我们可以查询它的速度慢,因为如果要通过父节点中的某个参数进行搜索,它必须执行连接才能导航树节点。
- 为了加快速度,创建一个“缓存”参数,在父节点中缓存搜索条件。它的一个方法最初设置为null,它第一次调用它进行昂贵的连接,然后它反映了该领域,从那时起搜索就非常快速。
- 这适用于永不改变的数据,即温度样本随着时间的推移。如果数据将要改变,那么如果根节点中的值发生变化,您可能需要通过在每个叶节点中设置一个“脏”标志来清除缓存的值。
答案#2:
如果你使用一个数组,而不是一个列表,你可以下降到使用SODA的子节点。如果您使用List,SODA不支持它,所以您不能使用SODA(或任何其他依赖SODA的查询,如LINQ,QBE,Native查询等)进行查询。
您引用了“根据您的需要,您还可以设计您的课程以在某些情况下使用数组而不是ArrayList来实现您想要的效果。” - 我很好奇你会如何做这个设计?也许添加一个从“子查询”到“rootclass”的反向链接,这将允许您半效创建一个查询,通过“子类”和“主类”的内容进行过滤? – Contango 2011-02-27 23:18:39
在DBO4O中,至少在Java/Scala下,可以将(SODA方式)下降到数组值域并按照您对其他域的查询方式进行查询。 – 2011-02-28 03:18:57
非常好,感谢您的反馈。 – Contango 2011-02-28 12:44:31