目前,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:
我找到了一种两全其美的方法:易于使用(具有层次结构),以及在整个树上使用完整索引的令人眼花缭乱的快速本机查询。它涉及到一点技巧,以及一个缓存父节点内容的方法:
- 照常创建嵌套层次结构。
- 对于每个子节点,创建对节点父节点的反向引用。
- 您现在可以查询叶节点。我们现在已经完成了一半 - 我们可以查询,但是,它很慢,因为如果您想通过父节点中的某些参数进行搜索,它必须进行连接才能向上导航树节点。
- 为了加快速度,请创建一个“缓存”参数,将搜索项缓存在父节点中。它是一个最初设置为 null 的方法,第一次调用它时会执行昂贵的连接,然后它会镜像该字段,并且从那时起搜索非常快。
- 这适用于从不改变的数据,即随时间变化的温度样本。如果数据将要更改,那么如果根节点中的值发生更改,您需要通过某种方式清除缓存值,可能是通过在每个叶节点中设置一个“脏”标志。
答案#2:
如果您使用 Array 而不是 List,则可以使用 SODA 下降到子节点。如果您使用 List,SODA 不支持它,因此您根本无法使用 SODA(或任何其他依赖于 SODA,例如 LINQ、QBE、Native 查询等)进行查询。