Какие объектные базы данных позволяют индексировать все в базе данных? - PullRequest
0 голосов
/ 26 февраля 2011

В настоящее время 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:

Я нашел метод, который дает лучшееобоих миров: простота использования (с иерархической структурой) и ослепительно быстрые собственные запросы с использованием полной индексации всего дерева.Он включает в себя небольшую хитрость и метод, который кэширует содержимое родительских узлов:

  1. Создайте вложенную иерархию как обычно.
  2. Для каждого подузла создайте обратнуюссылка на родительский узел.
  3. Теперь вы можете запросить конечные узлы.Сейчас мы на полпути - мы можем запрашивать, однако, это медленно, так как нужно выполнить соединение, чтобы перемещаться вверх по узлам дерева, если вы хотите выполнить поиск по какому-либо параметру в родительском узле.вверх, создайте параметр «cache», который кэширует условия поиска в родительском узле.Это метод, который изначально имеет значение null, при первом вызове он выполняет дорогостоящее соединение, затем он зеркально отображает поле, и с этого момента поиск выполняется очень быстро.
  4. Это хорошо работает для данных, которыеникогда не меняется, то есть температура образцов со временем.Если данные будут меняться, то вам понадобится какой-то способ очистки кэшированных значений, если значение в корневом узле изменяется, возможно, путем установки «грязного» флага в каждом листовом узле.

Ответ# 2:

Если вы используете массив вместо списка, вы можете спуститься в дочерний узел, используя SODA.Если вы используете List, SODA не поддерживает его, поэтому вы просто не можете выполнять запросы с помощью SODA (или чего-либо еще, что зависит от SODA, например LINQ, QBE, Native query и т. Д.).

Ответы [ 2 ]

2 голосов
/ 26 февраля 2011

Ну, вы можете индексировать SubClass.thisIsNotIndexed в вашем примере.И поэтому вы быстро можете найти экземпляры подкласса.

Но, конечно, вы правы в том, что не можете индексировать коллекции.Под этим я подразумеваю, что невозможно иметь эффективные запросы, если коллекции содержат определенные элементы и т. Д. Например, если вы хотите запросить все RootClass, которые содержат определенный SubClass.Этот случай будет медленным из-за отсутствия надлежащей индексации коллекции.

В db4o вам придется обойти эту проблему.Примером может быть добавление поля в подкласс, которое содержит ссылку на родителя.Тогда вы сможете эффективно выполнить запрос.

Еще одна маленькая вещь.Вы можете установить индекс на поле коллекции.Но это всего лишь указатель на ссылку на объект коллекции.Это позволит вам найти объект, который имеет ссылку на определенный экземпляр коллекции.Это обычно довольно бесполезно.

Я предполагаю, что большие объектные базы данных поддерживают индексацию коллекций и запросов, которые идут с этим.

1 голос
/ 26 февраля 2011

Я основываю это на своем опыте работы с DB40 в Scala & Java, но, надеюсь, это все еще действует: поле contentsNotIndexed содержит экземпляры ArrayList, поэтому индексирование этого поля должно помочь вам только в запросе этих экземпляров ArrayList.Если вы хотите эффективно запрашивать содержимое этих списков, вам нужно будет определить индекс для объектов, которые вы ожидаете найти внутри списков, и опустить свой запрос в ArrayList под полем «contentsNotIndexed».Я не знаю, как внутреннее устройство ArrayList предлагает, где это может происходить.

В зависимости от ваших потребностей, вы также можете спроектировать свой класс для использования массива вместо ArrayList в некоторых случаях для достижения эффекта, который выхочу.

...