13 KiB
13 KiB
Техническое задание: Пользовательские таблицы с настраиваемыми связями
Цель
Реализовать систему пользовательских таблиц, в которых при создании столбца можно настраивать нужные связи (relation/reference/lookup) с другими таблицами.
Основные требования
- Пользователь может создавать любые таблицы (например, "Клиенты", "Теги", "Продукты", "RAG-таблица" и т.д.).
- Для каждой таблицы можно добавлять столбцы разных типов:
- text, number, date, select, multiselect
- relation/reference (связь с другой таблицей)
- lookup (вывод связанных данных из другой таблицы)
- Для столбцов типа relation/reference:
- Можно выбрать, с какой таблицей и каким полем устанавливается связь
- Можно выбрать тип связи: один-к-одному, один-ко-многим, многие-ко-многим
- В ячейке такого столбца пользователь может выбрать одну или несколько строк из связанной таблицы
- Связи хранятся в отдельной таблице связей или в value ячейки (массив id)
- В интерфейсе:
- При создании/редактировании столбца типа relation пользователь выбирает таблицу и поле для связи
- В таблице, в ячейке relation-столбца, отображается выпадающий список/мультивыбор с данными из связанной таблицы
- Фильтрация и поиск:
- Можно фильтровать строки по связанным значениям (например, все вопросы, относящиеся к определённому тегу или продукту)
- Масштабируемость:
- Архитектура должна поддерживать создание большого количества таблиц, столбцов и связей без потери производительности
Примеры сценариев
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-ассистентов
- Удобство для ИИ и аналитики
Типы столбцов для пользовательских таблиц
- text — однострочный текст
- textarea — многострочный текст (заметки, описания)
- number — число (целое или дробное)
- date — дата
- datetime — дата и время
- time — только время
- boolean/checkbox — булево значение (чекбокс)
- select — выпадающий список (одиночный выбор)
- multiselect — выпадающий список (множественный выбор)
- file/image — файл или изображение (загрузка и хранение)
- relation/reference — связь с другой таблицей (выбор одной или нескольких строк из другой таблицы)
- lookup — автоматический вывод связанных данных из другой таблицы по relation
- email — email-адрес с валидацией
- phone — телефон с валидацией
- url — ссылка/URL с валидацией
- currency — число с символом валюты
- percent — число с отображением в процентах
- color — выбор цвета (colorpicker)
- user/assignee — ссылка на пользователя системы (ответственный)
- status — список статусов (например, “В работе”, “Готово”)
- formula — вычисляемое поле на основе других столбцов
- progress/rating — визуальное отображение прогресса, рейтинга (шкала, звёзды)
- 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}Плейсхолдеры автоматически заменяются на соответствующие значения при генерации ответа ассистента.
Сценарий: добавление тегов пользователю через пользовательские таблицы
-
Добавление тега на странице контакта
- На странице контакта (
/contacts/1) при нажатии на кнопку "Добавить тег" система автоматически создаёт пользовательскую таблицу "Теги клиентов" (если она ещё не создана). - Пользователь может добавить новый тег (например, "VIP", "B2B", "Startup") — он появляется в этой таблице.
- На странице контакта (
-
Выпадающий список тегов
- После добавления хотя бы одного тега появляется выпадающий список (или мультивыбор), в котором отображаются все теги из таблицы "Теги клиентов".
- Пользователь может выбрать один или несколько тегов для текущего контакта.
-
Связь пользователя с тегом
- При выборе тега для пользователя создаётся связь между пользователем и тегом.
- Эта связь хранится в отдельной пользовательской таблице (например,
user_tag_linksили универсальной таблице связей), где фиксируется, какой пользователь связан с каким тегом. - Пример структуры таблицы связей:
id user_id tag_id 1 1 2 2 1 3
-
Обратная связь (теги → пользователи)
- В таблице "Теги клиентов" можно реализовать обратную связь: для каждого тега показывать список пользователей, у которых он установлен (например, через relation/lookup-столбец).
-
Итог:
- Пользователь может создавать и редактировать теги.
- Для каждого контакта можно выбрать теги из выпадающего списка.
- Все связи между пользователями и тегами хранятся в отдельной таблице.
- Можно быстро получить список всех пользователей с определённым тегом и наоборот.