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

150 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Техническое задание: Пользовательские таблицы с настраиваемыми связями
## Цель
Реализовать систему пользовательских таблиц, в которых при создании столбца можно настраивать нужные связи (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. **Итог:**
- Пользователь может создавать и редактировать теги.
- Для каждого контакта можно выбрать теги из выпадающего списка.
- Все связи между пользователями и тегами хранятся в отдельной таблице.
- Можно быстро получить список всех пользователей с определённым тегом и наоборот.