Быстрая версия:
В ситуации, когда группа иерархических данных уже загружена в память, лучше ли запрашивать исходную базу данных для поиска этих данных или просто для поиска данных, уже находящихся в памяти?
Полная версия:
Сначала немного информации о данных, с которыми я работаю:
Я имею дело с двумя типами сущностей, мы будем называть их P
s и S
s. Они организованы в иерархию, в которой S
может иметь группу S
s в качестве дочерних элементов или группу P
s в качестве дочерних элементов. У P
s могут быть только другие P
s как дети. Ниже приведена простая диаграмма, иллюстрирующая это:
Каждый P
и каждый S
имеют имя и идентификатор, а также некоторые другие простые свойства.
Задача под рукой:
Мне нужно разрешить пользователю искать имя P
, а затем отображать список совпадающих результатов вместе со строковым представлением пути P
. Аналогично пути к файлу / папке.
Структура данных:
В SQL Server эти элементы хранятся в двух таблицах: одна таблица для P
с и одна для S
с. Эти таблицы по своей природе являются ссылками на себя, то есть для отслеживания любого элемента дерева требуется рекурсивная процедура, но в какой-то момент дерево переходит из таблицы P
в таблицу S
, прежде чем достичь фактического корня.
В коде объект создается для каждого P
и S
, и они связаны друг с другом, давая каждому дочернему элементу ссылку на своего родителя, а каждому родительскому элементу - список его дочерних элементов.
Программа уже должна загрузить и отобразить все эти данные, прежде чем пользователю будет предоставлена возможность выполнить поиск.
Когда пользователь ищет, я могу:
(a) Запросите у SQL Server список совпадающих P
с, и запрос сгенерирует путь с помощью рекурсивной процедуры. Затем я бы сопоставил P
с его существующим объектом в памяти через идентификатор, как только пользователь сделает свой выбор.
Или
(b) Создайте плоский (то есть неиерархический) список P
s на основе данных, уже находящихся в памяти, и выполните поиск по ним, генерируя пути, используя обычный код.
Некоторые вещи, которые следует учитывать:
Будет всего пара десятков S
с и, возможно, 100-200 P
с.
Меня не особо волнует, что данные в памяти могут устареть, если несколько человек используют программу одновременно.
Я мог бы создать простой список P
с и предварительно сгенерировать пути в фоновом потоке, пока программа загружается (перед любыми поисками), если идти с опцией b.
SQL Server может работать в сети, поэтому следует учитывать задержку.
Сервер SQL и компьютер, на котором запущена программа, вероятно, будут иметь сопоставимую скорость, если они не работают на одном компьютере.
Итак, я полагаю, что главный вопрос здесь:
Есть ли какая-либо причина (производительность, лучшие практики, ремонтопригодность и т. Д.), Чтобы я запрашивал SQL Server, а не использовал данные, которые у меня уже есть в памяти?