Если бы у меня было 2 миллиона строк в базе данных db4o, вы бы порекомендовали большую плоскую таблицу или иерархию? - PullRequest
1 голос
/ 24 февраля 2011

У меня есть 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, но только тогда, когда вы можете перейти от корня к объекту символа и так далее.Это означает, что корневой объект имеет коллекцию своего дочернего объекта

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

1 Ответ

3 голосов
/ 24 февраля 2011

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

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

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

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

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

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

...