(Речь о десктопном приложении)
Есть некоторые объекты с датой, несколькими флагами и набором меток. Пользователь фиксирует фильтр по меткам, причём он может быть очень сложный, типа "(tag1 and tag2) or ((tag3 or tag4) and not tag5)". После этого для визуализации идут в большом количестве выборки по интервалу дат и флагам, но, соответственно, только в пределах установленного фильтра. Кстати, всегда данные сортируются по дате. Как бы такое лучше организовать?
Мысли:
1. Обычная SQL база и не заморачиваться. Но выборка по такому фильтру будет очень сложная и небыстрая.
2. Хранить в ненормализованном виде — список тэгов для каждого объекта. Тогда быстро производим выборку по дате/флагам, потом программно фильтруем по тегам. Но, получается, индексов по тегам уже никаких нет.
3. Хранить отсортированных список ключей объектов для каждого тега, по фильтру выбираем списки объектов и сливаем их при необходимости вместе.
4. После выборки любым способом по фильтру создавать временную базу с индексами для сортировки и флагов и работать с ней дальше. Из минусов — необходимость её постоянно актуализировать при изменении основной базы.
Разбейте задачу на составляющие и решайте по мере. Вы какую решаете?
— поиск ключей по тегу?
— быстрая выборка?
— поиск ключей по флагу?
1. Найдите алгоритм поиска ключей по тегу для вашей задачи максимально быстрый. Это не суть, будет это sql или nosql. Мы же не знаем каких объемов там данные. Да и вы можете это найти только по нагрузочным тестам. Главное помните, что поиск по primary key и по данным в оперативной памяти всегда эффективный, поэтому если это будет id вашего тега — вы сможете быстро найти нужные ключи записей.
2. Быстрая выборка != быстрому запросу. За сеанс у вас может пройти 3-5 коротких запроса по разным таблицам (базам) и это будет существенно быстрее. Разберите свои данные и идите от меньших объемов к большим в разборе.
3. Определите, что это за ключи/флаги — строки или числа. Соответственно исходя из этого примите решение с помощью каких алгоритмов их быстрее находить.
Ну оно же все сразу происходит, пользователь на экране получает объекты, выбранные по дате/флагам с учётом фильтров, даты/фильтры меняются часто, фильтр — нет. Поэтому, если я смогу быстро фильтровать только по тегам, но потом буду долго выбирать по датам — толку мало.
Почему — вы будете потом долго выбирать по датам? Что для вас долго? Какого рода данные? Их объем?
Повторюсь, разбейте задачи на подзадачи и станет намного яснее. Формируйте поиск по объему данных, иначе у вас какой-то сферический вакуум.