Выполнить поиск, используя базу данных против данных, уже находящихся в памяти - PullRequest
0 голосов
/ 03 июля 2019

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

Полная версия:
Сначала немного информации о данных, с которыми я работаю:
Я имею дело с двумя типами сущностей, мы будем называть их P s и S s. Они организованы в иерархию, в которой S может иметь группу S s в качестве дочерних элементов или группу P s в качестве дочерних элементов. У P s могут быть только другие P s как дети. Ниже приведена простая диаграмма, иллюстрирующая это: Hierarchy diagram Каждый 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, а не использовал данные, которые у меня уже есть в памяти?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...