В настоящее время 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 для сканирования по полю.Это медленно, так как это означает, что вам, возможно, придется загружать всю базу данных в оперативную память, чтобы выполнить поиск.Чтобы обойти это, нужно иметь все поля, по которым вы хотите искать, в корневом объекте, однако это выглядит как искусственное ограничение.
Существуют ли какие-либо объектные базы данных, которые не страдают от этого ограниченияи разрешить индексирование любой строки в подобъекте?
Обновление
Ответ №1:
Я нашел метод, который дает лучшееобоих миров: простота использования (с иерархической структурой) и ослепительно быстрые собственные запросы с использованием полной индексации всего дерева.Он включает в себя небольшую хитрость и метод, который кэширует содержимое родительских узлов:
- Создайте вложенную иерархию как обычно.
- Для каждого подузла создайте обратнуюссылка на родительский узел.
- Теперь вы можете запросить конечные узлы.Сейчас мы на полпути - мы можем запрашивать, однако, это медленно, так как нужно выполнить соединение, чтобы перемещаться вверх по узлам дерева, если вы хотите выполнить поиск по какому-либо параметру в родительском узле.вверх, создайте параметр «cache», который кэширует условия поиска в родительском узле.Это метод, который изначально имеет значение null, при первом вызове он выполняет дорогостоящее соединение, затем он зеркально отображает поле, и с этого момента поиск выполняется очень быстро.
- Это хорошо работает для данных, которыеникогда не меняется, то есть температура образцов со временем.Если данные будут меняться, то вам понадобится какой-то способ очистки кэшированных значений, если значение в корневом узле изменяется, возможно, путем установки «грязного» флага в каждом листовом узле.
Ответ# 2:
Если вы используете массив вместо списка, вы можете спуститься в дочерний узел, используя SODA.Если вы используете List, SODA не поддерживает его, поэтому вы просто не можете выполнять запросы с помощью SODA (или чего-либо еще, что зависит от SODA, например LINQ, QBE, Native query и т. Д.).