Есть СУБД postgresql, есть табличка с полями времени, имени пользователя, типа пользователя и гео.координат. Пользователей много, типов пользователей около 5-7. В таблицу каждые n минут пачкой записываются пользователи (и время на момент записи), которые находятся в определенных зонах, если они не находятся в этих зонах, то и не записываются. n для каждого типа может быть разным. На самом деле таблиц две, в одной строка на пользователя, а во второй тип, время и массив пользователей которые были отмечены в этот момент времени.
Хотелось бы получить быстрый запрос, который выдавал бы пользователя, тип события (появился, исчез) и время события.
на основе оконных функций lag, lead как-то не очень быстро получается и к тому же их не запихнуть в where. Может есть что-то еще?
П.с. Возможно такие задачи лучше решать потоково по мере появления новых записей и наверное даже не средствами sql, но сейчас другой возможности нет.
d-stream, вот да, не поспоришь)
на ддл не приведу, но так вот:
user_id - character varying
user_type - character varying
lon - double
lat - double
timecode - timestamp
Во второй таблице с группировкой по user_type и timecode пользователи собраны в users_at_time - character varying[] без геокоординат
Пиши данные в memcache и в БД, на случай если memcache слетит.
Все необходимые данные доставай из кеша.
По сути memcache будет щитом перед БД. Если по запросу ничего не найдено тогда придется сходить в базу за данными.
Memcach хоть и не БД но от него тоже можно добиться атомарности php.net/manual/ru/memcached.cas.php
Слишком "сложна" для той задачи) Решил созданием materialized view для нагруженных запросов - вью время от времени обновляется, а над ней работает запрос, который простым сопставлением данных вычленяет нужное)