Если у меня есть 2 миллиона строк в базе данных db4o, вы бы порекомендовали большую плоскую таблицу или иерархию?

У меня 2 миллиона строк в плоской таблице db4o. Большая часть информации повторяется — например, в первом столбце есть только три возможные строки.

Я мог бы легко разбить таблицу на 4-уровневую иерархию (т. е. перейти от корня >> символ >> дата >> финальная таблица) — но стоит ли это того с точки зрения скорости и обслуживания программного обеспечения?

Если выяснится, что было бы чище разбить таблицу на иерархию, есть ли какие-либо рекомендации по хорошему способу достижения этого в текущей структуре db4o?

Ответы на вопросы

Чтобы на самом деле ответить на ваш вопрос, мне нужно больше информации. Какую информацию вы храните?

Я храню объекты, содержащие строки и двойные числа. Иерархия по идее точно подобна файловой системе с каталогами, подкаталогами и под-подкаталогами: один корневой узел содержит массив подклассов, а каждый подкласс, в свою очередь, содержит дополнительные массивы под-подкаталогов. -классы и т.д. Вот пример кода:

// rootNode---|
//            sub-node 1----|
//                          |-----sub-sub-node 1
//                          |-----sub-sub-node 2
//                          |-----sub-sub-node 3
//                          |-----sub-sub-node X (others, N elements)
//            sub-node 2----|
//                          |-----sub-sub-node 1
//                          |-----sub-sub-node 2
//                          |-----sub-sub-node 3
//                          |-----sub-sub-node X (others, N elements)
//            sub-node 3----|
//                          |-----sub-sub-node 1
//                          |-----sub-sub-node 2
//                          |-----sub-sub-node 3
//                          |-----sub-sub-node X (others, N elements)
//            sub-node X (others, N elements)
class rootNode
{
  IList<subNode> subNodeCollection = new List<subNode>();
  string rootNodeParam;
}
class subNode
{
  IList<subSubNode> subSubNodeCollection = new List<subSubNode>();
  string subNodeParam;
}
class subSubNode
{
  string subSubNodeParam;
}

// Now, we have to work out a way to create a query that filters 
// by rootNodeParam, subNodeParam and subSubNodeParam.

Каковы схемы доступа к вашим данным? Читают одиночные объекты по запросу/поиску. Или вы читаете много объектов, которые связаны друг с другом?

Я пытаюсь перемещаться по дереву, фильтруя по параметрам.

В общем, db4o (и другие объектные базы данных) хороши для навигационного доступа. Это означает, что вы сначала запрашиваете некоторые объекты, а оттуда переходите к связанным объектам. Например, вы сначала запрашиваете пользовательский объект. Оттуда вы переходите к домам, городу, работе, друзьям и т. д. пользователей. Такой доступ отлично работает в db4o.

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

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

Да, но есть ли способ сделать запрос, если каждый подузел содержит коллекцию?


person Contango    schedule 24.02.2011    source источник
comment
Некоторые примечания: данные сильно не изменятся, они довольно статичны. Кроме того, очевидно, что db4o не может индексировать коллекции — не помешает ли это использованию иерархии, поскольку ее станет практически невозможно реализовать?   -  person Contango    schedule 24.02.2011
comment
Некоторые заметки. Не добавляйте информацию в комментарии. Обновите вопрос, чтобы завершить его. Затем удалите комментарий.   -  person S.Lott    schedule 24.02.2011
comment
DB4O - это объектная база данных - в ней нет таблиц, поэтому я не уверен, что вы подразумеваете под плоской таблицей db4o. Какие объекты вы храните?   -  person Sam Stainsby    schedule 24.02.2011
comment
Возможно, он имел в виду, что DB4O по-прежнему будет работать так же хорошо, как реляционная БД, если у нее будет 2 миллиона строк объектов.   -  person LEMUEL ADANE    schedule 28.11.2011


Ответы (1)


Как уже отмечал Сэм Стейнсби в своем отзыве, в db4o нет понятия таблиц. В нем хранятся объекты, и это единица хранения db4o. Не пытайтесь мыслить таблицами, это не работает с db4o.

Как вы сказали, вы повторяете информацию, так что это хороший кандидат для разделения в других объектах, на которые затем могут ссылаться другие объекты. В общем, я бы сначала разработал хорошую модель предметной области, чтобы знать, как данные организованы и связаны друг с другом. И подумать о том, какие у вас есть шаблоны доступа к данным. Затем попытайтесь выяснить, как можно спроектировать классы/объекты так, чтобы они работали с db4o.

Чтобы на самом деле ответить на ваш вопрос, мне нужно больше информации. Какую информацию вы храните? Каковы схемы доступа к вашим данным? Читают одиночные объекты по запросу/поиску. Или вы читаете много объектов, которые связаны друг с другом?

В общем, db4o (и другие объектные базы данных) хороши для навигационного доступа. Это означает, что вы сначала запрашиваете некоторые объекты, а оттуда переходите к связанным объектам. Например, вы сначала запрашиваете пользовательский объект. Оттуда вы переходите к домам, городу, работе, друзьям и т. д. пользователей. Такой доступ отлично работает в db4o.

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

Кстати: если вы считаете, что более естественно думать о таблицах для ваших данных, я рекомендую использовать реляционную базу данных. Базы данных отношений прекрасно справляются с таблицами.

person Gamlor    schedule 24.02.2011
comment
Большое спасибо за ваши комментарии, вы много знаете о db4o, и я благодарен за вашу помощь. Я ответил на ваши вопросы как можно лучше, выше. - person Contango; 28.02.2011