Как вы знаете, в Notion базы данных могут устанавливать связи сами с собой, через Relation. Это позволяет задавать иерархии ваших элементов. В самом простом случае это связки типа “задача-проект” или “задача-проект-направление”.
Но встречаются и более усложненные структуры. Например, в сеттинге GTD используется сразу 6 уровней — так называемых горизонтов фокуса:
- Текущие действия
- Проекты
- Зоны ответственности и внимания
- Цели
- Видение
- Миссия и принципы
Можно вообще превратить таблицу Notion в подобие mind-карты. При таком подходе длина цепочки может быть сколь угодно большой. Правда, сам Notion программно ограничивает возможное количество уровней, об этом поговорим далее.
👉
Две основные задачи:
- Как получить в текстовом виде полный путь от начала до любого элемента?
- Как подсчитать уровень вложенности?
Первое поможет нам сориентироваться, к чему принадлежит тот или иной элемент (особенно при использовании API). А уровень вложенности позволит легко фильтровать — показать все “зоны ответственности” в GTD, например.
Чтобы решить обе задачи, мы воспользуемся довольно экзотическим трюком: заставим два свойства ссылаться друг на друга. Давайте посмотрим на примере.
Создание связей
Допустим, мы создаем таблицу с нашими сферами интереса и сейчас прорабатываем всё, связанное с музыкой

Здесь я поместил строчку “Начало” по аналогии со стартовым узлом в mind-картах. Это будет 1-й уровень. Теперь надо связать последующий слой с предыдущим, например, музыка — это одно из наших хобби. Для этого заведем Relation таблицы на неё же, с синхронизацией.

Создаем взаимосвязанные свойства
Теперь добавим два свойства, которые и будем завязывать друг на друге. Для начала сделаем их просто текстовыми. Если сразу попробовать ставить роллапы и формулы, связка может не сработать.

Теперь превращаем “Свой путь” в формулу и вносим такой текст:
if(not empty(prop("Путь предыдущего")), prop("Путь предыдущего") + " / ", "") + prop("Тема")
Что делает эта формула? Она составляет путь к текущей строке, опираясь на путь к “родителю”. Если у родителя что-то записано, то она добавляет “/” и свое название. Если же у родителя пусто (это самый первый элемент), то для него пишется название без “/”.
В свою очередь, в “Путь предыдущего” мы через роллап заложим “Свой путь”, но для предыдущего элемента😀.

В результате получаем:

❗
Максимальный уровень вложенности
Обратите внимание, что разработчики намеренно ограничили действие рекурсивных формул, чтобы не допустить возникновение бесконечных циклов. 7 уровней — такова максимальная глубина вложенности.
Теперь давайте создадим два текстовых поля “Уровень предыдущего” и “Свой уровень”. Последний превращаем в формулу:
toNumber(prop("Уровень предыдущего")) + 1
А свойство “Уровень предыдущего” превращаем в роллап:

Окончательно получаем такой вид:

Хоть я и рекомендую самому поупражняться в этих техниках, вы можете использовать шаблон по ссылке.