Schéma & rôles des tables
Schéma & rôles des tables
Le schéma est défini en Drizzle dans apps/server/src/db/schema/auth.ts (tables Better Auth) et apps/server/src/db/schema/naivi.ts (tables métier). Les migrations SQL sont dans apps/server/drizzle/ et l'historique est décrit dans Base de données & migrations.
Tables Better Auth
Gérées par Better Auth via l'adaptateur Drizzle. Ne pas les modifier à la main.
| Table | Rôle |
|---|---|
user | Comptes. role (texte, défaut user) porte le rôle utilisé pour les droits admin et le choix du rôle applicatif. last_connection est mis à jour à chaque requête protégée. user_role (uuid) existe dans le schéma mais n'est lu nulle part. |
session | Sessions (token unique, expires_at, user_id avec ON DELETE CASCADE). |
account | Comptes liés (fournisseur Microsoft, mot de passe haché pour l'e-mail). |
verification | Jetons de vérification et de réinitialisation. |
Tables métier
files
Un fichier importé : document (regular) ou jeu de paires Q&A (qa).
| Colonne | Type | Remarque |
|---|---|---|
id | uuid, PK | gen_random_uuid() |
name | text | Nom courant |
old_name | text | Nom précédent |
type | enum file_type | regular ou qa |
created_by | text, FK user.id | Importeur |
classification_status | enum | pending, in_progress ou completed |
processing_metadata | jsonb | Format d'origine, parseur, version, compteurs (renseigné après ingestion) |
created_at, last_updated_at | timestamptz | last_updated_at est mis à jour par l'application |
last_updated_by | text, FK user.id |
chunks
Segments d'un fichier regular.
| Colonne | Type | Remarque |
|---|---|---|
id | uuid, PK | |
rank | integer | Position dans le fichier |
content | text | Contenu |
old_content | text | Contenu précédent |
category | enum category | Sans valeur par défaut |
file_id | uuid, FK files.id | ON DELETE CASCADE |
embedding | bytea | Vecteur float32 (octets de tableau numpy), calculé par rag-agent |
metadata | jsonb | Métadonnées du parseur (pages, sections, tokens) |
last_updated_at, last_updated_by |
qa_pair
Paires question et réponse d'un fichier qa.
| Colonne | Type | Remarque |
|---|---|---|
id | uuid, PK | |
file_id | uuid, FK files.id | ON DELETE CASCADE |
rank | integer | |
question, old_question | text | |
answer, old_answer | text | |
category | enum category | Défaut not categorized |
embedding | bytea | Vecteur float32 calculé sur "question : answer" ; seule la réponse est injectée dans le prompt |
last_updated_at, last_updated_by |
logo
Logo du bot. La table est définie dans le schéma et créée par la migration 0000, mais getLogo lit le logo dans la base Chainlit (CHAINLIT_DATABASE_URL). Vérifier dans quelle base se trouve le logo d'un déploiement.
| Colonne | Type | Remarque |
|---|---|---|
id | uuid, PK | |
name | text | logo, logo_dark, logo_light, … |
data | bytea | Image |
mime_type | text | |
is_active | boolean | Défaut true |
tags
| Colonne | Type | Remarque |
|---|---|---|
id | uuid, PK | |
name | text | Unique |
description | text | Optionnel |
color | text | Défaut #6366f1 |
created_at, created_by, last_updated_at, last_updated_by |
roles
Rôles applicatifs, distincts de user.role. Ils déterminent quel index un utilisateur interroge.
| Colonne | Type | Remarque |
|---|---|---|
id | uuid, PK | |
name | text | Unique |
description | text | Optionnel |
display_order | integer | Rang : plus petit = plus haut. admin à 0, user à 1 à l'initialisation |
is_super_admin | boolean | Accès à tous les éléments dynamic et static |
is_hierarchy_excluded | boolean | Si vrai, le rôle ne transmet ni ne reçoit de tags hérités |
created_at | timestamptz |
role_tags
Tags directement reçus par un rôle. Unicité (role_id, tag_id). ON DELETE CASCADE des deux côtés.
item_tags
Tags portés par un chunk ou une paire Q&A.
| Colonne | Type | Remarque |
|---|---|---|
id | uuid, PK | |
item_id | uuid | Identifiant d'un chunks.id ou qa_pair.id. Pas de clé étrangère : l'intégrité est assurée par l'application. |
item_type | enum item_type | chunk ou qa_pair |
tag_id | uuid, FK tags.id | ON DELETE CASCADE |
Unicité (item_id, item_type, tag_id), index sur (item_id, item_type).
indexes
Index FAISS sérialisés, un par régénération et par rôle.
| Colonne | Type | Remarque |
|---|---|---|
id | uuid, PK | |
serialized_index | bytea | Index IndexFlatL2 sérialisé avec pickle par rag-agent |
role_id | uuid, FK roles.id | ON DELETE SET NULL |
is_active | boolean | Vrai pour le dernier index du rôle |
created_at | timestamptz | Sert au nettoyage : seuls les 3 derniers index par rôle sont conservés |
index_chunks
Relie un index aux éléments qu'il contient.
| Colonne | Type | Remarque |
|---|---|---|
id | uuid, PK | |
index_id | uuid, FK indexes.id | ON DELETE CASCADE |
chunk_id | uuid | Identifiant d'un chunks.id ou d'un qa_pair.id ; pas de clé étrangère |
created_at | timestamptz |
Unicité (index_id, chunk_id).
Relations
user ──── files (created_by, last_updated_by)
files ──< chunks ──(item_tags, item_type = chunk)──> tags
files ──< qa_pair ──(item_tags, item_type = qa_pair)──> tags
roles >──< role_tags >── tags
roles ──< indexes ──< index_chunks ──> chunks | qa_pair (par identifiant)Enums
| 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 |
Seuls dynamic et static entrent dans un index. finetuned est en lecture seule : le serveur refuse de le modifier ou de le retirer.
Index de base de données
| Index | Table | Colonnes | Unicité |
|---|---|---|---|
files_type_idx | files | type | non |
chunks_file_id_idx | chunks | file_id | non |
qa_pair_file_id_idx | qa_pair | file_id | non |
item_tags_unique | item_tags | item_id, item_type, tag_id | oui |
item_tags_item_idx | item_tags | item_id, item_type | non |
role_tags_unique | role_tags | role_id, tag_id | oui |
indexes_role_active_idx | indexes | role_id, is_active | non |
index_chunks_unique | index_chunks | index_id, chunk_id | oui |
L'unicité des noms (tags.name, roles.name, user.email) et des jetons de session est déclarée sur les colonnes.