Чому для Bean Remote я обрав PostGIS замість ORM
У Bean Remote я вирішував ключову задачу: швидко показувати кафе на мапі з фільтрацією за радіусом і видимою областю.
Для такого сценарію класичний ORM-шар виявився менш ефективним, ніж нативні geospatial-можливості PostgreSQL.
Стек проєкту
- React Native + Expo
- Node.js + Express
- PostgreSQL + PostGIS
Чому PostGIS спрацював краще
1) Нативні просторові індекси
location GEOGRAPHY(Point, 4326)
CREATE INDEX idx_cafes_location ON cafes USING GIST (location);
Після цього:
SELECT * FROM cafes
WHERE ST_DWithin(
location,
ST_SetSRID(ST_MakePoint(:lng, :lat), 4326),
:radius
);
Маємо передбачувану продуктивність і точність без зайвої пост-обробки в застосунку.
2) Складні geo-операції в ORM часто незручні
Для ST_DWithin, ST_Intersects, ST_MakeEnvelope зазвичай усе одно потрібен raw SQL.
У результаті абстракція не спрощує критичні місця, а додає зайвий шар.
3) Геометрія і бізнес-умови в одному запиті
SELECT * FROM cafes
WHERE is_verified = true
AND ST_Within(
location,
ST_MakeEnvelope(:west, :south, :east, :north, 4326)
);
Порівняння
| Критерій | ORM | PostGIS |
|---|---|---|
| CRUD | Добре | Добре |
| Просторові функції | Обмежено | Повноцінно |
| Індексація | Часто вручну | Нативно |
| Реалтайм-мапи | Посередньо | Відмінно |
Висновок
Для типових проєктів ORM може бути чудовим вибором. Але якщо у вас мапи, геофільтрація й велика кількість spatial-запитів, PostGIS дає більше контролю й швидкості.
У Bean Remote це дало помітно кращу швидкодію і простішу серверну логіку.