Пропустить до основного содержимого


Добавляем себе в коллекцию граблей
habr.com/ru/companies/ruvds/ar…

#postgres

в ответ на mrcopperbeard

ммм.... хуета. Когда у тебя guid как первичный ключ без offset и limit не понятно как жить
в ответ на hardworm

@hardworm на самом деле, возможно. Но под это лучше закладываться заранее (совет наиболее актуален на этапе, когда в продакшене ещё ничего нет), или готовиться к болезненной миграции (но ползающая по-черепашьи база прямо сейчас может быть ещё больнее).

UUID по сути просто 128-битные числа в прикольной обёртке. И если часть старших бит отвести под таймстемп, то их можно сортировать. В распределённых бэкендах это довольно популярный трюк.

Проблема, кстати, только в offset, причём только с большими его значениями. К limit никаких претензий.

@mrcopperbeard

в ответ на D:\side\

@dside @hardworm
> И если часть старших бит отвести под таймстемп, то их можно сортировать.

О, поздравляю, ты только что UUIDv7 придумал! Осталось дождаться реализации с pgsql и можно ничего не делать

в ответ на cauf 🇷🇺

я его не то чтобы придумал, таймстемп в старших битах был ещё в UUIDv1 (2005) :blobcatlul:
datatracker.ietf.org/doc/html/…

В постгресе v1 уже есть, даже с функцией доставания таймстемпа и даже вариант, использующий случайный мультикаст-MAC вместо реального MAC:
postgresql.org/docs/current/fu…
postgresql.org/docs/current/uu…
…не на все биты, конечно, но их и так там больше, чем реалистично потребуется.

@hardworm @mrcopperbeard

Эта запись была отредактирована (1 неделя назад)
в ответ на D:\side\

@dside может пусть лучше postgresql решит проблему... ведь работать будет только со следующей страницей, но хочу открыть 99 из 300 - неа.
в ответ на hardworm

штука в том, что "хочу открыть 99 страницу" это практически не существующий в пользовательских нуждах случай. Но можно предусмотреть автоматическое листание на сервере, если такая экзотическая нужда имеется.

А оффсет в постгресе быстрее O(N) вряд ли когда-либо станет.

@mrcopperbeard

Эта запись была отредактирована (1 неделя назад)
в ответ на D:\side\

@dside это в ваших лентах котиков это не существующий кейс.

А в корпоративных сервисах это просто must have. Если пользователь хочет открыть 99 страницу, он должен открыт 99 страницу. И более того должен мочь поделится 99 страницей на которой увидят тот же набор данных

в ответ на hardworm

@hardworm работал я над этими вашими корпоративными сервисами лет 7 — они ещё очень не любят, когда база тормозит, ага.

А когда в ссылке since=42042 вместо page=99, результаты получатся даже стабильнее, т. к. не поедут, если в начало списка вставится ещё несколько элементов.

@mrcopperbeard

в ответ на D:\side\

@dside @hardworm про "поедут" это как раз та часть граблей, на которые я наступил, и после которых мне дали статью на изучение.
в ответ на mrcopperbeard

Бред полнейший. Будет работать на сферическо-вакуумном коне, у которого записи не удаляют, и выводить их нужно только в порядке возрастания pk
в ответ на ХаББыватель

@hubbitant не, с удалением тоже работает. Смотри:
- клиент запрашивает первые 50 записей
- получает вместе с данными поле next=61 (часть из первых строк удалили)
- клиент запрашивает следующие записи, передавая since=61

Минус тут в том, что теперь уже клиент не сможет нормально сходу запросить «страницу 16»

@mrcopperbeard

в ответ на Moana Rijndael 🍍🍕

Спасибо за разъяснение.

Вообще может иметь смысл при последовательной загрузке контента, но не работоспособно в классической пагинации (как на картинке у автора статьи).

в ответ на ХаББыватель

@hubbitant работоспособно. Сервер может точно так же выбрать несколько ближайших страниц и вычислить нужные клиенту ключи для каждой кнопки.

Это, увы, подзамедлит выборку и первых страниц тоже, зато по мере углубления в результаты стоимость запросов не будет линейно расти, как при оффсетах.

Но можно копнуть ещё глубже и подумать, а нужны ли вообще пользователю номера страниц — или ему актуальнее контекст вокруг конкретного сообщения и листание вперёд-назад.

Крч узким местом скорее всего станет жаркий спор между разработчиками и привычками продуктовика к древним ленточкам номеров страниц :blobcatlul:

@mo @mrcopperbeard