иерархическая вложенная структура данных в db4o (или любом другом oodb) - PullRequest
1 голос
/ 26 мая 2011

На самом деле мой вопрос таков: если бы я использовал вложенную структуру данных в 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() {}

}

Так что, если бы мы начали с этого класса, который был бы способен содержать другие экземпляры того же класса в массиве страниц (или вектор, или коллекцию, или что-то еще), мы могли бы в конечном итоге получить возможность иметь макет сайта как например: -

  • Home
    • Первый Домашний Ребенок
      • 1
      • 2
      • 3
    • Второй домашний ребенок
    • Третий Дом Ребенка

Глядя на это, мы видим, что элемент Home будет иметь 3 элемента, хранящихся в его коллекции pages , с First Домашний ребенок предмет в этой коллекции, имеющий еще 3 предмета в собственной страницах коллекции.

Если бы мы затем сохранили эту структуру в DB4O (или любом другом OODB), это вызвало бы проблемы с точки зрения производительности, поскольку любые вызовы объектов верхнего уровня, таких как домашняя страница, также возвращали бы ВСЕ элементы под ними, предполагая, что база данных значительно растет?

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

Любая ясность, которую кто-либо может пролить на это, будет абсолютно признательна на данном этапе! Заранее благодарим за любые мысли!

Ответы [ 2 ]

4 голосов
/ 27 мая 2011

Именно здесь 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

НТН

Best!

Немецкий

0 голосов
/ 26 мая 2011

Если ваша иерархия действительно является деревом, не лучше ли смоделировать это, используя родительские отношения (извините, я не могу заставить себя использовать класс с именем PageObject):

class Page {
  Page parent = null
}

?Затем вы можете найти корни, выполнив поиск по всем страницам с нулевым родителем.

В общем, вы также должны узнать о прозрачной активации.

Другой способ, который является «полу-реляционным», заключается в определении объектов Page без информации о содержании и объектов отношения удержания:

class Page

class Contains {
   Page container
   Page contained
}

Здесь, вытаскивая объект Contains из базы данных, в худшем случае извлекаются две страницы.Вы должны тщательно управлять удалением страниц.

PS: простите за мою сокращенную Java, я слишком привык к Scala.

...