
# Aperçu des tables

Les tables définissent vos modèles de données. Chaque table est une entité distincte (utilisateurs, produits, commandes) dont les `fields` déclarent les colonnes que les enregistrements peuvent stocker. Les tables sont le fondement d'une application Sovrium : les pages affichent leurs enregistrements, les formulaires y écrivent, les automatisations réagissent à leurs changements et les API REST/MCP les exposent.

Une table comporte au minimum un `id`, un `name` et un tableau `fields`. Tout le reste — clés primaires, index, contraintes, vues, permissions, webhooks et exposition à l'IA — est optionnel et vient s'ajouter par-dessus.

```yaml
tables:
  - id: 1
    name: Contacts
    fields:
      - { id: 1, name: email, type: email, required: true, unique: true }
      - { id: 2, name: full_name, type: single-line-text, required: true }
      - { id: 3, name: created_at, type: created-at, indexed: true }
```

## Propriétés de la table

Chaque entrée du tableau `tables` accepte les propriétés suivantes.

| Propriété             | Description                                                                                                                                                                                  |
| --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `id`                  | Identifiant entier unique de la table. Généré automatiquement lorsqu'il est omis.                                                                                                            |
| `name`                | Nom convivial de la table. Peut contenir des espaces et une casse mixte ; assaini pour l'usage en base de données (minuscules avec underscores). Maximum 63 caractères.                      |
| `fields`              | Tableau de définitions de champs. Au moins un champ est requis. Les noms et identifiants de champs doivent être uniques au sein de la table.                                                 |
| `primaryKey`          | Configuration de la clé primaire. Par défaut, une colonne `id` générée automatiquement. Voir [Index et contraintes](/fr/docs/table-indexes-constraints).                                     |
| `unique`              | Tableau de déclarations de contraintes d'unicité de premier niveau. Chaque entrée couvre un ou plusieurs champs (par ex. `[{ fields: [slug] }]`).                                            |
| `indexes`             | Tableau de définitions d'index pour les performances des requêtes et l'application de l'unicité.                                                                                             |
| `uniqueConstraints`   | _(via `unique`)_ Unicité multi-champs. Les entrées mono-champ se replient dans `field.unique` ; les entrées composites deviennent des index btree uniques.                                   |
| `foreignKeys`         | Définitions de clés étrangères composites (multi-colonnes). Les clés étrangères mono-colonne sont créées automatiquement à partir des champs `relationship`.                                 |
| `constraints`         | Tableau de contraintes CHECK avec des expressions SQL pour la validation de données inter-champs.                                                                                            |
| `views`               | Vues enregistrées avec filtres, tri, regroupement et champs visibles préconfigurés. Voir [Vues](/fr/docs/table-views).                                                                       |
| `permissions`         | Permissions RBAC contrôlant la création, la lecture, la mise à jour, la suppression, la restauration, les commentaires et l'accès par champ. Voir [Permissions](/fr/docs/table-permissions). |
| `rowLevelPermissions` | Prédicats `when` côté serveur par opération CRUD pour un cloisonnement des lignes en défense en profondeur.                                                                                  |
| `webhooks`            | Webhooks sortants déclenchés lors des événements de création/mise à jour/suppression d'enregistrements. Voir [Webhooks](/fr/docs/table-webhooks).                                            |
| `comments`            | Configuration du système de commentaires (commentaires invités, modération, fils de discussion).                                                                                             |
| `aiAccess`            | Déclare la table éligible à l'exposition via le serveur MCP de Sovrium afin que les assistants IA puissent lister/lire/écrire des enregistrements (sous réserve du RBAC).                    |
| `allowDestructive`    | Booléen. Lorsqu'il vaut `true`, autorise les migrations de schéma destructrices (suppression de colonnes, changements de type). Par défaut `false`.                                          |
| `allowForceDelete`    | Booléen. Activation par table autorisant la suppression définitive via le tableau de bord d'administration (effacement RGPD). Par défaut `false`. Voir la note ci-dessous.                   |

