Есть сайт с карточками компаний
Их около 3000
Как правильно сделать фильтрацию? Есть фильтры по типу, цене, рейингу и тд
Если делать клиенткую фильтрацию, т опридется на сервере грузить все 3к компаний
Если серверную, то запрос заимает 5 секунд
Если грузить на сервер условно 20 компаний, а остальные догружать, то как будет работать фильтрация?
Все равно же придется грузить отфильтрованне компании из бд
Если для фильтрации всего лишь 3000 записей на бекенде коду требуется 5 секунд - что-то сделано принципиально не правильно на стороне бекенда.
Моё мнение - правильнее фильтрацию делать на бекенде, и грузить на фронт только 1 страницу отфильтрованных данных (и далее по пагинации или по скроллу подгружать следующие страницы)
kollfun,
1. Эти 3000 записей хранятся в БД? Какая СУБД используется? На каком ЯП написан бекенд?
В PostgreSQL например есть методы работы с координатами (расширение PostGIS), расчета расстояния и сортировки по этому расстоянию.
2. "проверию название, описаник, адрес и все услуги и категории" - это лучше фильтровать на уровне запроса к БД, перед расчетом расстояния.
3. "рядом со мной" - если есть координаты пользователя и координаты записи, то посчитать расстояние - это чистая математика, которая на любом ЯП занимает очень малое время.
Правильно там, где быстрее. Если запрос к серверу за данными и их обработку порождает маленький трафик и большой расчет - то на клиенте, чтобы не грузить сервер, если большой трафик и маленький расчет - то на сервере, чтобы не грузить канал связи между клиентом и сервером.
На вопрос нет однозначного ответа, все делается под конкретную задачу и конкретные обстоятельства. Но как выше было правильно сказано, если простой расчет занимает кучу времени - то начать следует с оптимизации структуры данных и запросов.
Ну и средства повышения производительности, как то кэширование и балансировщики нагрузки никто не отменял.
Ибо по другому фильтр «рядом со мной» не реализовать
Эмммм. Пространственные индексы для вас шутка?
Например в postgresql можно легко делать запросы вида "найди все точки в радиусе R от точки X" https://postgis.net/
2. "проверию название, описаник, адрес и все услуги и категории" - это лучше фильтровать на уровне запроса к БД, перед расчетом расстояния.
3. "рядом со мной" - если есть координаты пользователя и координаты записи, то посчитать расстояние - это чистая математика, которая на любом ЯП занимает очень малое время.
PostGIS нормально работает с радиусом "вокруг координаты, внутри радиуса N". По мне лучше сначала отфильтровать по этому параметру, а уже потом из них отсеивать по остальным параметрам. А не всех по параметрам и потом только, тех кто попал в радиус. По опыту записей миллионных объектов, обычно внутри радиуса значительно меньше объектов, чем вообще в базе. Ну и индексы. https://postgis.net/docs/ST_Distance.html
И делать это чисто инструментами базы, а не ЯПом.
З.Ы. 5 секунд и упоминание джейсонов. Ощущение, что автор всё в жейсоне хранит, при том ещё и кривоватенько. Вот и проблема вытащить, а потом "распарсить" и далее уже "отфильтровать", на беке.