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