:::callout
**Suppression douce par défaut.** Supprimer un enregistrement définit `deleted_at`/`deleted_by` et laisse la ligne récupérable via `/restore`. Ne définissez `allowForceDelete: true` que lorsqu'une table nécessite une suppression définitive irréversible (par ex. le droit à l'effacement RGPD sur une table RH). Les registres financiers et les tables liées à l'audit devraient conserver la valeur par défaut `false` — le point de terminaison de suppression définitive de l'administration renvoie `404` lorsque la suppression définitive n'est pas autorisée.
:::

## Propriétés de base des champs

Chaque champ — quel que soit son type — étend une base commune. Ces propriétés sont disponibles sur les 49 types de champs.

| Propriété      | Description                                                                                                                                                                                     |
| -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `id`           | Identifiant entier unique du champ au sein de la table. Généré automatiquement de manière séquentielle lorsqu'il est omis.                                                                      |
| `name`         | Identifiant de colonne. Doit commencer par une lettre et ne contenir que des lettres minuscules, des chiffres et des underscores (`^[a-z][a-z0-9_]*`). Maximum 63 caractères.                   |
| `type`         | L'un des 49 types de champs disponibles (par ex. `single-line-text`, `integer`, `relationship`). Voir [Types de champs](/fr/docs/field-types-overview).                                         |
| `required`     | Booléen. Lorsqu'il vaut `true`, le champ doit avoir une valeur pour chaque enregistrement.                                                                                                      |
| `unique`       | Booléen. Lorsqu'il vaut `true`, deux enregistrements ne peuvent pas partager la même valeur.                                                                                                    |
| `indexed`      | Booléen. Lorsqu'il vaut `true`, crée un index de base de données sur ce champ pour accélérer les requêtes.                                                                                      |
| `searchWeight` | Poids de pertinence pour la recherche plein texte PostgreSQL : `A` (le plus élevé) à `D` (le plus bas). Effectif uniquement lorsque `indexed: true` et que la source de données utilise la FTS. |
| `storage`      | Objet de configuration du stockage. `storage.compression` (booléen) active la compression pour les grandes valeurs de texte ou de pièce jointe.                                                 |

:::callout
**`default` est spécifique au type, et non une propriété de base.** La plupart des champs porteurs de valeur (texte, numérique, sélection, date, couleur, …) exposent un `default` dont le type de valeur correspond au champ. Les champs système (`created-at`, relationnels, calculés, IA) ne le font pas. Chaque page de type de champ indique si `default` est disponible.
:::

### Exemple : une table plus riche

```yaml
tables:
  - id: 2
    name: Products
    fields:
      - { id: 1, name: sku, type: single-line-text, required: true, unique: true }
      - {
          id: 2,
          name: title,
          type: single-line-text,
          required: true,
          searchWeight: A,
          indexed: true,
        }
      - { id: 3, name: description, type: long-text, searchWeight: B }
      - { id: 4, name: price, type: currency, required: true, currency: USD }
      - { id: 5, name: in_stock, type: checkbox, default: true }
    primaryKey: { type: auto-increment, field: id }
    indexes:
      - { name: idx_products_sku, fields: [sku], unique: true }
    permissions:
      read: all
      create: [admin, editor]
      update: [admin, editor]
      delete: [admin]
```

## Pages connexes

- [Aperçu des types de champs](/fr/docs/field-types-overview) — les 49 types de champs par catégorie.
- [Permissions](/fr/docs/table-permissions) — RBAC et contrôle d'accès par champ.
- [Index et contraintes](/fr/docs/table-indexes-constraints) — clés primaires, index, contraintes CHECK.
- [Relations](/fr/docs/table-relationships) — relier les tables entre elles.
- [Vues](/fr/docs/table-views) — filtres, tris et regroupements enregistrés.
- [Validation](/fr/docs/table-validation) — règles de validation au niveau du champ et de la table.
- [Webhooks](/fr/docs/table-webhooks) — HTTP sortant sur les événements d'enregistrement.
