Иерархическая вложенная структура данных в db4o (или любом другом oodb)
На самом деле мой вопрос заключается в том, что если бы я использовал вложенную структуру данных в oodb, я бы поместил экземпляры классов в другие экземпляры в БД, или было бы какое-то реляционное отображение, которое потребовалось бы.
Я был заинтересован в OODB (объектно-ориентированные базы данных) в течение года или около того. По сути, я являюсь разработчиком веб-приложений и уже некоторое время замечаю серьезные ограничения как в плане сложности, так и в плане эффективности представления сложных иерархических структур, таких как иерархия веб-сайтов, в реляционных моделях, таких как MS T-SQL и MySQL.
Чтобы представить пример быстрого java (псевдокода):-
ТИП КЛАССА / БД:
public class PageObject{
public String title = "";
public String shortname = "";
public boolean published = false;
public PageObject[] pages = null;
public PageObject() {}
}
Так что, если бы мы начали с этого класса, который мог бы содержать другие экземпляры того же класса в массиве страниц (или в векторе, или в коллекции, или что-то еще), мы могли бы в конечном итоге получить возможность иметь макет сайта как таковой:-
- Главная
- Первый Домашний Ребенок
- 1
- 2
- 3
- Второй домашний ребенок
- Третий Дом Ребенка
- Первый Домашний Ребенок
Глядя на это, мы видим, что элемент Home будет иметь 3 элемента, хранящихся в его коллекции страниц, а элемент First Home Child в этой коллекции будет иметь еще 3 элемента в своей собственной коллекции страниц.
Если бы мы затем сохранили эту структуру в DB4O (или любом другом OODB), это вызвало бы проблемы с точки зрения производительности, поскольку любые вызовы объектов верхнего уровня, таких как домашняя страница, также возвращали бы ВСЕ элементы под ними, предполагая, что база данных значительно увеличивается.?
Этот вопрос может показаться весьма субъективным, за что я заранее прошу прощения, но я просто не могу вырвать свою голову из реляционной модели, поэтому у меня есть реальные проблемы, даже если я пытаюсь спланировать какую-либо модель данных, прежде чем перейти к дальнейшая работа в коде.
Любая ясность, которую кто-либо может пролить на это, будет абсолютно цениться на этом этапе! Заранее благодарим за любые мысли!
2 ответа
Именно здесь OODB идеально подходят, когда вы имеете дело со сложными иерархиями объектов, когда таблицы и объединения кажутся излишними. db4o (и другие oodbs, такие как Versan't VOD) не нужно использовать соединения (как в rdbms) и прозрачно обрабатывать отношения между объектами (как определено в вашей объектной модели). По сути, ваша объектная модель оказывается вашей моделью данных или схемой. Эти системы oodbms обычно работают лучше, чем rdbms при работе с вложенными структурами, и даже могут обрабатывать циклические ссылки.
Чтобы избежать загрузки / хранения большего количества объектов, чем ожидалось, oodbms может работать с произвольными уровнями глубины активации (или обновления) объектов (например, в вашем примере вы можете указать БД только извлекать / обновлять домашних потомков первого уровня). В качестве альтернативы вы можете настроить их на работу в прозрачном постоянном режиме (как предполагает Сэм), где БД получает или обновляет только то, к чему вы обращаетесь по требованию (то есть, когда вы перемещаетесь по дереву объектов).
Дополнительная информация (db4o): http://developer.db4o.com/Documentation/Reference/db4o-8.0/java/reference/Content/basics/activation.htm
НТН
Лучший!
Немецкий
Если ваша иерархия действительно является деревом, не лучше ли смоделировать это с помощью родительских отношений (извините, я не могу заставить себя использовать класс с именем PageObject
):
class Page {
Page parent = null
}
? Затем вы можете найти корни, выполнив поиск по всем страницам с нулевым родителем.
В общем, вы также должны узнать о прозрачной активации.
Другой способ, который является "полу-реляционным", состоит в том, чтобы определить объекты страницы без информации о содержании и объектов отношения удержания:
class Page
class Contains {
Page container
Page contained
}
Здесь, вытаскивая объект Contains из базы данных, в худшем случае извлекаются две страницы. Вы должны тщательно управлять удалением страниц.
PS: простите мою сокращенную Java, я слишком привык к Scala.