deleted-mifki
@deleted-mifki

Как организовать хранение и выборку таких данных?

(Речь о десктопном приложении)
Есть некоторые объекты с датой, несколькими флагами и набором меток. Пользователь фиксирует фильтр по меткам, причём он может быть очень сложный, типа "(tag1 and tag2) or ((tag3 or tag4) and not tag5)". После этого для визуализации идут в большом количестве выборки по интервалу дат и флагам, но, соответственно, только в пределах установленного фильтра. Кстати, всегда данные сортируются по дате. Как бы такое лучше организовать?

Мысли:
1. Обычная SQL база и не заморачиваться. Но выборка по такому фильтру будет очень сложная и небыстрая.
2. Хранить в ненормализованном виде — список тэгов для каждого объекта. Тогда быстро производим выборку по дате/флагам, потом программно фильтруем по тегам. Но, получается, индексов по тегам уже никаких нет.
3. Хранить отсортированных список ключей объектов для каждого тега, по фильтру выбираем списки объектов и сливаем их при необходимости вместе.
4. После выборки любым способом по фильтру создавать временную базу с индексами для сортировки и флагов и работать с ней дальше. Из минусов — необходимость её постоянно актуализировать при изменении основной базы.
  • Вопрос задан
  • 3864 просмотра
Пригласить эксперта
Ответы на вопрос 3
AlexeyParhomenko
@AlexeyParhomenko
Разбейте задачу на составляющие и решайте по мере. Вы какую решаете?

— поиск ключей по тегу?
— быстрая выборка?
— поиск ключей по флагу?

1. Найдите алгоритм поиска ключей по тегу для вашей задачи максимально быстрый. Это не суть, будет это sql или nosql. Мы же не знаем каких объемов там данные. Да и вы можете это найти только по нагрузочным тестам. Главное помните, что поиск по primary key и по данным в оперативной памяти всегда эффективный, поэтому если это будет id вашего тега — вы сможете быстро найти нужные ключи записей.
2. Быстрая выборка != быстрому запросу. За сеанс у вас может пройти 3-5 коротких запроса по разным таблицам (базам) и это будет существенно быстрее. Разберите свои данные и идите от меньших объемов к большим в разборе.
3. Определите, что это за ключи/флаги — строки или числа. Соответственно исходя из этого примите решение с помощью каких алгоритмов их быстрее находить.
Ответ написан
vaevictus
@vaevictus
Если тегов немного — попробуйте битовую маску, она работает очень быстро
Ответ написан
Комментировать
@Urevic
Посмотрите в сторону Lucene или Sphinx, они умеют очень быстро такие выборки делать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы