Kalli
Database

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.

TableRôle
userComptes. 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.
sessionSessions (token unique, expires_at, user_id avec ON DELETE CASCADE).
accountComptes liés (fournisseur Microsoft, mot de passe haché pour l'e-mail).
verificationJetons de vérification et de réinitialisation.

Tables métier

files

Un fichier importé : document (regular) ou jeu de paires Q&A (qa).

ColonneTypeRemarque
iduuid, PKgen_random_uuid()
nametextNom courant
old_nametextNom précédent
typeenum file_typeregular ou qa
created_bytext, FK user.idImporteur
classification_statusenumpending, in_progress ou completed
processing_metadatajsonbFormat d'origine, parseur, version, compteurs (renseigné après ingestion)
created_at, last_updated_attimestamptzlast_updated_at est mis à jour par l'application
last_updated_bytext, FK user.id

chunks

Segments d'un fichier regular.

ColonneTypeRemarque
iduuid, PK
rankintegerPosition dans le fichier
contenttextContenu
old_contenttextContenu précédent
categoryenum categorySans valeur par défaut
file_iduuid, FK files.idON DELETE CASCADE
embeddingbyteaVecteur float32 (octets de tableau numpy), calculé par rag-agent
metadatajsonbMétadonnées du parseur (pages, sections, tokens)
last_updated_at, last_updated_by

qa_pair

Paires question et réponse d'un fichier qa.

ColonneTypeRemarque
iduuid, PK
file_iduuid, FK files.idON DELETE CASCADE
rankinteger
question, old_questiontext
answer, old_answertext
categoryenum categoryDéfaut not categorized
embeddingbyteaVecteur float32 calculé sur "question : answer" ; seule la réponse est injectée dans le prompt
last_updated_at, last_updated_by

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.

ColonneTypeRemarque
iduuid, PK
nametextlogo, logo_dark, logo_light, …
databyteaImage
mime_typetext
is_activebooleanDéfaut true

tags

ColonneTypeRemarque
iduuid, PK
nametextUnique
descriptiontextOptionnel
colortextDé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.

ColonneTypeRemarque
iduuid, PK
nametextUnique
descriptiontextOptionnel
display_orderintegerRang : plus petit = plus haut. admin à 0, user à 1 à l'initialisation
is_super_adminbooleanAccès à tous les éléments dynamic et static
is_hierarchy_excludedbooleanSi vrai, le rôle ne transmet ni ne reçoit de tags hérités
created_attimestamptz

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.

ColonneTypeRemarque
iduuid, PK
item_iduuidIdentifiant d'un chunks.id ou qa_pair.id. Pas de clé étrangère : l'intégrité est assurée par l'application.
item_typeenum item_typechunk ou qa_pair
tag_iduuid, FK tags.idON 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.

ColonneTypeRemarque
iduuid, PK
serialized_indexbyteaIndex IndexFlatL2 sérialisé avec pickle par rag-agent
role_iduuid, FK roles.idON DELETE SET NULL
is_activebooleanVrai pour le dernier index du rôle
created_attimestamptzSert au nettoyage : seuls les 3 derniers index par rôle sont conservés

index_chunks

Relie un index aux éléments qu'il contient.

ColonneTypeRemarque
iduuid, PK
index_iduuid, FK indexes.idON DELETE CASCADE
chunk_iduuidIdentifiant d'un chunks.id ou d'un qa_pair.id ; pas de clé étrangère
created_attimestamptz

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

EnumValeurs
file_typeregular, qa
classification_statuspending, in_progress, completed
categorydynamic, static, not an info, finetuned, not categorized
item_typechunk, 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

IndexTableColonnesUnicité
files_type_idxfilestypenon
chunks_file_id_idxchunksfile_idnon
qa_pair_file_id_idxqa_pairfile_idnon
item_tags_uniqueitem_tagsitem_id, item_type, tag_idoui
item_tags_item_idxitem_tagsitem_id, item_typenon
role_tags_uniquerole_tagsrole_id, tag_idoui
indexes_role_active_idxindexesrole_id, is_activenon
index_chunks_uniqueindex_chunksindex_id, chunk_idoui

L'unicité des noms (tags.name, roles.name, user.email) et des jetons de session est déclarée sur les colonnes.