PostgreSQL | Как хранить URL-адреса в базе данных SQL?

PostgreSQL | Как хранить URL-адреса в базе данных SQL?

Как хранить иерархические структуры данных в SQL?

Когда нужно хранить пути (URL-адреса) в базе данных, то возникает очень много отдельных вопросов. По началу не понятен сам процесс.

Предлагаю поглядеть на приблизительный набор URL-адресов:

  1. https://example.com
  2. https://example.com/a
  3. https://example.com/a/aa
  4. https://example.com/a/bb
  5. https://example.com/b
  6. https://example.com/b/aa
  7. https://example.com/b/bb
  8. https://example.com/b/cc
  9. https://example.com/b/cc/sss
  10. https://example.com/b/cc/ttt
  11. https://example.com/b/cc/ttt/zzz
  12. https://example.com/b/cc/ooo
  13. https://example.com/c

Что мы видим? Мы видим повторяющиеся символьные последовательности на всём наборе строк (URL-адресов). Также мы видим, что строки между собой имеют незначительные (менее весомые) различия. Большая часть информации в каждой строке повторяется из адреса в адрес.

 

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

Давайте посмотрим на статистику.

Все эти 13 строк посимвольно занимают 330 байт. Для примера я закину их в одну строку JavaScript.

JavaScript - Строка в 330 байт из 13 URL-адресов
JavaScript — Строка в 330 байт из 13 URL-адресов

Мы понимаем, что эту строку можно сократить. Если мы найдём «самую короткую начальную последовательность» символов, которая встречается во всех 13 строках, то мы можем вынести её в отдельное место. Такой «короткой начальной последовательностью» является «https://example.com«.

JavaScript - Строка в 19 байт повторяется в каждом из 13 URL-адресов
JavaScript — Строка в 19 байт повторяется в каждом из 13 URL-адресов

Её длина составляет 19 байт. Она повторяется 13 раз, что суммарно равно 247 байт.

Что получается? Из всех 330 байт «самая короткая начальная последовательность» символов занимает 247 байт. Это 74%. Это очень много!!!

 

Например

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

На «кухонном языке» нам всё понятно, но как это реализовать на практике в PostgreSQL? Как это называется в математическом сообществе?

Давайте нарисуем иерархическую модель наших 13 строк:

Иерархическая модель 13 URL-адресов
Иерархическая модель 13 URL-адресов

 

Иерархическая модель даёт наглядное представление о том, что любой URL-адрес можно разложить на составные элементы.

Видно сколько всего уровней вложенности может быть из нашего массива уникальных URL-адресов. Мы видим 4 уровня вложенности (глубины).

Также мы можем видеть какой элемент является родительским для остальных элементов — это самый верхний элемент (строка-домен «https://example.com«)

Мы можем найти самый глубокий элемент — это «/zzz«.

Мы знаем кто у кого является братом/сестрой, а кто ребёнком.

В общем это всё очень напоминает «Объектную Модель Документа» — DOM.

Остаётся только понять КАК ЗАПИСЫВАТЬ такие структуры в таблицу, а также КАК ИЗВЛЕКАТЬ из такой таблицы нужные данные?

 

Статья в разработке

 

Информационные ссылки

Вы можете поискать ответ в теме официального справочника по PostgreSQL — «Глава 64. Индексы B-деревья» — https://postgrespro.ru/docs/postgresql/14/btree

или

«Иерархические данные (SQL Server)» — https://docs.microsoft.com/ru-Ru/sql/relational-databases/hierarchical-data-sql-server?view=sql-server-2017