Files
DLE/docs/user-tables-relation-task.md

13 KiB
Raw Blame History

Техническое задание: Пользовательские таблицы с настраиваемыми связями

Цель

Реализовать систему пользовательских таблиц, в которых при создании столбца можно настраивать нужные связи (relation/reference/lookup) с другими таблицами.


Основные требования

  1. Пользователь может создавать любые таблицы (например, "Клиенты", "Теги", "Продукты", "RAG-таблица" и т.д.).
  2. Для каждой таблицы можно добавлять столбцы разных типов:
    • text, number, date, select, multiselect
    • relation/reference (связь с другой таблицей)
    • lookup (вывод связанных данных из другой таблицы)
  3. Для столбцов типа relation/reference:
    • Можно выбрать, с какой таблицей и каким полем устанавливается связь
    • Можно выбрать тип связи: один-к-одному, один-ко-многим, многие-ко-многим
    • В ячейке такого столбца пользователь может выбрать одну или несколько строк из связанной таблицы
  4. Связи хранятся в отдельной таблице связей или в value ячейки (массив id)
  5. В интерфейсе:
    • При создании/редактировании столбца типа relation пользователь выбирает таблицу и поле для связи
    • В таблице, в ячейке relation-столбца, отображается выпадающий список/мультивыбор с данными из связанной таблицы
  6. Фильтрация и поиск:
    • Можно фильтровать строки по связанным значениям (например, все вопросы, относящиеся к определённому тегу или продукту)
  7. Масштабируемость:
    • Архитектура должна поддерживать создание большого количества таблиц, столбцов и связей без потери производительности

Примеры сценариев

1. Связь "Клиент — Теги"

  • Пользователь создаёт таблицу "Клиенты" и таблицу "Теги"
  • В таблице "Клиенты" добавляет столбец типа relation, связывающий клиента с одним или несколькими тегами
  • В каждой строке можно выбрать теги из справочника

2. Связь "Вопрос — Продукты"

  • В RAG-таблице добавляется столбец типа relation к таблице "Продукты"
  • Для каждого вопроса можно выбрать, к каким продуктам он относится

3. Lookup-столбец

  • В таблице "Клиенты" можно добавить lookup-столбец, который автоматически подтягивает связанные значения из другой таблицы (например, список продуктов, которыми пользуется клиент)

Требования к backend

  • Расширить модели user_tables, user_columns, user_rows, user_cell_values
  • Добавить таблицу связей (например, table_relations: id, from_row_id, column_id, to_table, to_row_id)
  • API для создания/редактирования столбцов с типом relation
  • API для получения и сохранения связей

Требования к frontend

  • UI для выбора типа столбца (relation/reference/lookup)
  • UI для выбора связанной таблицы и поля
  • UI для выбора значений в ячейке relation-столбца (выпадающий список, мультивыбор)
  • Фильтрация и отображение связанных данных

Преимущества

  • Максимальная гибкость и масштабируемость
  • Возможность строить сложные взаимосвязанные базы знаний, CRM, RAG-ассистентов
  • Удобство для ИИ и аналитики

Типы столбцов для пользовательских таблиц

  1. text — однострочный текст
  2. textarea — многострочный текст (заметки, описания)
  3. number — число (целое или дробное)
  4. date — дата
  5. datetime — дата и время
  6. time — только время
  7. boolean/checkbox — булево значение (чекбокс)
  8. select — выпадающий список (одиночный выбор)
  9. multiselect — выпадающий список (множественный выбор)
  10. file/image — файл или изображение (загрузка и хранение)
  11. relation/reference — связь с другой таблицей (выбор одной или нескольких строк из другой таблицы)
  12. lookup — автоматический вывод связанных данных из другой таблицы по relation
  13. email — email-адрес с валидацией
  14. phone — телефон с валидацией
  15. url — ссылка/URL с валидацией
  16. currency — число с символом валюты
  17. percent — число с отображением в процентах
  18. color — выбор цвета (colorpicker)
  19. user/assignee — ссылка на пользователя системы (ответственный)
  20. status — список статусов (например, “В работе”, “Готово”)
  21. formula — вычисляемое поле на основе других столбцов
  22. progress/rating — визуальное отображение прогресса, рейтинга (шкала, звёзды)
  23. json/object — хранение структурированных данных (JSON)

Плейсхолдеры для интеграции с ИИ-ассистентом

  • Для каждого столбца при создании автоматически генерируется плейсхолдер (placeholder), который можно использовать в промтах и шаблонах для ИИ-ассистента.
  • Плейсхолдер формируется на основе названия столбца (транслитерация, нижний регистр, замена пробелов на подчёркивания, например: "Партнеры венчурного фонда" → {partners_venchurnogo_fonda}).
  • Плейсхолдер уникален в рамках таблицы. При совпадении имён добавляется суффикс или используется id столбца.
  • В таблице user_columns рекомендуется добавить поле placeholder (string, unique).
  • В интерфейсе при создании/редактировании столбца отображать сгенерированный плейсхолдер (и, при необходимости, давать возможность его редактировать).
  • В системных промтах и шаблонах для LLM/ассистента значения автоматически подставляются по плейсхолдерам.

Пример использования в промте:

Вопрос: {question}
Ответ: {answer}
Партнеры: {partners}

Использование плейсхолдеров в системном промте ассистента

  • На странице настроек ассистента (/settings/ai/assistant) под полем для системного промта автоматически отображается список всех плейсхолдеров, созданных пользователем в пользовательских таблицах.
  • Для каждого плейсхолдера показывается:
    • Сам плейсхолдер (например, {partners})
    • Название столбца и таблицы, к которому он относится (например, “Партнеры венчурного фонда” — RAG-таблица)
  • Список плейсхолдеров обновляется автоматически при добавлении/удалении столбцов.

Инструкция для пользователя:

Используйте плейсхолдеры из списка ниже для подстановки значений из пользовательских таблиц в системный промт. Например:

Вопрос: {question}
Ответ: {answer}
Партнеры: {partners}

Плейсхолдеры автоматически заменяются на соответствующие значения при генерации ответа ассистента.

Сценарий: добавление тегов пользователю через пользовательские таблицы

  1. Добавление тега на странице контакта

    • На странице контакта (/contacts/1) при нажатии на кнопку "Добавить тег" система автоматически создаёт пользовательскую таблицу "Теги клиентов" (если она ещё не создана).
    • Пользователь может добавить новый тег (например, "VIP", "B2B", "Startup") — он появляется в этой таблице.
  2. Выпадающий список тегов

    • После добавления хотя бы одного тега появляется выпадающий список (или мультивыбор), в котором отображаются все теги из таблицы "Теги клиентов".
    • Пользователь может выбрать один или несколько тегов для текущего контакта.
  3. Связь пользователя с тегом

    • При выборе тега для пользователя создаётся связь между пользователем и тегом.
    • Эта связь хранится в отдельной пользовательской таблице (например, user_tag_links или универсальной таблице связей), где фиксируется, какой пользователь связан с каким тегом.
    • Пример структуры таблицы связей:
      id user_id tag_id
      1 1 2
      2 1 3
  4. Обратная связь (теги → пользователи)

    • В таблице "Теги клиентов" можно реализовать обратную связь: для каждого тега показывать список пользователей, у которых он установлен (например, через relation/lookup-столбец).
  5. Итог:

    • Пользователь может создавать и редактировать теги.
    • Для каждого контакта можно выбрать теги из выпадающего списка.
    • Все связи между пользователями и тегами хранятся в отдельной таблице.
    • Можно быстро получить список всех пользователей с определённым тегом и наоборот.