Как стать автором
Обновить

Комментарии 9

В path нельзя положить UUID, т.к. данные в ltree не могут содержать дефис

Вообще говоря дефисы в UUID для человекочитаемости, если их убрать уникальность идентификатора не пострадает. Поэтому строго говоря утверждение неверно - положить можно, но нужно представление UUID без дефисов.

Можно по этому поводу подискутировать, но скорее всего, раньше, чем будет подведен итог, выйдет postgresql v16, ltree в котором будет дружить с дефисами (а заодно сможет содержать в себе до 1000 символов вместо 256) :).

вышел )

непривычно видеть первые ИД которые ссылаются на ИД которых еще не существует.
вы просто смогли запутать целостность системы из 4х записей до такого состояния, что в итоге и не поймешь, что же можно удалять или апдейтить)

Если последней меткой в пути является id текущей записи, то какой тип ни используй - его ещё не существует в таблице.

Его не существует в таблице, но он ведь появляется в той же транзакции, что и materialized path. И соответственно, его можно проконтролировать. Например, тем же триггером.

Статья оставила весьма.. ммм.. скажем так - весьма разнообразное впечатление.

  1. Есть тип данных, который хранит материализованные пути. К нему, кстати, есть куча вопросов безотносительно к статье и описанному в ней применению этого типа. В основном связанная с имеющимися ограничениями на набор символов. Какого, собственно? Всё равно используем CREATE EXTENSION - почему нельзя переопределить всю эту ерунду на старте? Самое очевидное применение материализованных путей - хранение путей в файловой системе... ага, щазз! неприменимо без плясок с бубнами...

  2. Есть некая синтетическая задача, на которой мы покажем, что этот тип данных можно применять на практике. Ну тоже в общем без слёз не глянешь. Это сколько ж всякоразной ерунды надо навертеть поверх этого типа данных, чтобы его таки можно было использовать! причём вот всё это надо навертеть для того, чтобы этот тип данных был применим на этой самой узкой, синтетической, без практического отображения, задачи! Вы представляете, сколько ещё потребуется, если возникнет желание применить этот тип на практике?

Поневоле хочется процитировать бессмертное "Это все равно, что сделать что-нибудь, а потом придумать, для чего вы это сделали, и гордиться этим".

Или, если наконец привести все эти разнообразные оттенки впечатления в одну точку, то получится что-то вроде "Оно есть. Оно работает. Оно настолько сырое, что совершенно неприменимо на практике. Но если его не забросят, то не исключено, что когда-нибудь оно станет полезным."

поделюсь реальным кейсом когда этот тип хорошо выручил,

задача:
не меняя записи в справочнике МКБ 10, так как он может в любой момент обновится из вне,
в выборке отчета показать все записи с A00 по A09 кроме A04, объеденить в один список с болезнями Z29
select * from mkb10_tab2 d where d_ltr @ 'A0*&!A04|Z29'::ltxtquery

при этом план запроса:
Bitmap Heap Scan on mkb10_tab2 d (cost=4.30..15.86 rows=3 width=348)
Recheck Cond: (d_ltr @ 'A0* & !A04 | Z29'::ltxtquery)
-> Bitmap Index Scan on ltree_ltr_ix (cost=0.00..4.30 rows=3 width=0)
Index Cond: (d_ltr @ 'A0* & !A04 | Z29'::ltxtquery)

объяснить аналитику что такое A0*&!A04|Z29 гораздо проще чем куча AND OR в условиях WHERE без вдования в подробности в названия колонок
при этом мы как раз такие условия отбора как A0*&!A04|Z29 хранили в отдельной таблице настройке. и для каждого отчета могли быть свои условия.



На мой взгляд, ltree вполне себе unix-way штука, которая решает узкую задачу - удобная и быстрая работа с materialized path. Я с ним познакомился вот по этой серии статей: https://patshaughnessy.net/2017/12/12/installing-the-postgres-ltree-extension и использовал в несколько проектов, в том числе с приличной нагрузкой.

То, что в ней не решается вопрос целостности данных - это тоже вполне себе unix-way. Мы же не обламываемся написать `curl ... | jq` и не говорим, что разработчики curl недоделали свою работу, потому что у них нет встроенного форматирования json?

А статья в целом полезная.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории