Schéma & rôles des tables
Schéma & rôles des tables
Le schéma PostgreSQL est défini via Drizzle ORM. Les fichiers de référence sont:
apps/server/src/db/schema/auth.ts— tables Better Authapps/server/src/db/schema/naivi.ts— tables métier nAI'vi
Le DDL complet se trouve dans server/database.mdx.
Organisation
Deux groupes de tables coexistent dans la même base PostgreSQL:
DB naivi
├── [auth] user, session, account, verification
└── [naivi] files, chunks, qa_pair, file_assignments, logo,
tags, roles, role_tags, item_tags, indexes, index_chunksTables Auth
Gérées automatiquement par Better Auth (via Drizzle adapter). Ne pas modifier directement.
| Table | Rôle |
|---|---|
user | Comptes utilisateurs (id, email, role Better Auth, lastConnection) |
session | Sessions actives (token JWT, expiration, user_id) |
account | Comptes OAuth liés (provider_id, access_token, refresh_token) |
verification | Tokens de vérification email et reset password |
Tables Naivi — Métier
files
Table unifiée (remplace les anciennes regular_files + qa_files).
| Colonne | Type | Description |
|---|---|---|
id | uuid PK | Identifiant unique |
name | text | Nom courant du fichier |
old_name | text | Nom précédent (avant renommage) |
type | enum file_type | regular = document chunké; qa = CSV Q&A |
created_by | text → user.id | Uploadeur |
classification_status | enum | pending / in_progress / completed |
created_at | timestamptz | Date de création |
last_updated_at | timestamptz | Dernière modification |
last_updated_by | text → user.id | Dernier modificateur |
chunks
Segments de texte extraits d'un fichier regular.
| Colonne | Type | Description |
|---|---|---|
id | uuid PK | — |
rank | integer | Position du chunk dans le fichier |
content | text | Contenu textuel du chunk |
old_content | text | Contenu avant dernière modification |
category | enum category | dynamic, static, not an info, finetuned, not categorized |
file_id | uuid → files.id CASCADE | Fichier parent |
embedding | bytea | Vecteur embedding sérialisé (float32, calculé par le chatbot) |
last_updated_at | timestamptz | — |
last_updated_by | text → user.id | — |
qa_pair
Paires question/réponse issues d'un fichier qa (CSV).
| Colonne | Type | Description |
|---|---|---|
id | uuid PK | — |
file_id | uuid → files.id CASCADE | Fichier parent |
rank | integer | Position dans le fichier |
question | text | Question |
old_question | text | Question avant modification |
answer | text | Réponse |
old_answer | text | Réponse avant modification |
category | enum category | default: not categorized |
embedding | bytea | Embedding de "question : answer" |
last_updated_at | timestamptz | — |
last_updated_by | text → user.id | — |
file_assignments
Association fichier ↔ utilisateur (contrôle d'accès au niveau fichier).
| Colonne | Type | Description |
|---|---|---|
file_id | uuid → files.id CASCADE | — |
assigned_to | text → user.id | Utilisateur cible |
assigned_by | text → user.id | Admin qui a assigné |
| UNIQUE | (file_id, assigned_to) | Un fichier assigné une seule fois par user |
logo
Logos du bot (branding, chargés par le chatbot au démarrage).
| Colonne | Type | Description |
|---|---|---|
name | text | Nom du logo (logo, logo_dark, logo_light…) |
data | bytea | Données binaires de l'image |
mime_type | text | Type MIME (image/png, image/svg+xml…) |
is_active | boolean | true = logo actuellement utilisé |
tags
Étiquettes pour catégoriser les chunks/qa_pairs selon leur audience.
| Colonne | Type | Description |
|---|---|---|
name | text UNIQUE | Nom du tag (ex: RH, Juridique) |
color | text | Couleur hexadécimale (ex: #6366f1) |
description | text | Description optionnelle |
roles
Rôles applicatifs (distincts des rôles Better Auth). Utilisés pour le filtrage des index FAISS.
| Colonne | Type | Description |
|---|---|---|
name | text UNIQUE | Nom du rôle (ex: responsable_rh) |
display_order | integer | Ordre de priorité (0 = super admin) |
is_super_admin | boolean | Accès à tous les tags si true |
role_tags
Association rôle ↔ tag. Détermine les tags visibles par un rôle.
| Colonne | Type | Contrainte |
|---|---|---|
role_id | uuid → roles.id CASCADE | — |
tag_id | uuid → tags.id CASCADE | — |
| UNIQUE | (role_id, tag_id) | — |
item_tags
Association chunk/qa_pair ↔ tag.
| Colonne | Type | Description |
|---|---|---|
item_id | uuid | ID du chunk ou qa_pair (sans FK explicite) |
item_type | enum item_type | chunk ou qa_pair |
tag_id | uuid → tags.id CASCADE | — |
| UNIQUE | (item_id, item_type, tag_id) | — |
indexes
Index FAISS sérialisés, un par rôle applicatif.
| Colonne | Type | Description |
|---|---|---|
serialized_index | bytea | Index FAISS sérialisé (pickle) |
role_id | uuid → roles.id SET NULL | Rôle propriétaire de cet index |
is_active | boolean | true = index le plus récent pour ce rôle |
index_chunks
Mapping index ↔ chunks inclus (chunks + qa_pairs).
| Colonne | Type | Description |
|---|---|---|
index_id | uuid → indexes.id CASCADE | Index FAISS parent |
chunk_id | uuid | ID du chunk ou qa_pair (sans FK explicite) |
| UNIQUE | (index_id, chunk_id) | — |
Relations clés
user ──< file_assignments >── files ──< chunks
└──< qa_pair
files ──< chunks >── item_tags >── tags
files ──< qa_pair >── item_tags >── tags
roles >── role_tags >── tags
roles ──< indexes ──< index_chunksMigrations
# Générer une nouvelle migration après modification du schéma
cd apps/server
bun run db:generate
# Appliquer les migrations
bun run db:migrateLes fichiers de migration sont générés dans apps/server/drizzle/.
Enums PostgreSQL
| Enum | Valeurs |
|---|---|
file_type | regular, qa |
classification_status | pending, in_progress, completed |
category | dynamic, static, not an info, finetuned, not categorized |
item_type | chunk, qa_pair |
Kalli